我正在帮助我的朋友保护他的网站。他给了我源文件,我发现了一些东西,在我看来,这可能会导致许多问题,但像以前一样,我的朋友说这部分代码是安全的:
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
发布于 2013-05-05 16:46:26
避免使用这种结构。如果攻击者能够将自己PHP文件放到服务器上(甚至在WWW根目录之外,例如在tmp文件夹中),他就可以使用web服务器的权限执行该文件。
发布于 2013-05-05 16:58:44
如果该文件不存在,include无论如何都不会包含它。将is_file检查放在它之前是多余的,并且不会增加任何安全性。正如前面提到的,包含基于用户输入的任意文件始终是一个糟糕的想法和安全缺陷;无论您仔细检查文件是否存在,总是一个坏主意。
发布于 2013-05-05 16:58:51
is_file和include有一个可以prematurely end the string by using a null byte的漏洞。
因此,根据PHP版本的不同,包含以下内容的POST可能会打印出任意文件:
f=../../../../../etc/passwd%00只有从PHP 5.3.4开始,所有的文件系统函数才被认为是对空字节中毒免疫的。
https://stackoverflow.com/questions/16382735
复制相似问题