命令執行漏洞和修復方案
當應用需要呼叫一些外部程式去處理內容的情況下,就會用到一些執行系統命令的函式。如PHP中的system,exec,shell_exec等,當用戶可以控制命令執行函式中的引數時,將可注入惡意系統命令到正常命令中,造成命令執行攻擊。
漏洞成因:
指令碼語言優點是簡潔,方便,但也伴隨著一些問題,如速度慢,無法解除系統底層,如果我們開發的應用需要一些除去web的特殊功能時,就需要呼叫一些外部程式。
PHP可呼叫外部程式的常見函式:system,exec,shell_exec,passthru,popen,proc_popen
成因分類:
1.程式碼層過濾不嚴格:
商業應用需要執行命令,商業應用的一些核心程式碼可能封住在二進位制檔案當中,在web應用中通過system函式呼叫。
system("/bin/program --arg $arg")
2.呼叫第三方元件存在的程式碼執行漏洞:
如wordpress,可以選擇imagemagick這個常用的圖片處理元件,處理使用者上傳圖片時造成命令執行
JAVA中 struts2/elasticsearch groovy等
這是一個安全的命令執行,在URL上沒有顯示
這是一個不安全的命令執行 可在URL上直接執行系統命令
漏洞的滲透方法:
最可靠的方法使用時間延遲推斷,類似與盲注的方法。
1.在URL上cmd=xxxxxx後拼接||ping -i 30 127.0.0.1 (&)應用程式I ping -i 30 127.0.0.1 I
可能過濾掉某些命令分隔符 可以換做下面的命令:
I ping -n 30 127.0.0.1 I
& ping -i 30 127.0.0.1 &
& ping -n 30 127.0.0.1 &
;ping 127.0.0.1 ;
%0a ping -i 30 127.0.0.1 %0a ' ping 127.0.0.1 '
注意windows和linux的語法不同:
windows支援:&&,&,||(哪條名令為真執行那條)
linux支援:&&,&,||(執行為真) | (執行後面的語句)
2.發生延遲,說明程式可能易於受到命令注入的攻擊,對嘗試幾次,確定不是因為網路延遲造成的,更改-i -n 數值,確定時間延遲是否隨著提交的值發生變化。
3.使用發現的所有可成功實施注入的字串,嘗試注入dir、ls
4不能在瀏覽器直接看到回顯,可將命令重定向到當前目錄下的檔案中並檢視。或者用TFTP上傳工具到伺服器,用telnet和netcat建立反向shell,用mail通過SMTP傳送結果給自己的計算機。
5.檢視自己的許可權,可以提升自己許可權,訪問敏感資料或控制伺服器。
修復方案:
儘量使用指令碼解決工作,少用執行命令函式,php中禁止disable_functions
程式引數的情況,escapshellcmd過濾
程式引數值的情況,escapeshellarg過濾
引數值儘量使用引用號包裹,並在拼接前呼叫addslashes進行轉義
修復程式碼:
<?php
//判斷字串包含函式
function checkstr($str,$find){
$needle = $find;
$tmparray = explode($needle,$str);
if(count($tmparray)>1){
return true;
} else{
return false;
}
}
if(isset($_REQUEST['submit']) && $_REQUEST['ip']===''){
echo '<pre>請輸入IP或者域名</pre>';
}else{
$target=filter_var($_REQUEST['ip'],FILTER_SANITIZE_SPECIAL_CHARS);//用filter進行編碼
if(checkstr($target,".") && !checkstr($target,"|") && !checkstr($target,"&") && !checkstr($target," ")){
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>';
}
}else{
echo '<pre>請勿提交非法字元</pre>';
}
}
?>