php://filter是PHP中独有的协议,利用这个协议可以创造很多“妙用”,本文说几个有意思的点,剩下的大家自己下去体会。

XXE中的使用

php://filter之前最常出镜的地方是XXE。由于XXE漏洞的特殊性,我们在读取HTML、PHP等文件时可能会抛出此类错误parser error : StartTag: invalid element name 。其原因是,PHP是基于标签的脚本语言,<?php ... ?>这个语法也与XML相符合,所以在解析XML的时候会被误认为是XML,而其中内容(比如特殊字符)又有可能和标准XML冲突,所以导致了出错。

那么,为了读取包含有敏感信息的PHP等源文件,我们就要先将“可能引发冲突的PHP代码”编码一遍,这里就会用到php://filter。

php://filter是PHP语言中特有的协议流,作用是作为一个“中间流”来处理其他流。比如,我们可以用如下一行代码将POST内容转换成base64编码并输出:

readfile("php://filter/read=convert.base64-encode/resource=php://input");

如下:

所以,在XXE中,我们也可以将PHP等容易引发冲突的文件流用php://filter协议流处理一遍,这样就能有效规避特殊字符造成混乱。

如下,我们使用的是php://filter/read=convert.base64-encode/resource=./xxe.php

巧用编码与解码

使用编码不光可以帮助我们获取文件,也可以帮我们去除一些“不必要的麻烦”。

记得前段时间三个白帽有个比赛,其中有一部分代码大概类似于以下:

<?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']);

所以,当$content被加上了<?php exit; ?>以后,我们可以使用 php://filter/write=convert.base64-decode 来首先对其解码。在解码的过程中,字符<、?、;、>、空格等一共有7个字符不符合base64编码的字符范围将被忽略,所以最终被解码的字符仅有“phpexit”和我们传入的其他字符。

“phpexit”一共7个字符,因为base64算法解码时是4个byte一组,所以给他增加1个“a”一共8个字符。这样,"phpexita"被正常解码,而后面我们传入的webshell的base64内容也被正常解码。结果就是<?php exit; ?>没有了。

最后效果是 :

利用字符串操作方法

有的同学说,base64的算法我不懂,上面的方法太复杂了。

其实,除了使用base64特性的方法外,我们还可以利用php://filter字符串处理方法来去除“死亡exit”。我们观察一下,这个<?php exit; ?>实际上是什么?

实际上是一个XML标签,既然是XML标签,我们就可以利用strip_tags函数去除它,而php://filter刚好是支持这个方法的。

编写如下测试代码即可查看 php://filter/read=string.strip_tags/resource=php://input 的效果:

echo readfile('php://filter/read=string.strip_tags/resource=php://input');

可见,<?php exit; ?>被去除了。但回到上面的题目,我们最终的目的是写入一个webshell,而写入的webshell也是php代码,如果使用strip_tags同样会被去除。

万幸的是,php://filter允许使用多个过滤器,我们可以先将webshell用base64编码。在调用完成strip_tags后再进行base64-decode。“死亡exit”在第一步被去除,而webshell在第二步被还原。

最终的数据包如下:

除此之外,我们还可以利用rot13编码独立完成任务。原理和上面类似,核心是将“死亡exit”去除。<?php exit; ?>在经过rot13编码后会变成<?cuc rkvg; ?>,在PHP不开启short_open_tag时,php不认识这个字符串,当然也就不会执行了:

当然,这个方法的条件就是不开启短标签。

您可以考虑给博主来个小小的打赏以资鼓励,您的肯定将是我最大的动力。thx.

微信打赏

支付宝打赏

作  者: Angel_Kitty
出  处:http://www.cnblogs.com/ECJTUACM-873284962/
关于作者:潜心机器学习以及信息安全的综合研究。如有问题或建议,请多多赐教!
版权声明:本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文链接。
特此声明:所有评论和私信都会在第一时间回复。也欢迎园子的大大们指正错误,共同进步。或者直接私信我
声援博主:如果您觉得文章对您有帮助,可以点击右下角【推荐】推荐一下该博文。您的鼓励是作者坚持原创和持续写作的最大动力!

【转】浅谈php://filter的妙用相关推荐

  1. 叩丁狼分享—培训实战教程之浅谈过滤器Filter

    一.过滤器的基本概念Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对Htt ...

  2. php://filter利用条件,浅谈php://filter技巧

    php://filter php://filter可以作为一个中间流来处理其他流,具有四个参数: 名称 描述 备注 resource= 指定了你要筛选过滤的数据流 必选 read= 可以设定一个或多个 ...

  3. 浅谈工资合理避税,五大妙招轻松搞定!

    据说在发达国家流传这样一句名言:"在我们这里,除享受阳光和空气外都要纳税."个人所得税与每个人如影相随,生活消费.看病购房.工资扣税等都是较大的纳税开支,在积极纳税的同时寻求合理避 ...

  4. 简述autocad在测绘工程中的应用_浅谈AutoCAD在工程测绘制图中的应用

    龙源期刊网 http://www.qikan.com.cn 浅谈 AutoCAD 在工程测绘制图中的应用 作者:高振华 来源:<职业 · 下旬> 2011 年第 02 期 AutoCAD ...

  5. 大红灯笼高高挂专业影评_浅谈《大红灯笼高高挂》

    初来乍到,浅知拙见,万望海涵. 利用闲暇时间第一次完整地看完了<大红灯笼高高挂>的电影(没有看原著),终于能从身边各种声音中辨出一二,进而斗胆在这里发出属于自己的声音.在这里从两个方面浅谈 ...

  6. 浅谈ASP.NET的内部机制(一)

    浅谈ASP.NET的内部机制(一) 前言:当一个Http请求发送给一个aspx页面时,服务器进行了哪些操作?又如何来解析这个请求?ASP.NET在接收请求后是怎么运行的,如怎么编译以及怎么样用托管的代 ...

  7. 浅谈Python Web的五大框架

    说到web framework,Ruby的世界Rails一统江湖,而Python则是一个百花齐放的世界,各种micro-framework.framework不可胜数,不完全列表见:http://wi ...

  8. 浅谈Service Mesh体系中的Envoy

    摘要: 提到Envoy就不得不提Service Mesh,说到Service Mesh就一定要谈及微服务了,那么我们就先放下Envoy,简单了解下微服务.Service Mesh以及Envoy在Ser ...

  9. Java 线上问题排查神器 Arthas 快速上手与原理浅谈

    [Arthas 官方社区正在举行征文活动,参加即有奖品拿哦~点击投稿] 作者 | 杨桢栋,笔名叫蛮三刀把刀,是一名一线互联网码农,留美访学一年,主要关注后端开发,数据安全,爬虫,物联网,边缘计算等方向 ...

最新文章

  1. 使用Python,OpenCV进行平滑和模糊
  2. Linux 基本网络配置 实验手册
  3. Leetcode 373. 查找和最小的K对数字 解题思路及C++实现
  4. On Comparing Side-Channel Preprocessing Techniques for Attacking RFID Devices
  5. 请输入“您的生日”,格式:yyyy-MM-dd,使用程序计算您已经来到这个世界多少天了。
  6. windows如何开关机执行程序
  7. C++ ---------- map的使用
  8. 增强旋转不变LBP算法及其在图像检索中的应用
  9. 云流化像素流技术解决方案之虚拟仿真系统
  10. 环境工程微生物学练习题
  11. JupyterLab 的安装与使用
  12. 【资源下载】《Oracle DBA手记》第1篇:DBA工作手记
  13. c语言 ZZ转字符串,C语言 字符串中的转义字符与字符串的长度 zz
  14. python中encode和decode使用讲解与演示
  15. Android蓝牙搜索连接通信
  16. 成都艾司博讯:什么是拼多多网店的品质退款率?
  17. 【Python4CFD】笔记step9-12
  18. 操作系统第九次部分作业题答案
  19. 网狐荣耀需要什么服务器系统,网狐荣耀环境搭建教程
  20. N76E003 串口ISP如何使用

热门文章

  1. c++数据结构之广义表
  2. Debian 下通过Bonding 实现双网卡单IP
  3. 华为IPSEC-×××-典型配置举例1-采用手工方式建立IPsec 安全隧道
  4. 解析不是utf-8的xml文件 附(tag 属性的获取 )
  5. Office 2010 中的 UI 扩展性
  6. [IE技巧] 查看HTTP 验证的用户名/密码
  7. 使用reveal.js制作PPT,并部署至GitHub
  8. Github学习系列之Github是什么?
  9. 【Codevs1346】HelloWorld编译器
  10. svn的使用(转载)