天天看點

通過切割環境變量繞過限制,實作指令執行

知識點

指令執行漏洞,指的是可以執行系統指令或者應用指令(如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字尾給繞過

連接配接菜刀就好了