0

我正在帮助我的朋友保护他的网站。他给了我源文件,我发现了一些在我看来可能会导致很多问题的东西,但是和以前一样,我的朋友说这部分代码是安全的:

if(is_file('foo/' . $_POST['f'] . '/bar/foo.php'))
  {
    include('foo/' . $_POST['f'] . '/bar/foo.php');
  }

我已经向他展示了我可以绕过include()函数,但他说,is_file()这部分代码是 100% 安全的,请帮我向他展示代码不安全,或者让我相信这段代码是安全的。

此代码绕过include()功能(WINDOWS):

curl_setopt($ch, CURLOPT_POSTFIELDS, 'f=../foo/bar.php' . str_repeat('.', 4086)); // without is_file() check this request leads to LFI

is_file()仍然返回 false

4

4 回答 4

2

如果该文件不存在,include则无论如何都不会包含它。is_file在它是多余的并且不会增加任何安全性之前进行检查。如前所述,包含基于用户输入的任意文件总是一个坏主意和安全漏洞;是否仔细检查文件是否存在。

于 2013-05-05T08:58:43.803 回答
2

is_file并且include有一个缺陷,可以通过使用空字节来过早地结束字符串

因此,根据 PHP 版本,具有以下内容的 POST 可能会打印出任意文件:

f=../../../../../etc/passwd%00

只有从 PHP 5.3.4 开始,所有文件系统函数才被认为对空字节中毒免疫。

于 2013-05-05T08:58:50.763 回答
2

避免使用这种结构。如果攻击者能够将自己的 PHP 文件放在服务器上(甚至在 WWW 根目录之外,例如,在 tmp 文件夹中),他将能够以 Web 服务器的权限执行它。

于 2013-05-05T08:46:26.040 回答
1

我的朋友说这部分代码是安全的

如果你的朋友是权威——让你在这里问这个问题听起来有点像他——你最好听他的,按照他的路走——对还是错。这就是朋友的目的:我们允许彼此犯错。

除此之外,为允许的值创建一个白名单$_POST['f']以结束任何讨论。这样做将要求您制定准确的规范,什么是有效路径,什么不是。

当不清楚你想要保护什么时,你就不能为争论带来安全感。

于 2013-05-05T10:38:49.427 回答