2016-07-27 61 views
6

作爲網站管理員,我需要識別有風險的腳本。

我總是編寫過濾用戶輸入的php代碼。我永遠不要相信用戶輸入,選擇哪些字符是有效的(vs不考慮某些字符),使用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 ""; 

我認爲這是不安全的,它不尊重基本規則永遠不要相信用戶的輸入。 所以我決定證明這一點,我試圖添加刪除ASCII字符來刪除.css,並能夠找到任何文件(例如憑證的PHP文件),但我沒有成功。

所以我的問題是:這段代碼真的很不安全嗎?是否有可能抓住它的PHP文件(你能證明嗎?)

+0

如果我們不能拿出一個漏洞是安全的嗎?你的問題很有趣,但安全更多是一種思考方式,而你自己也懷疑這是否安全。這是一個明顯的跡象,在這種情況下,白名單將是適當的,因爲很難證明它是安全的。 – martinstoeckli

回答

1

可能的攻擊:功能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. 

這信息僅與舊版(不支持的)版本的PHP相關。

空字節中毒已在PHP 5.3.4中修復(它本身已經是一箇舊的且不受支持的PHP版本):https://bugs.php.net/bug.php?id=39863

對於老版本PHP可能的解決辦法:

<?php 
    $clean = str_replace(chr(0), '', $input); 
?> 

然而,攻擊者能夠列出你的榜樣整個文件系統的所有可能的CSS文件,有可能打出來的Web根目錄。

相關問題