看到页面有两个按钮
先随便点一个试一下,当我们点击之后发现url是有变动的
感觉url是有点东西的,可能是某种注入,先尝试一下sql注入,发现给出了报错
通过报错我们可以确定是文件包含漏洞,那我们试试php伪协议去读取一下index.php源代码试试,看看能不能通过源码分析出什么(这里有个php伪协议blog003-漏洞梳理篇之php伪协议_伪协议漏洞-CSDN博客)
发现文件多了一个后缀哦(那有可能是直接将文件与后缀名拼接起来),那么把输入的.php删除再来一次
这次返回了base64编码,尝试解密,得到index.php源码如下
php
<?php
$file = $_GET['category'];
if(isset($file))
{
if( strpos( $file, "woofers" ) !== false || strpos( $file, "meowers" ) !== false || strpos( $file, "index")){
include ($file . '.php');
}
else{
echo "Sorry, we currently only support woofers and meowers.";
}
}
?>
可以看到通过category进行get传参,然后category中是需要包含woofers、meowers和index三个中任意一个的,否则就会返回Sorry, we currently only support woofers and meowers. 这里是存在一个php特性,当我们在进行伪协议写入的时候,php会忽略没有含义的值。这样绕过了过滤。从而可以达到读取flag的目的。可以去看一下这篇文章[BSidesCF 2020]Had a bad day_mb5fdcad8719a20的技术博客_51CTO博客
也就是说当我们通过category去传入文件名的时候,category=woofers/flag的时候,index.php会在参数后面直接连接.php这个后缀,因此$file=woofers/flag.php,而在php中进行文件包含的时候会把woofers/给忽略掉,找到这个有意义的flag.php,从而到达利用php伪协议去读取flag.php的目的。
所以可以试着传入category的参数为woofers/flag
可以看到flag.php是被包含进去了但是没有被读取出来,看了别人的博客才知道php伪协议还可以套协议(学到了ovo),这里payload就是利用的这个知识点去构造的
payload: category=php://filter/convert.base64-encode/woofers/resource=flag
这个伪协议套协议也就是去寻找woofers/flag,而前面说到php会忽略woofers所以这里就可以绕过index.php的过滤,从而读取到flag了
可以看到页面是返回来了一串base64编码,解码就可以得到flag.php的源码,如下
通过解码我们就可以看到源码中的flag了。
今天又学到了哈哈哈 Ovo ovO OVO ovo 开心的一天 自嗨哈哈哈
参考文章:
buuctf-[BSidesCF 2020]Had a bad day(小宇特详解)-CSDN博客
[BUUOJ记录] [BSidesCF 2020]Had a bad day - Ye'sBlog - 博客园 (cnblogs.com)