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 相关文章推荐
PHP 写文本日志实现代码
May 18 PHP
PHP中foreach循环中使用引用要注意的地方
Jan 02 PHP
PHP缓存技术的使用说明
Aug 06 PHP
PHP ? EasyUI DataGrid 资料取的方式介绍
Nov 07 PHP
php 批量替换html标签的实例代码
Nov 26 PHP
php 购物车完整实现代码
Jun 05 PHP
destoon实现底部添加你是第几位访问者的方法
Jul 15 PHP
帝国cms目录结构分享
Jul 06 PHP
浅析php静态方法与非静态方法的用法区别
May 17 PHP
Laravel SQL语句记录方式(推荐)
May 26 PHP
利用PHPExcel实现Excel文件的写入和读取
Apr 26 PHP
php面向对象基础详解【星际争霸游戏案例】
Jan 23 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
深入file_get_contents与curl函数的详解
2013/06/25 PHP
Yii学习总结之数据访问对象 (DAO)
2015/02/22 PHP
PHP简单操作MongoDB的方法(安装及增删改查)
2016/05/26 PHP
javascript实现的使用方向键控制光标在table单元格中切换
2010/11/17 Javascript
关于javascript中的typeof和instanceof介绍
2012/12/04 Javascript
修改file按钮的默认样式实现代码
2013/04/23 Javascript
网站404页面3秒后跳到首页的实例代码
2013/08/16 Javascript
Javascript 绘制 sin 曲线过程附图
2014/08/21 Javascript
JavaScript中判断两个字符串是否相等的方法
2015/07/07 Javascript
javascript实现将文件保存到本地方法汇总
2015/07/26 Javascript
Javascript实现网络监测的方法
2015/07/31 Javascript
bootstrap-treeview自定义双击事件实现方法
2016/01/09 Javascript
jquery获取form表单input元素值的简单实例
2016/05/30 Javascript
实现隔行换色效果的两种方式【实用】
2016/11/27 Javascript
jQuery实现6位数字密码输入框
2016/12/29 Javascript
vue.js 使用v-if v-else发现没有执行解决办法
2017/05/15 Javascript
jQuery实现的简单手风琴效果示例
2018/08/29 jQuery
JS集合set类的实现与使用方法示例
2019/02/01 Javascript
微信小程序实现拍照画布指定区域生成图片
2019/07/18 Javascript
解决Layui中templet中a的onclick参数传递的问题
2019/09/20 Javascript
JS实现拼图游戏
2021/01/29 Javascript
跟老齐学Python之传说中的函数编写条规
2014/10/11 Python
为什么str(float)在Python 3中比Python 2返回更多的数字
2018/10/16 Python
Python requests模块实例用法
2019/02/11 Python
Django中如何使用sass的方法步骤
2019/07/09 Python
python 实现在无序数组中找到中位数方法
2020/03/03 Python
html5指南-7.geolocation结合google maps开发一个小的应用
2013/01/07 HTML / CSS
html5的canvas元素使用方法介绍(画矩形、画折线、圆形)
2014/04/14 HTML / CSS
Adobe Html5 Extension开发初体验图文教程
2017/11/14 HTML / CSS
美国翻新电子产品商店:The Store
2019/10/08 全球购物
2013的个人自我评价
2013/12/26 职场文书
大学生文员专业个人求职信范文
2014/01/05 职场文书
借款担保书范文
2014/05/13 职场文书
2019教师的学习计划
2019/06/25 职场文书
MySQL 如何设计统计数据表
2021/06/15 MySQL
浅谈音视频 pts dts基本概念及理解
2022/08/05 数码科技