php://filter利用条件,浅谈php://filter技巧
php://filter
php://filter可以作为一个中间流来处理其他流,具有四个参数:
名称
描述
备注
resource=
指定了你要筛选过滤的数据流
必选
read=
可以设定一个或多个过滤器名称,以管道符(|)分隔。
可选
write=
可以设定一个或多个过滤器名称,以管道符(|)分隔。
可选
任何没有以 read= 或 write= 作前缀的筛选器列表会视情况应用于读或写链。
巧用编码与解码
$content = '<?php exit; ?>';
$content .= $_POST['txt'];
file_put_contents($_POST['filename'], $content);
$content在开头增加了exit过程,导致即使成功写入一句话,也执行不了(这个过程在实战中十分常见,通常出现在缓存、配置文件等等地方,不允许用户直接访问的文件,都会被加上if(!defined(xxx))exit;之类的限制)。
但是这里的$_POST['filename']是可以控制协议的,可以使用php://filter流的base64-decode方法,将$content解码,利用php base64_decode函数特性绕过。
base64编码中只包含64个可打印字符,而PHP在解码base64时,遇到不在其中的字符时,将会跳过这些字符,仅将合法字符组成一个新的字符串进行解码。
一个正常的base64_decode实际上可以理解为如下两个步骤:
$_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; ?>没有了。
pyload:
txt=aPD9waHAgcGhwaW5mbygpOyA/Pg==&filename=php://filter/write=convert.base64-decode/resource=shell.php
利用字符串操作方法
<?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。<?php exit; ?>在第一步被去除,而webshell在第二步被还原。
最终的数据包如下:
pyload:
txt=PD9waHAgcGhwaW5mbygpOyA/Pg==&filename=php://filter/write=string.strip_tages | convert.base64-decode/resource=shell.php
利用rot13操作方法
原理和上面类似,核心是将“死亡exit”去除。<?php exit; ?>在经过rot13编码后会变成<?cuc rkvg; ?>,在PHP不开启short_open_tag时,php不认识这个字符串,当然也就不会执行了:
pyload:
txt=<?cuc cucvasb(); ?>&filename=php://filter/write=string.rot13/resource=shell.php
php://filter利用条件,浅谈php://filter技巧相关推荐
- 叩丁狼分享—培训实战教程之浅谈过滤器Filter
一.过滤器的基本概念Java中的Filter 并不是一个标准的Servlet ,它不能处理用户请求,也不能对客户端生成响应. 主要用于对HttpServletRequest 进行预处理,也可以对Htt ...
- 浅谈数据库设计技巧(上)
浅谈数据库设计技巧(上) 说到数据库,我认为不能不先谈数据结构.1996年,在我初入大学学习计算机编程时,当时的老师就告诉我们说:计算机程序=数据结构+算法.尽管现在的程序开发已由面向过程为主逐步过渡 ...
- 【转】浅谈php://filter的妙用
php://filter是PHP中独有的协议,利用这个协议可以创造很多"妙用",本文说几个有意思的点,剩下的大家自己下去体会. XXE中的使用 php://filter之前最常出镜 ...
- 转《浅谈数据库设计技巧》
说到数据库,我认为不能不先谈数据结构.1996年,在我初入大学学习计算机编程时,当时的老师就告诉我们说:计算机程序=数据结构+算法.尽管现在的程序开发已由面向过程为主逐步过渡到面向对象为主,但我还是深 ...
- 浅谈数据库设计技巧(实例一定的数据冗余)
说到数据库, 我认为不能不先谈数据结构.1996年,在我初入大学学习计算机编程时,当时的老师就告诉我们说:计算机程序=数据结构+算法.尽管现在的程序开发已由面 向过程为主逐步过渡到面向对象为主,但我还 ...
- 阶乘之和计算_浅谈积分计算的技巧
大家好,我是?!,萌新一个,初来知乎写文章,如果各位大佬发现任何错误,还望指正!! 我目前是一位大一在读生,更重要的是我还是一个热爱数学的人,在知乎上,希望以这种特殊的方式来分享一下我对数学的一些见解 ...
- 云天视界传媒浅谈无人机航拍技巧
无人机航拍简单来说就是把无人机相机摆放在合适的空中位置进行拍摄.航拍至少由三部分组成:无人机.云台相机.无人机图传.图传系统可以将所拍摄的影像实时传输回到控制中心.要想在航拍中得到理想的影像资料,就要 ...
- 【面试系列】浅谈后端面试技巧
目录 序言 前言/背景 面试流程 资料总结/刷题指南 个人经验总结 寄语 序言 成功不是将来才有的,而是从决定去做的那一刻起,持续累积而成. 文章标记颜色说明: 黄色:重要标题 红色:用来标记结论 绿 ...
- 浅谈javax.servlet.Filter
过滤器(Filter)的概念 过滤器位于客户端和web应用程序之间,用于检查和修改两者之间流过的请求和响应. 在请求到达Servlet/JSP之前,过滤器截获请求. 在响应送给客户端之前,过滤器截获响 ...
最新文章
- TypeScript 1
- php5.6 交叉编译,Cross-compile - 龙芯开源社区
- C++ 基类,子对象,派生类构造函数调用顺序
- python str translate,str.translate() --文本过滤和处理
- 管理任务执行-如何制定有效的机制
- C 获得程序执行时间
- Linux下使用awk批量删除共享内存
- 细节也可以决定网站中交互设计的成败
- [Wireshark]_002_玩转数据包
- Beyond Compare比较文件夹时如何忽略文件
- Ubuntu关闭cups打印机服务
- 前端VUE学习总结(一)
- 360显示服务器不可用,谢瑾:autodesk360服务不可用
- 工业企业外购材料进项税额的会计处理
- python实现ks算法_Python计算KS值并绘制KS曲线
- jenkins k8s 动态增减 jenkins-salve (1) 制作部署jenkins-master 镜像
- 量子信息 量子计算机的新闻,应用挑战知多少?美国学界公布量子信息路线图...
- oracle grant
- 学了Python基础,苦于无法上手实战,看这本
- PCB手工布线,覆铜,logo,倒圆角,制版
热门文章
- ECS事件通知之创建失败事件
- IM、RTC技术两生花,看融云如何打造“IM+RTC+Push”一站式通信云服务
- 腾讯优图发布四大平台产品,持续开放视觉AI能力
- 【建议珍藏系列】如果你这样回答「什么是线程安全」,面试官都会对你刮目相看!...
- python动态类型的坑_python进阶教程之动态类型详解
- wepy组件子父传值_【WePY小程序框架实战三】-组件传值
- 职称计算机Word2003是考什么,2017年职称计算机考试word2003考点
- oracle导出命令位置,ORACLE 导出导入命令说明
- 自动生成考勤表_可自动变色的考勤表,逢周末自动更新,你会制作吗?
- python画烟花的代码_电脑怎么用代码画烟花?