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 相关文章推荐
一个阿拉伯数字转中文数字的函数
Oct 09 PHP
PHP文本操作类
Nov 25 PHP
php echo()和print()、require()和include()函数区别说明
Mar 27 PHP
php 阴历-农历-转换类代码
Jan 16 PHP
浅析SVN常见问题及解决方法
Jun 21 PHP
php+ajax实时刷新简单实例
Feb 25 PHP
PHP简单判断字符串是否包含另一个字符串的方法
Mar 25 PHP
Thinkphp和onethink实现微信支付插件
Apr 13 PHP
laravel配置Redis多个库的实现方法
Apr 10 PHP
laravel在中间件内生成参数并且传递到控制器中的2种姿势
Oct 15 PHP
关于laravel 日志写入失败问题汇总
Oct 17 PHP
PHP使用JpGraph绘制折线图操作示例【附源码下载】
Oct 18 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获取类中常量,属性,及方法列表的方法
2009/04/09 PHP
linux下使用ThinkPHP需要注意大小写导致的问题
2011/08/02 PHP
ThinkPHP中pathinfo的访问模式、路径访问模式及URL重写总结
2014/08/23 PHP
10款新鲜出炉的 jQuery 插件(Ajax 插件,有幻灯片、图片画廊、菜单等)
2011/06/08 Javascript
js实现双向链表互联网机顶盒实战应用实现
2011/10/28 Javascript
游览器中javascript的执行过程(图文)
2012/05/20 Javascript
比较新旧两个数组值得增加和删除的JS代码
2013/10/30 Javascript
基于javascript滚动图片具体实现
2013/11/18 Javascript
jQuery判断checkbox(复选框)是否被选中以及全选、反选实现代码
2014/02/21 Javascript
js QQ客服悬浮效果实现代码
2014/12/12 Javascript
JS中frameset框架弹出层实例代码
2016/04/01 Javascript
灵活使用数组制作图片切换js实现
2016/07/28 Javascript
jQuery实现的自适应焦点图效果完整实例
2016/08/24 Javascript
jQuery.ajax实现根据不同的Content-Type做出不同的响应
2016/11/03 Javascript
简单实现JS倒计时效果
2016/12/23 Javascript
利用JS实现文字的聚合动画效果
2017/01/22 Javascript
浅谈Angular HttpClient简单入门
2018/05/04 Javascript
微信小程序canvas实现刮刮乐效果
2018/07/09 Javascript
ES6中定义类和对象的方法示例
2019/07/31 Javascript
Vue页面刷新记住页面状态的实现
2019/12/27 Javascript
VUE使用 wx-open-launch-app 组件开发微信打开APP功能
2020/08/11 Javascript
[02:43]DOTA2英雄基础教程 圣堂刺客
2013/12/09 DOTA
[44:37]完美世界DOTA2联赛PWL S3 Forest vs access 第一场 12.11
2020/12/13 DOTA
Sublime开发python程序的示例代码
2018/01/24 Python
python如何读写csv数据
2018/03/21 Python
python opencv实现切变换 不裁减图片
2018/07/26 Python
对python插入数据库和生成插入sql的示例讲解
2018/11/14 Python
Python基于matplotlib画箱体图检验异常值操作示例【附xls数据文件下载】
2019/01/07 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
2019/07/22 Python
2013年学期结束动员演讲稿
2014/01/07 职场文书
会计出纳员的自我评价
2014/01/15 职场文书
追悼会答谢词
2015/01/05 职场文书
孟佩杰观后感
2015/06/17 职场文书
给朋友的赠语
2015/06/23 职场文书
生日寿星公答谢词
2015/09/29 职场文书
2016五四青年节活动总结范文
2016/04/06 职场文书