命令執行漏洞攻擊&修復建議
阿新 • • 發佈:2020-09-21
應用程式有時需要呼叫一些執行系統命令的函式,如在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語言來說,不能完全控制的危險函式最好不要使用。