我正在测试我们的一个PHP Web应用程序中的安全性问题。
运行代码的系统至少需要PHP7.2才能运行。
现在,我在代码中找到了类似以下内容(对此问题进行了简化,但归结为此):
$file = $_GET['file'];
$path = "/some/directory/" . $file;
$path = str_replace(['../', '..'], '', $path);
echo file_get_contents($path);
是否可以通过可以逃避/some/directory
的方式来修改文件参数,以便在str_replace()
之后的file_get_contents()
调用看起来像:file_get_contents(/some/directory/../../etc/passwd)
?
编辑:
我无法更改代码执行的顺序。我只能在请求中定义$_GET['file']
的值。
此外,我知道如何使其更安全,但出于研究目的,我打算打破它。
基本上,需要做的是以某种方式欺骗str_replace()
并留下一些../
。
我用各种方法尝试了几个小时,但是-幸运的是,对于我们的应用程序-它无法正常工作。
你有什么想法?
您可以在此处随意修改代码:https://3v4l.org/3ehYA