進入題目頁面如下
提示flag在flag.php
ctrl+u,查看源碼
給出了一段PHP代碼,進行代碼審計
<?php
// 檢查是否開啟了錯誤顯示功能
if( !ini_get('display_errors') ) {// 如果沒有開啟,則將錯誤顯示功能設置為開啟狀態ini_set('display_errors', 'On');
}// 設置錯誤報告級別為顯示所有類型的錯誤
error_reporting(E_ALL);// 從客戶端的 Cookie 中獲取名為 'language' 的值,并賦值給變量 $lan
$lan = $_COOKIE['language'];// 檢查 $lan 是否為空
if(!$lan) {// 如果為空,設置一個名為 'language' 的 Cookie,值為 'english'@setcookie("language","english");// 包含名為 'english.php' 的文件@include("english.php");
} else {// 如果不為空,將 $lan 的值加上 '.php' 后綴后,包含對應的文件@include($lan.".php");
}// 讀取當前文件 'index.php' 的內容,并將其賦值給變量 $x
$x = file_get_contents('index.php');// 輸出變量 $x 的內容,即顯示當前文件的源代碼
echo $x;
文件包含漏洞
代碼中使用?include
?函數包含文件,而?$lan
?變量的值直接取自用戶的 Cookie。可以通過修改 Cookie 中的?language
?值,來包含任意文件,從而導致文件包含漏洞。
代碼沒有對?$lan
?變量的值進行任何驗證和過濾,可以構造特殊的文件名來繞過正常的文件包含邏輯,執行惡意代碼或獲取敏感信息。
?構造惡意 Cookie
修改 Cookie 中的?language
?值為?flag
。當請求該頁面時,服務器會嘗試包含?flag.php
?文件,從而將?flag
?的內容輸出到頁面上
Cookie: language=php://filter/read=convert.base64-encode/resource=flag
?利用 PHP 偽協議來繞過常規的文件包含限制并獲取敏感文件
?使用?php://filter
?偽協議對文件內容進行 Base64 編碼后輸出,避免因文件內容格式問題(如二進制文件)導致顯示異常,同時繞過部分簡單的過濾機制。
read=convert.base64-encode
是?php://filter
?偽協議的一個過濾器,指定了讀取文件內容時要進行的操作。convert.base64-encode
?表示將文件內容進行 Base64 編碼,文件內容就會以 Base64 字符串的形式輸出,方便在網頁上顯示和后續解碼。
resource
?是?php://filter
?偽協議中用于指定要操作的文件資源的參數
用burp suite抓包,修改cookie
得到base64編碼的flag可以利用下面這個在線工具解碼
Base64解碼 Base64編碼 UTF8 GB2312 UTF16 GBK 二進制 十六進制 解密 - The X 在線工具
最終得到flag
cyberpeace{94027b50fe68bcb6ff13855e5cb60024}