1. 程式人生 > >命令執行漏洞和修復方案

命令執行漏洞和修復方案

當應用需要呼叫一些外部程式去處理內容的情況下,就會用到一些執行系統命令的函式。如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>';

}
}

?>