渗透测试-WAF绕过通用思路
在渗透测试中,WAF(Web应用防火墙)是一种常见的安全防护手段,用于检测和阻止对Web应用的恶意攻击。然而,攻击者往往会尝试绕过WAF,以寻找和利用潜在的漏洞。以下是一些通用的WAF绕过思路:
一、大小写变换
- 原理:WAF通常基于关键字匹配来检测攻击行为,而大小写变换可以破坏WAF的匹配规则。
- 方法:将攻击载荷中的关键字进行大小写混合变换,如将SELECT变为sElEcT。
二、双写关键字
- 原理:一些WAF可能会将检测到的关键字过滤为空,双写关键字可以绕过这种过滤机制。
- 方法:将攻击载荷中的关键字重复书写,如将UNION变为UUNIONION,WAF在过滤掉一个UNION后,剩余的载荷仍然有效。
三、编码
- URL编码:将攻击载荷中的特殊字符进行URL编码,如将空格编码为%20。
- Unicode编码:将攻击载荷中的字符转换为Unicode编码形式,如将A转换为u0041。
- 十六进制编码:将攻击载荷中的字符转换为十六进制形式,并在前面加上%,如将A转换为%41。
- 其他编码:根据WAF的解析能力,选择其他可能被WAF忽略或错误解析的编码方式。
四、注释
- 内联注释:在SQL注入等场景中,使用内联注释(如MySQL中的/*...*/)来替换空格或其他被WAF过滤的字符。
- 换行与注释:通过换行和注释的组合,将WAF过滤掉的部分载荷隐藏在注释中,再通过换行逃逸到注释之外。
五、垃圾字符
- 原理:一些WAF设置了过滤的数据包长度限制,当数据包过大时,WAF为了性能考虑可能会直接略过该数据包。
- 方法:在攻击载荷中添加大量无意义的字符(如空格、换行符等),使数据包长度超过WAF的限制。
六、分块传输
- 原理:利用HTTP协议中的分块传输编码(Transfer-Encoding: chunked),将攻击载荷分成多个小块进行传输。
- 方法:使用Burp Suite等工具的插件,将POST请求的数据部分改为用一系列分块来传输,每个分块包含长度值和数据,最后以0表示结束。
七、HTTP协议绕过
- HTTP 0.9:使用只有GET方法且没有HEADER信息的HTTP 0.9协议,WAF可能无法识别这种请求包。
- 请求方式变换:将POST请求变换为PUT、DELETE等其他请求方式,WAF对不同请求方式的处理机制可能不同。
八、参数污染(HPP)
- 原理:在存在多个同名参数的情况下,逻辑层和WAF层可能对参数的取值不同。
- 方法:在第一个参数中插入攻击载荷,而在第二个参数中保持正常值,组合起来绕过WAF。
九、部分中间件的处理方法
- Pipeline(keep-alive):手动设置HTTP请求头部中的Connection字段为keep-alive,在HTTP请求报文中构造多个请求,将恶意代码隐藏在第n个请求中。
- HTTP charset:利用编码绕过WAF,将payload转义后,由于WAF默认用UTF8编码检测,因此可以用此方法绕过关键词过滤。
十、WAF特性
- 云WAF绕过:找到真实IP,修改本地hosts文件或直接在Burp Suite中指定解析,避免流量走到云WAF上。
- 白名单绕过:利用WAF设立的文件或内容白名单,将测试payload伪装成白名单中的内容来绕过WAF。
- 静态文件绕过:伪装成静态文件(如图片、CSS等)来绕过WAF的检测。
- Content-Type绕过:通过修改HTTP请求头中的Content-Type字段,使WAF误判请求类型,从而绕过检测。
十一、解析兼容性和容器特性
- 解析兼容性:利用WAF和WEB容器之间的解析差异,如上传文件时的文件名解析差异,来绕过WAF的检测。
- 容器特性:通过fuzz测试所有字符,了解容器对特定字符的处理方式,从而找到绕过WAF的方法。
示例图片
综上所述,WAF绕过的方法多种多样,需要根据具体的WAF类型、版本和配置进行针对性的尝试。在渗透测试中,应综合运用多种方法,以提高绕过WAF的成功率。同时,也应注意遵守法律法规和道德规范,不得进行非法攻击和破坏行为。