2

假设 example.com 有一个带有这个 HTML 的前端:

<form action='this.php' method='post'>
<input type='hidden' value='test' name='post'>
<input type='submit' value='Test'>
</form>

this.php 包含以下内容:

if (isset($_POST['post'])) {
include 'test_' . $_POST['post'] . ".php";
}

使用上述设置,如果字符串“test_”附加到它的开头,那么某人将如何执行恶意包含或尝试任何类型的目录遍历?

如果他们输入 /../../,include 会将其读取为 'test_/../../',如果他们使用 url,include 会失败,则 include 会得到 'test_http://evil.com/badcode。 php' 并再次失败。

有人将如何绕过正在进行的字符串来执行远程包含或更改其目录?

旁注:我确实知道如何对字符串进行消毒,以及完全避免这种情况的其他安全步骤。这只是出于好奇,从我现在所知道的情况来看,我认为这是不可能的。

4

3 回答 3

2

这不是一个真正的好习惯,永远记住,永远不要相信用户输入!

牢记这一点,您永远不应该将用户输入传递给include语言结构。

从您的代码中可以清楚地看出,目录遍历会导致404. 但是,可能有一些聪明的邪恶极客可以绕过并执行RFI攻击。

所以更好的建议是..Don't send user input directly to an include() construct.

于 2013-09-15T04:58:42.263 回答
0

文件流通常以两种方式之一被滥用。LFI 和 RFI(分别为本地文件包含/远程文件包含)或通常为 MFI(恶意文件包含)。通常它用于传输本地文件,例如 /etc/passwd 或日志文件。

RFI 更加危险,如果启用了 allow_url_fopen 则有可能。这允许黑客将远程文件包含到您的环境中。在上面的示例中,它与空字节注入结合使用以忽略连接。

有很多方法可以操作字符串来做各种事情,例如包括 php://input 或 php://filter

于 2013-09-15T05:03:15.377 回答
0

如果他们输入 /../../,include 会将其读作“test_/../../”,然后失败 […]

这实际上仅适用于基于 Unix 的系统,但适用于 Windows,因为它仅在给定路径上而不是在实际文件系统结构上进行路径解析。只要已解析的路径存在,Windows 就不关心是否存在未解析的路径段之一。

此外,直到某些 PHP 版本,并非所有二进制安全和空字节可以结束字符串和剩余字节的文件系统函数都被省略。

总而言之,根据操作系统和 PHP 版本,您的脚本可能会被利用以下模式包含任意文件:

post=/../../../../windows/win.ini%00
于 2013-09-15T06:50:58.433 回答