2013-05-05 59 views
0

我正在幫助我的朋友保護他的網站。他給我的源文件,我發現一些東西,在我看來,可能會引起很多問題,但是,和以前一樣,我的朋友說什麼這部分代碼是安全的:is_file()和本地文件包含漏洞

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()返回這種結構的虛假

+0

這是不可利用的,但爲什麼這個代碼甚至在這裏?什麼用例提示你加載這樣的PHP文件? – Blender 2013-05-05 08:30:24

+0

有一個if檢查'is_file',所以它不會拋出任何東西。他可以通過的唯一一件事是不包括該文件。 – 2013-05-05 08:31:52

+1

我認爲最好檢查'$ _POST ['f'];'因爲黑客可以使用它來包含來自不同位置的文件,如'foo'。'/ ../foo2'。'/ bar/foo。 php /'也可能是這個''foo'。'/ ../foo2/someFileWhichWillCauseProblem.php?'。'/ bar/foo.php''因爲包含''foo'。'/ ../foo2/someFileWhichWillCauseProblem.php'與一個額外的參數'?/ bar/foo.php'。這是危險的。所以它的強項建議你不要那樣做。 – ncm 2013-05-05 08:35:08

回答

2

避免使用。如果攻擊者能夠將自己的PHP文件放在服務器上(甚至在WWW根目錄之外,例如在tmp文件夾中),他將能夠使用Web服務器的權限執行它。

+0

謝謝,所以你認爲有人可以繞過is_file()檢查,對不對? – John 2013-05-05 08:47:40

+0

是的,除了@Nickolay Olshevsky我應該說像上傳一個帶有害代碼的文件作爲圖像(帶有.jpg,.png等擴展名) – ncm 2013-05-05 08:48:51

+0

是的,如果他能夠把他的文件放在服務器上。這很容易編寫switch()或一堆if來選擇需要的文件之一。 – 2013-05-05 09:13:28

2

如果文件不存在,include不會包含它。進行is_file檢查之前,它是多餘的,不會增加任何安全性。如上所述,包括基於用戶輸入的任意文件是總是一個壞主意和安全漏洞;是否重複檢查文件是否存在。

2

is_fileinclude有一個缺陷,其中有可能prematurely end the string by using a null byte

所以取決於PHP的版本,具有如下所示的POST可以打印出任意文件:

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

只有自PHP 5.3.4,據說所有的文件系統功能是免疫爲null字節中毒。

+0

也可以利用Windows的替代數據流:通過'foo:bar','foo'被數據流名稱'bar'引用。所以'f = ../../../../../boot.ini:'也可以。 – Gumbo 2013-05-05 09:13:47

1

我的朋友說什麼這部分代碼是安全

如果你的朋友是權威機構 - 和有你問這裏的問題是方式就像他是聽起來有點 - 你最好聽他並遵循他的道路 - 對或錯。這就是朋友的所爲:我們允許彼此有錯誤。

除此之外,在$_POST['f']中爲允許的值創建白名單以結束任何討論。這樣做需要您制定出符合這裏有效路徑的確切規格,而不是什麼。

當您不清楚要保護的內容時,您無法將證據帶入證據。