2010-01-29 108 views

回答

3

是的。對於初學者,如果不進行某種驗證,您永遠不應該直接使用GET變量,有史以來

此外,您不應該允許任意指定要包含的路徑。

相反,如果您絕對需要那麼多動態性,您應該直接限制包含某個特定路徑的路徑(並檢查指定的路徑是否指向該目錄中的某個文件),或者應該傳遞引用的標記到你想要包含的東西(然後做一些類似於查看關聯數組的東西來查看給定令牌引用的文件)。

後者的一個例子是這樣的:

$allowed_pages = array(
    "page1" => "pages/page1.php", 
    "page2" => "pages/page2.php", 
    "foobar" => "pages/page7.php", 
    "stuff" => "pages/blarg.php" 
); 

$page = $_GET['page']; 
if(array_key_exists($allowed_pages, $page)) { 
    include($allowed_pages[$page]); 
} 

(。在這種情況下,只有指定的鍵被允許同時充當驗證和限制對可被包括什麼的事實)

+1

更多的例子:http://ha.ckers.org/blog/20100128/micro-php-lfi-backdoor/的評論有很多的東西太多。 – Arkh 2010-01-29 13:10:59

1

這是冒險的,因爲在$_GET["page"]可以是一個你不需要的路徑 - 例如../../settings.php在別的東西上。

它應該做的事,如:

$allowedPages = array('news', 'contact', ...); 
if (in_array($_GET["page"], $allowedPages)) { 
    include "pages/".$_GET["page"].".php"; 
} else { 
    throw new Exception('Page is not valid !'); 
} 

好東西也是要檢查文件是否存在。

1

你基本上可以讓他們執行系統中存在的任何一塊PHP。這是一個很大的未知數。

基本上,這是有風險的,因爲即使沒有「危險的」代碼指向現在,也可能在將來。

+3

他們可以讀取任何文件,因爲包含在php中不必包含php代碼。如果沒有,那麼php只會將文件的內容轉儲到那裏。 – SoapBox 2010-01-29 11:59:04

+0

絕對應該注意到這一點! – cgp 2010-01-29 12:56:07

1

除了具有白名單,你可以做這樣的事情

$include = $_GET['page']; 

if (! preg_match('/^[a-z-_]+$/i', $include)) { 
    throw new Exception('Access denied'); 
} 
1

包括 「網頁/".$_ GET [」 頁 「] PHP」。「。

你已經硬編碼的前綴,以防出現類似的攻擊:?

頁= HTTP%3A%2F%2Fwww.blackhat.com%2Fbad.code%3F

但因爲$ _GET ['page']可能包含'..',那麼有人可以強制從您的系統中包含任何文件和php擴展名。你確信這永遠不會導致安全妥協?

按照其他人的建議使用白名單更安全,同時也避免了在路徑前添加要求以避免遠程包含漏洞的需求。

C.關於如何利用這樣的事情在這裏