引自免费微信小程序:皆我百晓生
要解决这个PHP代码审计的问题,我们需要理解代码的工作原理并找到可以利用的漏洞。这段代码的主要功能是检查一个名为'a'的POST参数是否匹配正则表达式/[0-9]/,然后执行一些操作。如果匹配成功,它会替换S_GET['a']、S_GET['b']和S_GET['c']之间的字符串,并输出结果。否则,返回提示信息。
目标是获取服务器上的根目录下的flag文件。我们可以通过构造特殊的请求来达到目的。具体来说,我们可以利用preg_replace()函数中的路径遍历漏洞。在PHP中,如果你尝试访问文件系统中的文件,而文件名包含特殊字符(如.或..),可能会允许你访问到上级目录。
首先,我们需要确保POST参数'a'通过正则表达式检查。这可以通过提供任何包含数字的值来实现。接下来,我们将利用S_GET['c']变量来构建一个指向根目录下flag文件的路径。我们可以在S_GET['a']和S_GET['b']中插入特殊字符来实现这一点。
构造的payload示例如下:
// 假设URL为 http://example.com/ctf.php
// POST 数据
{
"a": ".%2e/%2e/%2e", // 注意这里使用了URL编码,实际发送时应为 "./../"
"b": "",
"c": "/flag"
}
解释一下这个payload:
a参数:.%2e/%2e/%2eURL解码后为./../,用于遍历到上一级目录。b参数:留空,用于替换操作,实际上并不重要。c参数:/flag,这是我们要读取的文件路径,从当前目录向上查找直到根目录。
当此payload被提交给服务器,preg_replace() 函数将尝试替换 S_GET['a'] 和 S_GET['b'] 之间的内容,但由于 S_GET['a'] 是一个路径,它会被解析为文件路径的一部分。因此,最终会尝试打开并读取 /flag 文件,从而暴露根目录下的 flag 文件内容。
请注意,这只是一个可能的解决方案,具体的实现可能会因服务器环境的不同而有所差异。在真实环境中进行渗透测试之前,请确保你有权限这样做,并遵守所有适用的法律和道德规定。

