PHP中一个有趣的preg_replace函数详解


Posted in PHP onAugust 15, 2018

0x01 起因

事情的起因是下午遇到了 preg_replace 函数,我们都知道 preg_replace 函数可能会导致命令执行。现在我们来一些情况。

0x02 经过

踩坑1:

测试代码大概是这样的:

foreach ($_GET as $regex => $value) {
 preg_replace('/(' . $regex . ')/ei','strtolower("\\1")',$value);
}

测试过程中发现通过浏览器的方式传入数据的时候,会将 . + 等特殊字符转换为 _ 。

PHP中一个有趣的preg_replace函数详解

PHP中一个有趣的preg_replace函数详解

这里涉及到了php的一个特性

php自身在解析请求的时候,如果参数名字中包含空格、.、[等字符,会将他们转换成_。

<?php
$a = $_GET;
var_dump($a);
?>

PHP中一个有趣的preg_replace函数详解

经过我的fuzz,结果如下图:

PHP中一个有趣的preg_replace函数详解

踩坑2:

那我们知道 preg_replace 的 /e 修正符会将 replacement 参数当作 php 代码,并且以 eval 函数的方式执行,前提是 subject 中有 pattern 的匹配。既然是这样我们看一张图。

PHP中一个有趣的preg_replace函数详解

图中实际上通过 eval 执行的是 strtolower 函数。分别实际执行的是:

strtolower("JUST TEST");
strtolower("PHPINFO()");
strtolower("{${PHPINFO()}}");

第三个之所以可以执行代码,是因为我们通过复杂(花括号)语法的方式来让其代码执行。

踩坑3:

回到源代码中,我们再理解一下:

foreach ($_GET as $regex => $value) {
 preg_replace('/(' . $regex . ')/ei','strtolower("\\1")',$value);
}

这里的 replacement 是 strtolower(“\\1”) ,着重理解一下 \\1 。

每个这样的引用将被匹配到的第n个捕获子组捕获到的文本替换。 n可以是0-99,\0和\$0代表完整的模式匹配文本。

假设一个正则表达式是这样的:

preg_replace('/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i', '$1$2$4', $url . '&');

这里的 \$1\$2\$4 等同于上面的 \1\2\4 的作用,因此我们看一下是怎么选择匹配的。

$1 $2   $3 $4
'/(.*)(\?|&)' . $key . '=[^&]+?(&)(.*)/i'

0x03 解决

好了上面都已经铺垫完坑了,这里要开始解决了。

foreach ($_GET as $regex => $value) {
 preg_replace('/(' . $regex . ')/ei','strtolower("\\1")',$value);
}

我们想要让这部分代码达到代码执行的效果需要达到几个条件:

  • pattern 部分的表达式需要命中 \$value 中的数据
  • \1 中取出的数据复杂(花括号)语法的特征,来保证在双引号的包含下达到代码执行的效果
  • 由于php的特性url会将 . 、 [ 、 + 等特殊字符转换为 _ 。

我们知道这里是通过 get 方式获取到 \$regex 和 \$value 的,要想在 replacement 部分通过 \1 截取到 pattern 正则匹配命中 \$value 中的数据,并且携带 \$ 、 { 、 ( 这里就涉及到正则表达式的使用了。

这里我选择了 \S ,也就是匹配任意的非空白字符,那么最后的payload长这样

\S*()={${phpinfo()}}

PHP中一个有趣的preg_replace函数详解

PHP中一个有趣的preg_replace函数详解

0x04 后记

其实还有点小问题,我这边没有写,不过大家可以看看这个深入研究preg_replace与代码执行。

总结

以上就是这篇文章的全部内容了,希望本文的内容对大家的学习或者工作具有一定的参考学习价值,如果有疑问大家可以留言交流,谢谢大家对三水点靠木的支持。

PHP 相关文章推荐
PHP4.04简明安装
Oct 09 PHP
ecshop 订单确认中显示省市地址信息的方法
Mar 15 PHP
PHP获取文件绝对路径的代码(上一级目录)
May 29 PHP
谨慎使用PHP的引用原因分析
Sep 06 PHP
PHP删除HTMl标签的三种解决方法
Jun 30 PHP
PHP中使用Session配合Javascript实现文件上传进度条功能
Oct 15 PHP
php简单实现多字节字符串翻转的方法
Mar 31 PHP
PHP中如何使用session实现保存用户登录信息
Oct 20 PHP
thinkphp项目如何自定义微信分享描述内容
Feb 20 PHP
PHP开发实现微信退款功能示例
Nov 25 PHP
php格式文件打开的四种方法
Feb 24 PHP
PHP Trait功能与用法实例分析
Jun 03 PHP
PHP使用curl_multi_select解决curl_multi网页假死问题的方法
Aug 15 #PHP
php+croppic.js实现剪切上传图片功能
Aug 14 #PHP
PHP设计模式之委托模式定义与用法简单示例
Aug 13 #PHP
PHP设计模式之建造者模式定义与用法简单示例
Aug 13 #PHP
PHP设计模式之装饰器模式定义与用法简单示例
Aug 13 #PHP
PHP实现的ID混淆算法类与用法示例
Aug 10 #PHP
PHP+ajax实现二级联动菜单功能示例
Aug 10 #PHP
You might like
PHP函数spl_autoload_register()用法和__autoload()介绍
2012/02/04 PHP
thinkphp框架类库扩展操作示例
2019/11/26 PHP
thinkphp 框架数据库切换实现方法分析
2020/05/18 PHP
Aster vs KG BO3 第一场2.18
2021/03/10 DOTA
javascript的函数
2007/01/31 Javascript
javascript this用法小结
2008/12/19 Javascript
jQuery 打造动态渐变按钮 详细图文教程
2010/04/25 Javascript
cookie在javascript中的使用技巧以及隐私在服务器端的设置
2012/12/03 Javascript
jQuery弹出框代码封装DialogHelper
2015/01/30 Javascript
浅谈JavaScript字符串拼接
2015/06/25 Javascript
基于jQuery实现文本框只能输入数字(小数、整数)
2016/01/14 Javascript
深入解析AngularJS框架中$scope的作用与生命周期
2016/03/05 Javascript
详解webpack+vue-cli项目打包技巧
2017/06/17 Javascript
详解Vue的computed(计算属性)使用实例之TodoList
2017/08/07 Javascript
vue+Java后端进行调试时解决跨域问题的方式
2017/10/19 Javascript
Vue-Router实现组件间跳转的三种方法
2017/11/07 Javascript
解决vue 更改计算属性后select选中值不更改的问题
2018/03/02 Javascript
webpack配置打包后图片路径出错的解决
2018/04/26 Javascript
快速解决vue动态绑定多个class的官方实例语法无效的问题
2018/09/05 Javascript
JavaScript格式化json和xml的方法示例
2019/01/22 Javascript
vue中keep-alive组件的入门使用教程
2019/06/06 Javascript
微信小程序转化为uni-app项目的方法示例
2020/05/22 Javascript
Python使用中文正则表达式匹配指定中文字符串的方法示例
2017/01/20 Python
Python编程之event对象的用法实例分析
2017/03/23 Python
Jupyter安装nbextensions,启动提示没有nbextensions库
2020/04/23 Python
Python中的引用和拷贝实例解析
2019/11/14 Python
python GUI编程(Tkinter) 创建子窗口及在窗口上用图片绘图实例
2020/03/04 Python
Python关键字及可变参数*args,**kw原理解析
2020/04/04 Python
日本最大的购物网站乐天市场国际版:Rakuten Global Market(支持中文)
2020/02/03 全球购物
挂职思想汇报
2013/12/31 职场文书
土木工程师职业规划范文
2014/03/07 职场文书
乡镇保密工作责任书
2014/07/28 职场文书
新兵入伍心得体会
2014/09/04 职场文书
给女朋友的道歉短信
2015/05/12 职场文书
高二数学教学反思
2016/02/18 职场文书
工伤调解协议书
2016/03/21 职场文书