【创宇小课堂】渗透测试-WAF绕过通用思路

admin 2022年3月9日18:17:22评论68 views字数 3564阅读11分52秒阅读模式

概述:通用的方法,不仅限于 SQL 注入,就是万金油,无非就是大小写、双写、编码、注释、垃圾字符、分块传输、HPP、WAF 特性等

核心: 所有能改的地方,都捣鼓捣鼓改改,增加就加,能删就删,多拿点其他内容来混淆视听。

大小写

unIoN Select

双写

一些后端可能会直接给关键词过滤为空,那么就可以利用双写来绕过

ununionion ==> 去掉union ==> union

编码

  1. URL 编码
  2. Unicode 编码
  3. 十六进制编码
  4. 其他后端会解析的编码

注释

如 mysql 中的内联注释,可以用来代替空格

注释也可以和换行搭配使用,注释掉后面的内容,再通过换行逃逸到注释之外

test.php?id=1 /*!order*//**/%23A%0A/**/%23A%0A/*!by*//**/2

垃圾字符

一些 WAF 设置了过滤的数据包长度,如果数据包太大太长,为了考虑性能就会直接略过这个数据包

GET /foo?sqli=111...80万个1...111'+and+2*3=6+--+ HTTP/1.1
User-Agent: Mozilla/5.0
Host: Host
Accept: */*

分块传输

burp 插件:https://github.com/c0ny1/chunked-coding-converter.git

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

HTTP 协议绕过

HTTP 0.9

HTTP 0.9 协议只有 GET 方法,且没有 HEADER 信息等,WAF 就可能认不出这种的请求包,于是达到绕过 WAF 的效果

参数污染(HPP)

简单来说,存在多个同名参数的情况下,可能存在逻辑层和 WAF 层对参数的取值不同,即可能逻辑层使用的第一个参数,而 WAF 层使用的第二个参数,我们只需要第二个参数正常,在第一个参数插入 payload,这样组合起来就可以绕过 WAF,如下数据包:

GET /foo?par=first&par=last HTTP/1.1
User-Agent: Mozilla/5.0
Host: Host
Accept: */*

部分中间件的处理方法:

Web 环境 参数获取函数 获取到的参数
PHP/Apache $_GET("par") last
JSP/Tomcat Request.getParameter("par") first
Perl(CGI)/Apache Param("par") first
Python/Apache getvalue("par") ["first","last"]
ASP.NET/IIS Request.QueryString("par") first,last

Pipeline(keep-alive)

http 请求头部中有Connection这个字段,建立的 tcp 连接会根据此字段的值来判断是否断开,当发送的内容太大,超过一个 http 包容量,需要分多次发送时,值会变成keep-alive,即本次发起的 http 请求所建立的 tcp 连接不断开,直到所发送内容结束Connectionclose为止

我们可以手动将此值置为 keep-alive,然后在 http 请求报文中构造多个请求,将恶意代码隐藏在第 n 个请求中,从而绕过 waf

记得把 brupsuite 自动更新Content-Length的勾去掉

【创宇小课堂】渗透测试-WAF绕过通用思路
不自动更新CL

大概数据包就是这样

POST / HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.7113.93 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Upgrade-Insecure-Requests: 1
Connection: Keep-Alive
Content-Type: application/x-www-form-urlencoded
Content-Length: 3

a=1GET / HTTP/1.1
Host: www.baidu.com
User-Agent: Mozilla/5.0 (Windows NT 10.0) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.7113.93 Safari/537.36
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,*/*;q=0.8
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate
Upgrade-Insecure-Requests: 1
Connection: close


HTTP charset

利用Content-Type: xxx;charset=xxx编码绕过,payload 转义后,由于大部分的 WAF 默认用 UTF8 编码检测,所以能用此方法来达到绕过关键词过滤的效果

application/x-www-form-urlencoded; charset=ibm037
multipart/form-data; charset=ibm037, boundary=blah
multipart/form-data; boundary=blah ; charset=ibm037

WAF 特性

云 WAF 绕过

找到真实 IP,修改本地 hosts 文件或者直接在 burp 中指定解析,避免流量走到云 WAF 上即可。

【创宇小课堂】渗透测试-WAF绕过通用思路
burp绑定hosts

白名单绕过

一些 WAF 为了保证核心功能如登陆功能正常,会在内部设立一个文件白名单,或内容白名单,只要和这些文件或内容有关,无论怎么测试,都不会进行拦截。

如:WAF 设立了白名单/admin,那么我们的测试 payload 可以通过如下的手法来绕过

# 原来被拦截
http://a.a/?id=123 and 2*3=6
# 现在不拦截
http://a.a/?a=/admin&id=123 and 2*3=6

静态文件绕过

一些 WAF 为了减少服务器的压力,会对静态文件如.png.css等直接放行,那么我们可以尝试伪装成静态文件来绕过

如:

# 原来被拦截
http://a.a/?id=123 and 2*3=6
# 现在不拦截
http://a.a/?1.jpg&id=123 and 2*3=6

Content-Type 绕过

一些 WAF 识别到特定的 content-type 后,则会判定为该请求的类型,如:

发现Content-Typemultipart/form-data时,会认为这属于文件上传的请求,从而只检测文件上传漏洞,导致不拦截其他类型的 payload

请求方式绕过

  1. 一些 WAF 对于get请求和post请求的处理机制不一样,可能对 POST 请求稍加松懈,因此给GET请求变成POST请求有可能绕过拦截。
  2. 一些 WAF 检测到POST请求后,就不会对GET携带的参数进行过滤检测,因此导致被绕过。

解析兼容性

一些 WAF 检测时,完全按照标准的 HTTP 协议去匹配,但 WEB 容器会做一些兼容性适配,如上传时

filename="shell.php"

我们只需要稍加修改,那么按照标准协议去解析就找不到文件名,从而绕过拦截

filename="shell.php
filename='shell.php'
filename=shell.php

容器特性

可通过所有字符 fuzz 一遍,看看容器是如何处理的

IIS+ASP:

  1. %会被自动去掉
  2. unicode 会自动解码
<script> == <%s%cr%u0131pt>

tomcat:

路径穿越

/path1/path2/ == ;/path1;foo/path2;bar/;

参考

  • waf 绕过拍了拍你[1]

参考资料

[1]

waf绕过拍了拍你: https://www.anquanke.com/post/id/212272

【创宇小课堂】渗透测试-WAF绕过通用思路

原文始发于微信公众号(安全宇宙):【创宇小课堂】渗透测试-WAF绕过通用思路

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2022年3月9日18:17:22
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【创宇小课堂】渗透测试-WAF绕过通用思路http://cn-sec.com/archives/824196.html

发表评论

匿名网友 填写信息