2011-05-18 59 views
3

我想知道這個小片段是否受到本地文件注入漏洞的影響。這個腳本容易受到LFI(本地文件注入)的影響嗎?

<?php 
$lang = $_GET['lang']; 
include '/some/dir/prefix_'.$lang.'whatever'; 

我知道任何可以通過在請求中放入'%00'(空字節)而被忽略。但是,如果/ some/dir /目錄中沒有以'prefix_'開頭的子目錄,漏洞是否會發生?怎麼樣?

在此先感謝anwser。

回答

3

你的意思是這樣的嗎?

$lang .= 'en/../../../../../etc/passwd' . 0x00; 

您可以通過

$path = '/some/dir/prefix_'.$_GET['path'].'whatever'; 
$path = realpath($path); 
if (($path !== false) && (strncmp('/dir/some/prefix_', $path, 17) === 0)) { 
    // $path is fine 
} 

此測試避免這種情況,如果路徑存在,如果它真的下的目錄樹,你允許它。它應該是足夠的。

+0

是的,我的意思是像這樣的東西。但不是這樣。目錄/ some/dir/prefix_xy /不存在。文件系統如何解析/some/dir/prefix_xy/../ to/some/dir /? – Savageman 2011-05-18 08:59:26

+0

這是一個例子。也許有人使用'en'而不是'xy'(我在答案中改變了它)。現在'prefix_en'存在,'..'再次正常工作。不管怎麼說,你都不能相信它) – KingCrunch 2011-05-18 09:01:44

+0

我引用自己:「/ some/dir /目錄中沒有以'prefix_'開頭的子目錄」。所以沒有/ some/dir/prefix_en /目錄。 「無論」指向一個文件。 – Savageman 2011-05-18 09:02:53

2

直接在您的代碼中使用用戶輸入始終是危險的。
最好是讓它檢查值是否在可接受值的數組中。

+0

我知道,這不能回答我的問題,甚至不能遠程回答。 – Savageman 2011-05-18 09:00:13

+0

這個答案應該被接受。如果你不知道如何使用漏洞利用,這並不意味着漏洞無法使用。規則很簡單:不要相信用戶的輸入。沒有任何例外。 – 2011-05-18 09:39:43

+0

我知道。我沒有使用這個代碼,我試圖學習和理解。我很好奇。 這不是我期待的答案。 – Savageman 2011-05-18 09:49:02

1

好了,你可以白名單這一塊,像

$possible_languages = array('en','fr','pt'); #preferably not hardcoded 
$lang = $_GET['lang'] 
if(in_array($lang, $possible_languages)){ 
    # do your thing 
} 
else { 
    #error out 
} 

基本上...從來沒有信任用戶輸入。

+0

與上述相同的評論(對gnur的評論)。 – Savageman 2011-05-18 09:49:34

相關問題