目錄
檔案包含
響應頭僞造
preg_replace() 函數
擷取 flag
檔案包含
根據題目描述“其他破壞者會利用工控雲管理系統裝置維護中心的後門入侵系統”,打開裝置維護中心後檢視 F12。

看到超連結中有 “?page” 這個 GET 方法傳遞的參數,考慮在這個參數使用 PHP 僞協定中的 “php://filter” 讀取 index 的源碼。
利用 payload 成功讀取到了 index.php 的 base64 加密形式,把它轉換回我們能看得懂的。
響應頭僞造
觀察到 index.php 被執行的條件是 “$_SERVER['HTTP_X_FORWARDED_FOR'] === '127.0.0.1'”,也就是說這個請求必須是本地的請求,修改 HTTP 響應頭 X_FORWARDED_FOR 的值為 “127.0.0.1”。
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 指令擷取目錄下的所有檔案。
執行成功,發現目錄下的 s3chahahaDir 檔案夾的名字很可疑,再次執行 ls 指令在該檔案中檢視内容。
執行成功,發現 s3chahahaDir 下有個 flag 檔案夾,那就更可疑了,再次執行 ls 指令在該檔案中檢視内容。
執行成功,發現 flag 檔案夾下有一個 flag.php 檔案,使用 cat 指令檢視檔案。檢視之後打開 F12,即可看到 flag。