[極客大挑戰 2019]Secret File 復現
知識點
- 前端中背景可以覆蓋內容,頁面源代碼可以查看完整的html
- 在php文件中可以寫入html代碼,html可在前端展示出來,php代碼主要是處理數據,通常不會展示。
- 文件包含漏洞,PHP偽協議獲取文件
php://filter 是一種元封裝器, 設計用於數據流打開時的篩選過濾應用。 這對於一體式(all-in-one)的文件函數非常有用,類似 readfile()、 file() 和 file_get_contents(), 在數據流內容讀取之前沒有機會應用其他過濾器。
環境概要:
PHP.ini:
allow_url_fopen :on 默認開啟 該選項為on便是激活了 URL 形式的 fopen 封裝協議使得可以訪問 URL 對象文件等。
allow_url_include:off 默認關閉,該選項為on便是允許 包含URL 對象文件等。
復現
-
初次相遇
打開題目連接(https://buuoj.cn/challenges#[極客大挑戰 2019]Secret File )我們可以看到一頁背景為黑色,字體為紅色的頁面,這里已經給出了一個提示:想要的話可以給你,去找吧!把一切都放在那里了!我們可以猜測這個頁面是隱藏了一些信息的。
-
步步逼近
通過查看頁面源代碼或者按主鼠標左鍵一直拖動,我們可以發現隱藏的./Archive_room.php。
訪問Archive_room.php,發現又給出了提示:我把他們都放在這里了,去看看吧。還有一個類似button一樣的東西,查看審查元素可知是action.php,我們點進去。
訪問action.php立即跳轉到了end.php,並且頁面顯示的是:查閱結束 沒看清么?回去再仔細看看吧。
我們可以猜測action.php訪問時間很短,時間一到立即跳轉到end.php。為了攔截action.php,我們可以使用BrupSuite來抓包。
在攔截的action.php中我們看到一處提示代碼:
<!DOCTYPE html>
<html>
<!--
secr3t.php
-->
</html>
訪問secr3t.php,頁面顯示了php代碼:
<?php
highlight_file(__FILE__);
error_reporting(0);
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag放在了flag.php里
?>
發現這里有一個文件包含漏洞,但是在這里好像沒什么用,因為我們還不確定存在flag的文件。根據代碼的注釋內容,訪問flag.php。又出現提示:啊哈!你找到我了!可是你看不到我QAQ~~~ 我就在這里。
剛開始我們以為還是像之前一樣用背景把flag給覆蓋掉了,但是通過查看頁面源代碼發現並沒有將flag寫出來。根據提示我們可以肯定flag確實是在這里,但是前端卻看不到,我們猜測flag是寫在了php代碼里面。那么怎樣來獲取完整的flag.php文件呢?我們立馬想到了secr3t.php的文件包含漏洞
<?php
highlight_file(__FILE__);
error_reporting(0);
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag放在了flag.php里
?>
傳入的file經過了一些過濾,但是沒有過濾filter,我們可以用php://fileter來獲取文件。構造url:http://00b5c733-809a-4aed-a498-27d306b09452.node3.buuoj.cn/secr3t.php?file=php://filter/convert.base64-encode/resource=flag.php
(前面請使用自己的題目鏈接)
- 到達終點
獲取到了flag.php的base64加密,復制加密內容到解密網站去即可得到flag
總結
這道題難度不是很大,每一步都有提示,主要需要掌握文件包含漏洞與php偽協議結合