天命:這題本地php代碼是無法復現的
首先打開網站,啥也沒有,查看源碼
發現文件,打開訪問一下看看,發現是代碼審計
<?phphighlight_file(__FILE__);class emmm{public static function checkFile(&$page){$whitelist = ["source"=>"source.php","hint"=>"hint.php"];if (! isset($page) || !is_string($page)) {echo "you can't see it";return false;}// 攔截1:判斷是否數組里面兩個文件名if (in_array($page, $whitelist)) {return true;}// 攔截2:輸入的東西在最后面添加上?,然后獲取字符串長度,通過長度來截取字符串// 如果?前面是數組里面的東西,就返回true,$_page = mb_substr( $page, 0, mb_strpos($page . '?', '?'));if (in_array($_page, $whitelist)) {return true;}// 攔截3:url解碼是不生效,忽略$_page = urldecode($page);// 攔截4:因為url解碼不生效,所以攔截跟上面一樣,忽略$_page = mb_substr( $_page, 0, mb_strpos($_page . '?', '?'));if (in_array($_page, $whitelist)) {return true;}echo "you can't see it";return false;}}if (! empty($_REQUEST['file'])&& is_string($_REQUEST['file'])&& emmm::checkFile($_REQUEST['file'])) {include $_REQUEST['file'];exit;} else {echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";}
?>
訪問一下hint.php文件就告訴我們,flag在?ffffllllaaaagggg 這個文件里
攔截大概意思就是,我們輸入:ffffllllaaaagggg
會被添加問號:ffffllllaaaagggg?
然后截取問號前數據,就是輸入什么就判斷什么
ffffllllaaaagggg == 數組里兩個文件名嗎?
相等才能放行
所以輸入的東西必須是其中之一
hint.php? 是必填的,然后重點來了,想要訪問成其他文件,只需要繼續拼接?文件名
就可以了
hint.php?ffffllllaaaagggg
這里經驗靈感是 四個字,所以是四層目錄
所以完整的flag:source.php?file=hint.php?../../../../../ffffllllaaaagggg
然后你會發現,這TM是五層目錄啊,而且本地是無法復現出來的
可能是古代版本的php才能復現出來