我想知道這個小片段是否受到本地文件注入漏洞的影響。這個腳本容易受到LFI(本地文件注入)的影響嗎?
<?php
$lang = $_GET['lang'];
include '/some/dir/prefix_'.$lang.'whatever';
我知道任何可以通過在請求中放入'%00'(空字節)而被忽略。但是,如果/ some/dir /目錄中沒有以'prefix_'開頭的子目錄,漏洞是否會發生?怎麼樣?
在此先感謝anwser。
我想知道這個小片段是否受到本地文件注入漏洞的影響。這個腳本容易受到LFI(本地文件注入)的影響嗎?
<?php
$lang = $_GET['lang'];
include '/some/dir/prefix_'.$lang.'whatever';
我知道任何可以通過在請求中放入'%00'(空字節)而被忽略。但是,如果/ some/dir /目錄中沒有以'prefix_'開頭的子目錄,漏洞是否會發生?怎麼樣?
在此先感謝anwser。
你的意思是這樣的嗎?
$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
}
此測試避免這種情況,如果路徑存在,如果它真的下的目錄樹,你允許它。它應該是足夠的。
好了,你可以白名單這一塊,像
$possible_languages = array('en','fr','pt'); #preferably not hardcoded
$lang = $_GET['lang']
if(in_array($lang, $possible_languages)){
# do your thing
}
else {
#error out
}
基本上...從來沒有信任用戶輸入。
與上述相同的評論(對gnur的評論)。 – Savageman 2011-05-18 09:49:34
是的,我的意思是像這樣的東西。但不是這樣。目錄/ some/dir/prefix_xy /不存在。文件系統如何解析/some/dir/prefix_xy/../ to/some/dir /? – Savageman 2011-05-18 08:59:26
這是一個例子。也許有人使用'en'而不是'xy'(我在答案中改變了它)。現在'prefix_en'存在,'..'再次正常工作。不管怎麼說,你都不能相信它) – KingCrunch 2011-05-18 09:01:44
我引用自己:「/ some/dir /目錄中沒有以'prefix_'開頭的子目錄」。所以沒有/ some/dir/prefix_en /目錄。 「無論」指向一個文件。 – Savageman 2011-05-18 09:02:53