任意命令執行漏洞 *背景介紹*
當應用需要調用一些外部程序去處理內容的情況下,就會用到一些執行系統命令的函數。如php中的system、exec、shell_exec等,當用戶可以控制命令執行函數中的參數時,將可以注入惡意系統命令到正常的命令中,造成命令執行攻擊。
任意命令執行漏洞 *成因*
腳本語言有點事簡潔、方便,但也伴隨着一些問題,如速度慢、無法接觸系統底層,如果我們開發的應用(特別是企業級的一些應用)需要一些除去web的特殊功能時,就需要調用一些外部程序。應用在調用這些函數執行系統命令的時候,如果將用戶輸入的作為系統命令的參數拼接到命令行中,又沒有過濾用戶的輸入情況下,就會造成命令執行漏洞。
漏洞的分類
*代碼層過濾不嚴格*
一些商業應用需要執行命令,商業應用的一些核心代碼可能封裝在二進制文件中,在web應用中通過system函數來調用:
system(“/bin/program --arg $arg”);
*系統漏洞造成命令注入*
如果我們能夠控制執行的bash的環境變量,就可以通過破殼漏洞來執行任意代碼
*調用第三方組件存在代碼執行漏洞*
很典型的就是WordPress中,可以選擇使用ImageMagick這個常用的圖片處理組件,對用戶上傳的圖片進行處理,造成命令執行,另外JAVA中的命令執行漏洞(struts2/Elasticsearch等)很常見
典型的漏洞代碼
<?php
system($_GET['cmd']);
?>
http://127.0.0.1:8080/?cmd=id
修復方案
能使用腳本解決的工作,不要調用其他程序處理。盡量少用執行命令的函數,並在disable_functions中禁用
對於可控點是程序參數的情況下,使用escapeshellcmd函數進行過濾
對於可控點是程序參數值的情況下,使用escapeshellarg函數進行過濾
參數的值盡量使用引號包裹,並在拼接前調用addslashes進行轉義