命令執行漏洞攻擊&修復建議


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

命令執行攻擊過程

頁面1.php提供了ping的功能,當給參數IP輸入127.0.0.1時, 程序會執行ping 127.0.0.1,然后將ping的結果返回到頁面上,如下圖所示。


而如果將參數IP設置為127.0.0.1|dir,然后再次訪問,從返回結果可以看到,程序直接將目錄結構返回到頁面上了,這里就利用了管道符"|” 讓系統執行了命令dir,如下圖所示。

下面展示了常用的管道符。

Windows系例支持的管道符如下所示。

  • "|”:直接執行后面的語句。例如: ping 127.0.0.1|whoami.
  • “||”:如果前面執行的語句執行出錯,則執行后面的語句,前面的語句只能為假。例如: ping 2|whoami.
  • "&”: 如果前面的語句為假則直接執行后面的語句,前面的語句可真可假。例如: ping 127.0.0.1&whoami.
  • "&&” :如果前面的語句為假則直接出錯,也不執行后面的語句,前面的語句只能為真。例如: ping 127.0.0.1&&whoami.

Linux系統支持的管道符如下所示。

  • ";" :執行完前面的語句再執行后面的。例如: ping 127.0.0.1;whoami.
  • "|":顯示后面語句的執行結果。例如: ping 127.0.0.1|whoami.
  • "||":當前面的語句執行出錯時,執行后面的語句。例如: ping 1||whoami.
  • "&" :如果前面的語句為假則直接執行后面的語句,前面的語句可真可假。例如: ping 127.0.0.1&whoami.
  • "&&" :如果前面的語句為假則直接出錯,也不執行后面的,前面的語句只能為真。例如: ping 127.0.0.1&&whoami.

命令執行漏洞代碼分析

服務端處理ping的代碼如下所示,程序獲取GET參數IP,然后拼接到system()函數中,利用system()函數執行ping的功能,但是此處沒有對參數IP做過濾和檢測,導致可以利用管道符執行其他的系統命令,代碼如下所示。

<?php
echo system("ping -n 2 " . $_GET['ip']);
?>

命令執行漏洞修復建議

  • 盡量不要使用命令執行函數。
  • 客戶端提交的變量在進入執行命令函數前要做好過濾和檢測。
  • 在使用動態函數之前,確保使用的函數是指定的函數之一。
  • 對PHP語言來說,不能完全控制的危險函數最好不要使用。


免責聲明!

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



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