bugku-flag在index里
解法:
1、首先打开这道题,页面只给你click me? no,点击进去显示test5
2、查看源代码,无果;第二步bp,无果
3、结合到题目,flag在index里,尝试http://123.206.87.240:8005/post/index.php?file=index.php,发现什么都没有。
4、看wp,了解到这题是经典的本地文件包含漏洞+php伪协议的结合应用
这里用到了php的封装协议:http://php.net/manual/zh/wrappers.php.php(看里面的php://filter部分)
5、file=php://filter/read=convert.base64-encode/resource=index.php
的含义
- 这是一个file关键字的get参数传递
- php://是一种协议名称
- php://filter/是一种访问本地文件的协议index.php在本地
- /read=convert.base64-encode/表示读取的方式是base64编码后
- resource=index.php表示目标文件为index.php。
通过传递这个参数可以得到index.php的源码
6、通过上述编码后经base64解码,得到源代码和flag
分析源代码:
<html>
<title>Bugku-ctf</title>
<?php
error_reporting(0);
if(!$_GET[file])
{echo '<a href="./index.php?file=show.php">click me? no</a>';}
$file=$_GET['file'];
if(strstr($file,"../")||stristr($file, "tp")||stristr($file,"input")||stristr($file,"data")){
echo "Oh no!";
exit();
}
include($file);
//flag:flag{edulcni_elif_lacol_si_siht}
?>
</html>
include()函数是关键
-
include()函数:表示从外部引入php文件并执行,此时经代码分析,其意识是如果执行不成功,就返回文件的源码。
-
include的内容是由用户控制的,所以通过我们传递的file参数,include()函数引入了index.php的base64编码格式,因为是base64编码格式,所以执行不成功,就返回了源码。
-
如果不进行base64编码传入,就会直接执行,得不到源码,而flag在注释中,就得不到了。