命令執行漏洞詳解


介紹

命令執行漏洞是值應用有時需要調用一些執行系統命令的函數,如:system()、shell_exec()、eval()、passthru(),代碼未對用戶可控參數做過濾,當用戶能控制這些函數中的參數時,就可以將惡意系統命令拼接到正常命令中,從而造成命令執行攻擊。

分類

1、代碼層過濾不嚴

  商業應用的一些核心代碼封裝在二進制文件中,在web應用中通過system函數調用:

  system("/bin/program --arg $arg");

2、系統的漏洞造成命令注入

  bash破殼漏洞(CVE-2014-6271)

3、調用的第三方組件存在代碼執行漏洞

  wordpress中用來處理圖片的ImageMagick組件;

  JAVA中的命令執行漏洞(struts2/ElasticsearchGroovy等);

  ThinkPHP命令執行;

利用條件

1、應用調用執行命令的函數

2、將用戶輸入作為系統命令的參數拼接到命令中

3、沒有對用戶輸入過濾或過濾不嚴格

常見拼接符

命令A ;命令B 先執行命令A,在執行命令B
命令A && 命令B 命令A執行成功,才會執行命令B
命令A & 命令B 簡單拼接,命令A、B之間沒有制約關系
命令A | 命令B 顯示命令B的執行結果
命令A || 命令B 命令A執行失敗,才會執行命令B

PHP中的危險函數

system():  成功則返回命令輸出的最后一行,失敗則返回 FALSE。

exec():   命令執行結果的最后一行內容

shell_exec():  命令執行的輸出。如果執行過程中發生錯誤或者進程不產生輸出,則返回NUL。

passthru(): 執行外部程序並且顯示原始輸出。

eval():   將輸入的字符串參數當做PHP程序代碼來執行。

命令執行常見可控位置情況

system("$sag");  //可控點直接是待執行的程序

stem("/bin/prog $arg")  //可控點是傳入程序的整個參數

system("/bin/prog -p $arg");  //可控點是傳入程序的某個參數的值(無引號包裹)

system("/bin/prog -p=\"$arg\"");  //可控點是傳入程序的某個參數的值(有雙引號包裹)

system("/bin/prog -p='$arg'");  //可控點是傳入程序的某個參數的值(有單引號包裹)

利用方式

方式一:常見拼接符利用

1、&&拼接符

 2、&拼接符

 3、||拼接符

4、|拼接符

方式二:添加用戶

創建用戶a

 查看用戶是否創建成功

 將用戶a添加管理員組

 使用創建的用戶進行遠程登錄

方式三:執行函數,信息泄露

執行函數,phpinfo();

方式四:寫入文件,反彈shell

在目標/tmp目錄下寫入反彈shell腳本

使用命令執行漏洞,執行寫入的腳本

nc監聽端口,得到目標服務器shell

命令執行漏洞危害

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

命令執行漏洞防御方式

  • 盡量少用執行命令的函數或直接禁用
  • 參數值盡量使用引號包括,並在拼接前調用addslashes函數進行轉義
  • 在使用動態函數之前,確保使用的函數是指定的函數之一
  • 在進入執行命令的函數方法之前,對參數進行過濾,對敏感字符進行轉義
  • 對於可控點是程序參數的情況下,使用escapeshellcmd函數進行過濾


免責聲明!

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



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