前言:指令執行和代碼執行也是web安全中常見的一種漏洞,這次就先來學習一下指令執行漏洞。
Command Execution
一、簡介
由于開發人員在編寫源代碼時,沒有對源代碼中可執行的特殊函數入口做過濾,導緻用戶端可以送出一些cmd指令,并交由伺服器程式執行。導緻攻擊者可以通過浏覽器或者其他用戶端軟體送出一些cmd指令(或者bash指令)至伺服器程式,伺服器程式通過system、eval、exec等函數直接或者間接地調用cmd.exe執行攻擊者送出的指令。
二、常用的連接配接符
A;B 先執行A,再執行B
A&B 簡單拼接,A B之間無制約關系
A|B 顯示B的執行結果
A&&B A執行成功,然後才會執行B
A||B A執行失敗,然後才會執行B
三、常用的函數
exec() — 執行一個外部程式
#exec 不會主動傳回執行結果,且隻是傳回結果的最後一行;
passthru() — 執行外部程式并且顯示原始輸出
#passthru()用來執行外部指令,但直接将結果輸出到浏覽器(未經任何處理的 原始輸出),沒有傳回值;
system() — 執行外部程式,并且顯示輸出
#system()成功則傳回指令輸出的最後一行,失敗則傳回 FALSE;
shell_exec() — 通過 shell 環境執行指令,并且将完整的輸出以字元串的方式傳回。
#當程序執行過程中發生錯誤,或者程序不産生輸出的情況下,都會傳回 NULL
eval():将輸入的字元串參數當做PHP程式代碼來執行
具體可以參考php中文網
四、windows net指令
Net ViewI
作用:顯示域清單、計算機清單或指定計算機的共享資源清單。
Net User
作用:添加或更改使用者帳号或顯示使用者帳号資訊。
Net Use
作用:連接配接計算機或斷開計算機與共享資源的連接配接,或顯示計算機的連接配接資訊。
Net Time
作用:使計算機的時鐘與另一台計算機或域的時間同步。
Net Config
作用:顯示目前運作的可配置服務,或顯示并更改某項服務的設定。
具體可以參考大師傅的部落格CMD-NET指令詳解這個漏洞是真的恐怖,可以任意修改你的計算機裡的内容。
在了解了基礎的知識後,下面就通過DVWA來練習一下Command Execution.
DVWA——Command Injection
在此之前先來解決亂碼的問題
在
DVWA\dvwa\includes
目錄下找到
dvwaPage.inc.php
檔案中所有的”
charset=utf-8
”,修改”
charset=gb2312
”,即可解決亂碼問題。

low
觀察源碼
stristr() 函數搜尋字元串在另一字元串中的第一次出現,不區分大小寫
php_uname() 傳回了運作 PHP 的作業系統的描述。
參數:
'a':此為預設。
's':作業系統名稱。
'n':主機名。
'r':版本名稱。
'v':版本資訊。
'm':機器類型。
通過源碼可以看出,源碼隻是針對不同的作業系統執行不同的
ping指令
而已,沒有對
ip參數
并未做任何的過濾,是以存在指令注入漏洞。
輸入
127.0.0.1&&echo "Hello"
回顯結果執行了我輸入的
echo "Hello"
指令
接下來輸入
127.0.0.1&&net user
指令執行成功,但這個漏洞是真的恐怖,如果攻擊者利用這個漏洞修改電腦使用者、更改系統配置。。。,可見危害之大。
medium
發現這段代碼
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
#array_keys() 函數傳回包含數組中所有鍵名的一個新數組。
過濾了
&&
、
;
,但是沒有過濾掉
&
|
,是以依舊有漏洞存在
127.0.0.1 | net user
也可以輸入
127.0.0.1& net user
一樣會執行成功
除此之外,也可以采用拼接的方法進行繞過
127.0.0.1&;&net user
High
這次過濾的更狠,幾乎過濾了所有的常用連接配接符,拼接的方法也是不起作用的,但是觀察代碼發現
|+空格
多出一個空格,是以不會過濾
|
那就利用這個漏洞進行指令執行
127.0.0.1 |net user
impossible
stripslashes(string)
#stripslashes函數會删除字元串string中的反斜杠,傳回已剝離反斜杠的字元串。
explode(separator,string,limit)
#explode()函數把字元串打散為數組,傳回字元串的數組。參數separator規定在哪裡分割字元串,參數string是要分割的字元串,可選參數limit規定所傳回的數組元素的數目
is_numeric(string)
#is_numeric()函數檢測string是否為數字或數字字元串,如果是傳回TRUE,否則傳回FALSE。
Impossible級别的代碼加入了
Anti-CSRF token
,同時對
參數ip
進行了嚴格的限制,隻有“
數字.數字.數字.數字
”的輸入才會被接收執行,是以不存在指令注入漏洞。
總結:通過這次學校了解了指令執行漏洞的一些知識,确實很有意思,接下來學習代碼執行漏洞。
參考部落格:
Command Injection
Web安全 - 指令執行漏洞