前言:此次學習命令執行漏洞,記錄一下。
命令執行漏洞原理
定義:Web應用程序接收用戶輸入,拼接到要執行的系統命令中執行
產生原因:
1.用戶輸入未過濾或淨化
過濾:用戶輸入某個關鍵字時,命令不能執行,則是被過濾掉了。
淨化:用戶輸入一些敏感內容時,這些內容會被消除掉,但是命令會繼續執行。
2.拼接到系統命令中執行。
和SQL注入漏洞原理類似(差別還是挺大的,只是這一點比較相似)。
PHP下命令執行函數
在PHP中具有執行系統命令功能的函數如下(部分):
1.system
2.exec
3.shell_exec
4.passthru
5.popen
6.proc_popen
某些情況下,要注意存在以上函數的php文件,有可能是webshell
漏洞演示:
栗子:
<?php
echo "please input get args cmd!";
echo "<pre>"; //格式化頁面
if(isset($_GET["cmd"])){
system($_GET["cmd"]);
}
echo "</pre>"; //是頁面更加直觀,起換行作用。去掉的話,顯示信息不會換行。下面做對比。
?>
windows使用phpstudy集成環境,在網站根目錄下建立一個cmd1.php
(自定義)。複製上面的代碼,保存。訪問cmd1.php
,可以看到下面的頁面。
輸入命令:?cmd=ipconfig
可以執行。
現在修改一下代碼,看看<pre>
的作用是什麼
刷新查看。
可以看到比較亂。
查看源碼:
所以可以看出來<pre>
的作用了。
在URL前面加個view-source:也可以的。
windows系統命令執行漏洞
命令執行示例代碼分析
使用以下PHP代碼,對指定目標執行ping命令
<?php
echo "<pre>"; //格式化輸出
$arg = $_GET['cmd']; //GET方式執行命令
if($arg){
system("ping $arg");
}
echo "</pre>";
?>
命令執行漏洞利用思路
代碼中拼接用戶的輸入並代碼system函數執行,但是無法直接執行用戶的自定義命令。
思路:截斷輸入,重新拼接。兩條命令都輸入並執行。
windows系統下命令執行漏洞拼接符介紹
在windows系統下的cmd命令中,有以下一些截斷拼接符。
& 前面的語句爲假則直接執行後面的
&& 前面的語句爲假則直接出錯,後面的也不執行
| 直接執行後面的語句
|| 前面執行出錯執行後面的語句
栗子:
打開cmd
ping www.baidu.com
ping 111 & ipconfig
ping 127.0.0.1 && ipconfig
ping 127.0.0.1 | ipconfig
ping 111 || ipconfig
還有幾個命令就不放圖了,可以嘗試一下。
Linux系統命令執行漏洞
<?php
echo "<pre>";
$arg = $_GET['cmd'];
if($arg){
system("ping -c 4 $arg"); //ping 4次
}
echo "</pre>";
?>
-c 4 就是ping4次,windows默認執行4次,而linux默認執行無數次。
kali linux
測試環境搭建
1.啓動apache服務,service apache2 start
2.拷貝代碼到 /var/www/html/目錄下的一個文件中。
使用vim命令進行編輯。
編輯完成輸入:wq!
保存並退出。
輸入ifconfig查看IP地址。
linux系統命令執行漏洞拼接符介紹
在linux系統下的shell命令下,有以下一些截斷拼接符
; (英文輸入)前面的執行完,執行後面的。
| 是管道符,顯示後面的執行結果。
|| 當前面的執行出錯時執行後面的。
& 無論前面語句真假都會執行。
&& 只有前面的語句爲真,纔會執行後邊的語句。
在kali中實驗,與windows系統中步驟無太大差別。
仍然可以。
自動化工具介紹
commix
Commix是一個使用python開發的漏洞測試工具,這個工具是爲了方便的檢測一個請求是否存在命令注入漏洞,並對其進行測試,在其作者發佈的最新版本中支持直接導入burp的歷史記錄進行檢測,大大提高了易用性。
項目地址: github項目傳送門
安裝不介紹。kali自帶有。也可以使用git命令克隆到windows系統,需要python環境。
中途出了點毛病,kali裏的好久沒更新了,回頭更新一下再用。windows系統上的commix使用方法與linux系統有點不同,可網上找博客進行學習。