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的特殊设置
Oct 09 PHP
文件上传程序的全部源码
Oct 09 PHP
PHP操作Memcache实例介绍
Jun 14 PHP
ThinkPHP实现事务回滚示例代码
Jun 23 PHP
PHP中基本HTTP认证技巧分析
Mar 16 PHP
PHP中把有符号整型转换为无符号整型方法
May 27 PHP
PHP实现网站访问量计数器
Oct 27 PHP
Laravel源码解析之路由的使用和示例详解
Sep 27 PHP
PHP filesize函数用法浅析
Feb 15 PHP
PHP使用mysqli同时执行多条sql查询语句的实例
Mar 22 PHP
浅谈laravel 5.6 安装 windows上使用composer的安装过程
Oct 18 PHP
PHP使用PhpSpreadsheet操作Excel实例详解
Mar 26 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下通过file_get_contents的代理使用方法
2011/02/16 PHP
php实现获取局域网所有用户的电脑IP和主机名、及mac地址完整实例
2014/07/18 PHP
PHP模板引擎Smarty之配置文件在模板变量中的使用方法示例
2016/04/11 PHP
php实现文件预览功能
2017/05/23 PHP
替代window.event.srcElement效果的可兼容性的函数
2009/12/18 Javascript
获取内联和链接中的样式(js代码)
2013/04/11 Javascript
jquery easyui 对于开始时间小于结束时间的判断示例
2014/03/22 Javascript
javascript鼠标滑动评分控件完整实例
2015/05/13 Javascript
jquery UI Datepicker时间控件的使用及问题解决
2016/04/28 Javascript
Kendo Grid editing 自定义验证报错提示的解决方法
2016/11/18 Javascript
vue实现自定义多选与单选的答题功能
2018/07/05 Javascript
vue-cli 引入jQuery,Bootstrap,popper的方法
2018/09/03 jQuery
js常见遍历操作小结
2019/06/06 Javascript
JavaScript对象属性操作实例解析
2020/02/04 Javascript
了不起的11个JavaScript代码重构最佳实践小结
2021/01/11 Javascript
Python编程中的文件读写及相关的文件对象方法讲解
2016/01/19 Python
python获取list下标及其值的简单方法
2016/09/12 Python
python算法表示概念扫盲教程
2017/04/13 Python
Python中的探索性数据分析(功能式)
2017/12/22 Python
python时间日期函数与利用pandas进行时间序列处理详解
2018/03/13 Python
30秒轻松实现TensorFlow物体检测
2018/03/14 Python
Python实现合并两个列表的方法分析
2018/05/28 Python
详解python编译器和解释器的区别
2019/06/24 Python
浅谈django2.0 ForeignKey参数的变化
2019/08/06 Python
python3应用windows api对后台程序窗口及桌面截图并保存的方法
2019/08/27 Python
安装2019Pycharm最新版本的教程详解
2019/10/22 Python
python科学计算之narray对象用法
2019/11/25 Python
tensorflow如何继续训练之前保存的模型实例
2020/01/21 Python
Python logging模块写入中文出现乱码
2020/05/21 Python
Python基于Serializer实现字段验证及序列化
2020/11/04 Python
python实现三种随机请求头方式
2021/01/05 Python
CSS3属性 line-clamp控制文本行数的使用
2020/03/19 HTML / CSS
使用canvas实现黑客帝国数字雨效果
2020/01/02 HTML / CSS
美国知名艺术画网站:Art.com
2017/02/09 全球购物
税务专业毕业生自荐信
2013/11/10 职场文书
发展部经理职责规定
2014/02/22 职场文书