1腳本語言(如PHP)優(yōu)點是簡潔、方便木柬,但也伴隨著一些問題皆串,如速度慢、無法接觸系統(tǒng)底層眉枕,如果我們開發(fā)的應用(特別是企業(yè)級的一些應用)需要一些除去web的特殊功能時恶复,就需要調用一些外部程序。
2在PHP中可以調用外部程序的常見函數:
? system
? exec
? shell_exec
? passthru
? popen
? proc_popen
3導致命令執(zhí)行漏洞的原因較多速挑,主要包括以下幾類:
? 代碼層過濾不嚴格
一些商業(yè)應用需要執(zhí)行命令谤牡,商業(yè)應用的一些核心代碼可能封裝在二進制文件中,在web應用中通過 system函數來調用之:
system("/bin/program --arg $arg");
? 調用第三方組件存在代碼執(zhí)行漏洞
很典型的就是WordPress中,可以選擇使用 ImageMagick這個常用的圖片處理組件,對用戶上傳的圖片進行處理(默認是
ImageMagick庫)姥宝,造成命令執(zhí)行翅萤。
另外JAVA中的命令執(zhí)行漏洞(struts2/Elasticsearch Groovy等)很常見。
典型的漏洞代碼
<?php
system($GET_[cmd]);
?>
http://127.0.0.1:8080/?cmd=id
http://192.168.188.66/index.php?cmd=
|I ping -i 30 127.0.0.1 腊满; x II ping -n 30 127.0.0.1 &
如果應用程序過濾掉某些命令分隔符套么,為加大檢測到命令注人漏洞的可能性培己,還應該輪流 向每一個目標參數提交下面的每個測試字符串,并監(jiān)控應用程序進行響應的時間胚泌。
I ping -i 30 127.0.0.1 I
I ping -n 30 127.0.0.1 I
& ping -i 30 127.0.0.1 &
& ping -n 30 127.0.0.1 &
;ping 127.0.0.1 ;
%0a ping -i 30 127.0.0.1 %0a ' ping 127.0.0.1 '
如果發(fā)生時間延遲省咨,說明應用程序可能易于受到命令注人攻擊。重復幾次測試過程玷室, 確定延遲不是由于網絡延時或其他異常造成的零蓉。可以嘗試更改-n或-i參數的值穷缤,并確定經歷的時間延遲是否會隨著提交的值發(fā)生對應的變化敌蜂。
使用所發(fā)現的任何一個可成功實施攻擊的注人字符串,嘗試注人另一個更有用的命令 (如Is或dir),確定是否能夠將命令結果返回到瀏覽器上津肛。
如果不能直接獲得命令執(zhí)行結果章喉,還可以采用其他方法。
□可以嘗試打開一條通向自己計算機的帶外通道快耿。嘗試使用TFTP上傳工具至服務器囊陡, 使用telnet或netcat建立一個通向自己計算機的反向shell,并使用mail命令通過SMTP 發(fā)送命令結果。
□可以將命令結果重定向到Web根目錄下的一個文件掀亥,然后使用瀏覽器直接獲取結
果撞反。例如:dir > c:\inetpub\wwwroot\foo.txt
一旦找到注人命令的方法并能夠獲得命令執(zhí)行結果,就應當城定自己的權限(通過使 用whoami或類似命令搪花,或者嘗試向一個受保護的目錄寫人一個無害的文件)遏片。然后就可以設 法提升自己的權限,進而秘密訪問應用程序中的敏感數據撮竿,或者通過被攻破的服務器攻擊其他主機吮便。
修復方案
1. 能使用腳本解決的工作,不要調用其他程序處理幢踏。盡量少用執(zhí)行命令的函數髓需,并在PHP配置文件php.ini的禁用函數功能disable_functions中禁用。
2. 對于可控點是程序參數的情況房蝉,使用escapeshellcmd函數進行過濾僚匆。
3. 對于可控點是程序參數的值的情況,使用escapeshellarg函數進行過濾搭幻。
4. 參數的值盡量使用引號包裹咧擂,并在拼接前調用addslashes進行轉義。