1. 程式人生 > 實用技巧 >命令執行漏洞攻擊&修復建議

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

應用程式有時需要呼叫一些執行系統命令的函式,如在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語言來說,不能完全控制的危險函式最好不要使用。