知識點
指令執行漏洞,指的是可以執行系統指令或者應用指令(如cmd或者bash指令)的漏洞
簡單說就是使用者輸入的資料被當作系統指令來執行,php的指令執行漏洞主要基于一些函數的參數過濾不全而導緻
指令執行函數
- system('whoami')php會操縱計算機執whoami指令并輸出傳回結果(目标機器是windows執行cmd指令,是Linux執行bash指令)
- 如果還想寫webshell可以嘗試cmd指令 echo "" > 1.php 可以把一句話木馬寫進1.php
- echo exec('whoami') php去操縱計算機執行whoami指令,并隻傳回最後一行資料
- echo shell_exec('whoami')php去操縱計算機執行whoami指令,擷取所有資料
- passthru('whoami')隻調用指令,把指令的運作結果原樣地直接輸出到标準輸出裝置
- 特殊符号:
反引号(``) echo `whoami`實際調用shell_exec()
第一步.環境搭建
下載下傳IBOS4.5.5建站系統安裝成功後源碼審計發現zend加密,使用SeayDzend(PHP解密工具)解密然後進行審計
第二步.漏洞複現
定位
shell_exec()
發現
1shell_exec("{$mysqlBin}mysqldump --force --quick $command1 --add-drop-table $command2 $command3 --host=\"{$db["host"]}\" $command5 --user=\"{$db["username"]}\" --password=\"{$db["password"]}\" \"{$db["dbname"]}\" $tablesstr > $dumpFile");
使用了
mysqldump
用來備份資料庫
同時還發現備份的檔案名
$dumpFile
我們有可能可以控制
于是我跟進
$dumpFile
,最後發現如下
1$backupFileName = self::BACKUP_DIR . "/" . core\utils\str_replace(array("/", "\\", ".", "'"), "", $fileName);
$fileName
我們可能控制
是以就可以進入背景系統
送出抓包檢視
$fileName
我們可控
是以就有了思路:
既然使用了
shell_exec()
函數執行
mysqldump
并且是cmd
那麼我們就可以使用&符号執行多條語句來寫shell
因為
shell_exec(string)
可以執行cmd指令,而cmd指令中是使用’&’将多條指令分隔開的,我們傳入的參數中先把原有的
mysqldump
閉合
繼續跟進
$fileName = core\utils\Env::getRequest("filename");
因為使用
getREQUEST
,很可能因為相容性來url解碼,是以将$替換成%26
發現成功寫入檔案
在上面審計的代碼中,我們發現控制傳入的
$fileName
中,
.
會被替換成空,并且拼接.sql
但是因為在備份的時候執行cmd指令,這就可以使用切割法來切割PATHEXT環境變量
.
就不會被過濾
寫shell,最後再使用&将.sql字尾給繞過
連接配接菜刀就好了