天天看點

CTF-WEB:攻防世界 ics-05(preg_replace() 函數 /e 漏洞)

目錄

​​檔案包含​​

​​響應頭僞造​​

​​preg_replace() 函數​​

​​擷取 flag​​

檔案包含

根據題目描述“其他破壞者會利用工控雲管理系統裝置維護中心的後門入侵系統”,打開裝置維護中心後檢視 F12。

CTF-WEB:攻防世界 ics-05(preg_replace() 函數 /e 漏洞)

看到超連結中有 “?page” 這個 GET 方法傳遞的參數,考慮在這個參數使用 PHP 僞協定中的 “php://filter” 讀取 index 的源碼。

利用 payload 成功讀取到了 index.php 的 base64 加密形式,把它轉換回我們能看得懂的。

CTF-WEB:攻防世界 ics-05(preg_replace() 函數 /e 漏洞)

響應頭僞造

觀察到 index.php 被執行的條件是 “$_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1'”,也就是說這個請求必須是本地的請求,修改 HTTP 響應頭 X_FORWARDED_FOR 的值為 “127.0.0.1”。

CTF-WEB:攻防世界 ics-05(preg_replace() 函數 /e 漏洞)

preg_replace() 函數

這段 PHP 代碼會擷取 3 個變量:pat、rep 和 sub 的值,然後進入一個 if-else 語句。isset() 函數在 PHP 中用來判斷變量是否聲明,此處如果這 3 個值都有傳遞就會執行 preg_replace()函數。

preg_replace 函數執行一個正規表達式的搜尋和替換,文法如下:

<col>

參數

說明

$pattern

要搜尋的模式,可以是字元串或一個字元串數組

$replacement

用于替換的字元串或字元串數組

$subject: 要搜尋替換的目标字元串或字元串數組

$limit

可選,對于每個模式用于每個 subject 字元串的最大可替換次數。預設是 -1(無限制)

$count

可選,為替換執行的次數

如果 subject 是一個數組, preg_replace() 傳回一個數組,其他情況下傳回一個字元串。如果比對被查找到,替換後的 subject 被傳回,其他情況下 傳回沒有改變的 subject。如果發生錯誤,傳回 NULL。

這個函數有個 “/e” 漏洞,“/e” 修正符使 preg_replace() 将 replacement 參數當作 PHP 代碼進行執行。如果這麼做要確定 replacement 構成一個合法的 PHP 代碼字元串,否則 PHP 會在報告在包含 preg_replace() 的行中出現文法解析錯誤。

擷取 flag

也就是說隻要在 sub 參數中有要搜尋的 pat 的内容,同時将在 rep 前加上 “/e” 觸發漏洞,就可以執行 replacement 中的 PHP 代碼。sub 和 pat 的參數構造隻要滿足前面的條件就行,rep 參數則設定為 “system('ls')”,這句代碼用于指令行執行 ls 指令擷取目錄下的所有檔案。

CTF-WEB:攻防世界 ics-05(preg_replace() 函數 /e 漏洞)

執行成功,發現目錄下的 s3chahahaDir 檔案夾的名字很可疑,再次執行 ls 指令在該檔案中檢視内容。

CTF-WEB:攻防世界 ics-05(preg_replace() 函數 /e 漏洞)

執行成功,發現 s3chahahaDir 下有個 flag 檔案夾,那就更可疑了,再次執行 ls 指令在該檔案中檢視内容。

CTF-WEB:攻防世界 ics-05(preg_replace() 函數 /e 漏洞)

執行成功,發現 flag 檔案夾下有一個 flag.php 檔案,使用 cat 指令檢視檔案。檢視之後打開 F12,即可看到 flag。

CTF-WEB:攻防世界 ics-05(preg_replace() 函數 /e 漏洞)