在左下方的窗格中,你可以看到对这个网站(test1.unicresit.it)进行远程命令执行测试。正如你所看到的,Sucuri WAF 以 An attempted RFI/LFI was detected and blocked 理由阻止请求。
右窗格显示了同样的请求,但却使用 ? 作为通配符,结果是 Sucuri WAF 没有阻止这个请求,应用程序执行了放入 c 参数的命令。现在就可以读取 /etc/passwd 文件,甚至更多。
我可以读取应用程序本身的 PHP 源代码,可以使用 netcat(/???/?c)执行反弹 shell,或者我可以执行 curl 或 wget 来获取网络服务器的真实 IP,使我能够通过直接连接目标来绕过 WAF。
ModSecurity OWASP CRS 3.0
以下文档很好地概述了每个级别在 REQUEST PROTOCOL ENFORCEMENT 规则上的工作原理。 PL1允许的查询字符串包含 1-255 范围内的 ASCII 码,从PL1到PL4,允许的 ASCII 码越来越少。
http://www.iyuji.cn/iyuji/s/UDY2Y2lWOW9VV2dkcmh0a25XbjRldz09/1592068861266248Paranoia Level 0 (PL0)
PL0 开启的防护规则较少,我们的代码能够正常执行。
http://www.iyuji.cn/iyuji/s/UDY2Y2lWOW9VV2dkcmh0a25XbjRldz09/1592068891225346Paranoia Level 1 and 2 (PL1, PL2)
PL1 和PL2 都会拦截原始的请求,但是如果使用 ? 作为通配符,该请求不会被WAF 拦截。
http://www.iyuji.cn/iyuji/s/UDY2Y2lWOW9VV2dkcmh0a25XbjRldz09/1592068916497978之所以发生这种情况,是因为 ? ,/ 和空格在规则 920271 和 920272 的可接受字符范围内。此外,使用 ? 能够避开系统文件过滤规则,拦截对操作系统常用命令和文件的访问。
Paranoia Level 3 (PL3)
PL3可以阻止包含 ? 等字符超过 n 次的请求。实际上,我的请求被拦截为: Meta-Character Anomaly Detection Alert — Repetitive Non-Word Characters。
但是作为测试用的 Web 应用程序非常蹩脚,容易受到攻击,所以我可以使用较少的 ?,并使用以下语法读取 passwd 文件:c=/?in/cat+/et?/passw?
正如你所看到的,只用 3 个 ?,我就可以避开 PL3 级别的防护,读取目标系统中的 passwd 文件。
Paranoia Level 4 (PL4)
PL4 级别的防护基本无法绕过,a-z A-Z 0–9 之外的字符都被屏蔽了。当你需要执行一个命令来读取文件时,有 90% 的概率需要一个空格字符或 /。
结论
使用一些不常用的bash命令的技巧,还是可以绕过WAF的防护的。