sqli-labs(23-28a关)
第二十三关(Less-23):
1.输入id=1,进行测试,可以看到我们的登陆名字和密码
2.加上单引号,看是否存在报错。存在报错,说明可能存在注入信息
3.使用注释符进行注释,发现注释符没有将单引号注释掉。说明此时无法进行闭合
4.查看源码,发现将我们输入的--+均替换成了空格符号,所以我们输入--+、#进行注释是无效的。所以这里我们只能使用and或or语句进行闭合
5.也可以采用一种特殊的注释符,针对于sql-labs特殊使用的注释符;%00。发现返回数据正常
6.接下来使用order by语句对列数进行判断。经过判断,为三列
7.再使用联合查询注入。将id值改为一个不存在的值。回显位置为2,3
8.查询库名。
9.查表名(以security为例)
10.查字段(以users为例)
11.查字段users中的password和user的值
知识点:
二次注入:攻击者构造的恶意数据存储在数据库后,恶意数据被读取并进入到SQL查询语句所导致的注入。防御者可能在用户输入恶意数据时对其中的特殊字符进行了转义处理,但在恶意数据插入到数据库时被处理的数据又被还原并存储在数据库中,当Web程序调用存储在数据库中的恶意数据并执行SQL查询时,就发生了SQL二次注入。
二次注入,可以概括为以下两步:
-
第一步:插入恶意数据
进行数据库插入数据时,对其中的特殊字符进行了转义处理,在写入数据库的时候又保留了原来的数据。 -
第二步:引用恶意数据
开发者默认存入数据库的数据都是安全的,在进行查询时,直接从数据库中取出恶意数据,没有进行进一步的检验的处理。
第二十四关(Less-24):
1.在本关中,对数据库的长度进行了限制,故只进行密码的修改
2.首先使用正确的用户名admin,密码admin进行登录。显示用户名admin
3.重新创建用户名admin',并使用#进行注释。注册成功。再使用注册的账号进行登录
4.接下来修改admin'用户的密码,将密码123456更改为147258.显示密码重置成功
5.进行登录,用户名为admin,密码为147258.发现登陆成功并将原来的密码进行了修改
知识点:
SQL注入WAF绕过:
WAF绕过可大致分为三类:白盒绕过、黑盒绕过、fuzz测试
白盒绕过:通过源代码分析,来进行绕过
黑盒绕过:(1)架构层面绕过waf:寻找源网站绕过waf检测(主要针对的是云waf,找到源网站的真是地址,进行绕过,有点像CDN)
通过同网段绕过waf防护(在一个网段中,可能经过的数据不会经过云waf,从而实现绕过)
(2)资源限制角度绕过waf:一般waf的执行需要优先考虑业务优先原则,所以对于构造较大、超大数据包可能不会进行检测,从而实现绕过waf
(3)协议层面绕过waf:协议未覆盖绕过waf:比如由于业务需要,只对get型进行检测,post数据选择忽略
参数污染:index?id=1&id=2,waf可能只对id=1进行检测
(4)规则层面的绕过:sql注释符绕过、空白符绕过、函数分隔符号、浮点数法、利用error-based进行sql注入、mysql的特殊语法、大小写绕过(如果对关键 字and or union等进行了过滤,可以考虑使用大小写混合的方法)、关键字重复(OORr→or)、关键字替换
fuzz测试:可以使用burpsuite配合配合手工进行测试。后期测试成功后再用脚本进行处理
第二十五关(Less-25):
1.输入id=1进行测试
2.再加上单引号进行测试,出现报错
3.再次加上注释符--+进行测试,进行闭合
4.使用order by查询列数。报错,我们发现我们输入的order是剩下der
5.查看源码,发现将or、and不区分大小写替换为空
6.使用双写进行测试。成功,所以我们用双写的方法进行绕过
7.使用union select查看回显位置
8.我们查看源代码得知,会对or进行过滤,所以使用双写进行注入
9.注意本关中对or和and的过滤,采用双写的方法。其余操作与之前的操作相同
Less-25a:
1.输入id=1,执行
2.查看源码,我们发现id处没有进行包裹;还发现本关也对or、and进行了替换
3.使用双写的方式进行绕过。查询列数,有三列
4.使用联合查询语句,判断回显位置为2,3
5.接下来进行注入,得到库
6.其余得到表,字段,字段值操作均相同,参考之前关卡的操作即可。
Less-26:
1.输入id=1,执行
2.加上单引号,出现报错,说明可能存在注入漏洞
3.将注释符换位;%00,执行,发现执行成功,说明可能是将注释符进行了转义
4.查看源码,我们发现它将一些字符都进行了替换
5.使用updatexml进行报错注入,得到了当前数据库。注意本关将空格也进行了替换
Less-26a:
less26a的闭合方式为(‘’),同样他也是过滤了很多东西,空格,or,and,注释符,我们可以用sql直接爆出他的库?id=100')%0bunion%0bselect%0b1,database(),3%0b||('1')=('1
Less-27:
less27在之前关卡的基础上过滤了union和select 我们可以使用重复写的方式,就是在union里边再写一个union,由于他的select过滤了两次,所以,我们需要重复写两次select? id=1'|| (seseselectlectlect%a0 updatexml(1,concat(0x7e,version()),1)) || '
Less-27a:
使用""包裹
Less-28:
闭合方式为('')
Less-28a:
闭合方式和28关一样