作为网站管理员,我需要识别风险脚本.
我总是编写用于过滤用户输入的PHP代码.我永远不会相信用户输入,选择哪些字符有效(与不厌其一些),使用php本机过滤功能(filter_input)或使用lib/frameworks实用程序.
今天,我在下载模块中搜索安全漏洞,发现此代码:
if (isset($_GET['css_file_name'])) {
$cssFileName = _PS_MODULE_DIR_ . DS . "xxxx" . DS . "css" . DS . $_GET['css_file_name'] . ".css";
echo file_get_contents($cssFileName);
}
echo "";
Run Code Online (Sandbox Code Playgroud)
我认为这是不安全的,它不尊重基本规则永远不要相信用户输入.所以我决定证明它,我试图添加DEL ascii字符删除.css并能够找到任何文件(例如带有凭据的php文件)但我没有成功.
所以我的问题是:这段代码真的很不安全吗?有可能用它来获取一个php文件(你可以演示它吗?)
可能的攻击:该函数的空字节中毒file_get_contents可能会泄露或包含不正确文件的内容:
$ ls
file.php nullbyte.php
$ cat file.php
I am the contents.
$ cat nullbyte.php
<?php
$input = "file.php\0.jpg";
echo file_get_contents($input);
echo "\n";
?>
$ php nullbyte.php
I am the contents.
Run Code Online (Sandbox Code Playgroud)
此信息仅与旧版(不受支持)的 PHP 相关。
空字节中毒已在 PHP 5.3.4 中修复(它本身已经是一个旧的且不受支持的 PHP 版本):https://bugs.php.net/bug.php?id =39863 。
针对旧 PHP 版本的可能修复:
<?php
$clean = str_replace(chr(0), '', $input);
?>
Run Code Online (Sandbox Code Playgroud)
但是,攻击者能够在您的示例中列出整个文件系统的所有可能的 CSS 文件,从而有可能突破 Web 根目录。