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
搜索和替换文件或目录的一个好类--很实用
Oct 09 PHP
php读取mssql的ntext字段返回值为空的解决方法
Dec 30 PHP
php实现检查文章是否被百度收录
Jan 27 PHP
Smarty foreach控制循环次数的一些方法
Jul 01 PHP
使用ltrace工具跟踪PHP库函数调用的方法
Apr 25 PHP
Linux环境下php实现给网站截图的方法
May 03 PHP
php简单解析mysqli查询结果的方法(2种方法)
Jun 29 PHP
浅析PHP中的闭包和匿名函数
Dec 25 PHP
laravel 实现关闭CSRF(全部关闭、部分关闭)
Oct 21 PHP
PHP常用函数之格式化时间操作示例
Oct 21 PHP
在 Laravel 6 中缓存数据库查询结果的方法
Dec 11 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文本转图片自动换行的方法
2013/03/13 PHP
Laravel5.7 数据库操作迁移的实现方法
2019/04/12 PHP
javascript引用对象的方法
2007/01/11 Javascript
用javascript实现的支持lrc歌词的播放器
2007/05/17 Javascript
关于document.cookie的使用javascript
2008/04/11 Javascript
js 对联广告、漂浮广告封装类(IE,FF,Opera,Safari,Chrome
2009/11/26 Javascript
js通过location.search来获取页面传来的参数
2014/09/11 Javascript
jQuery实现html元素拖拽
2015/07/21 Javascript
Angularjs的ng-repeat中去除重复数据的方法
2016/08/05 Javascript
简单谈谈关于 npm 5.0 的新坑
2017/06/08 Javascript
详解如何使用 vue-cli 开发多页应用
2017/12/16 Javascript
学习Vue组件实例
2018/04/28 Javascript
Canvas实现微信红包照片效果
2018/08/21 Javascript
JS 实现微信扫一扫功能
2018/09/14 Javascript
vue-router的两种模式的区别
2019/05/30 Javascript
[01:34]完美“圣”典宣传片震撼发布,12.17与你不见不散
2016/12/16 DOTA
浅谈python中scipy.misc.logsumexp函数的运用场景
2016/06/23 Python
Python创建对称矩阵的方法示例【基于numpy模块】
2017/10/12 Python
python traceback捕获并打印异常的方法
2018/08/31 Python
Django restframework 源码分析之认证详解
2019/02/22 Python
Python3使用PySynth制作音乐的方法
2019/09/09 Python
Python+Redis实现布隆过滤器
2019/12/08 Python
安装PyInstaller失败问题解决
2019/12/14 Python
Python分类测试代码实例汇总
2020/07/23 Python
Canvas 像素处理之改变透明度的实现代码
2019/01/08 HTML / CSS
mysql的最长数据库名,表名,字段名可以是多长
2014/04/21 面试题
介绍一下HDLC(High-Level Data Link Control)高层数据链路协议
2012/01/21 面试题
如何安装ruby on rails
2014/02/09 面试题
创业计划书中包含的9个方面
2013/12/26 职场文书
继承权公证书
2014/04/09 职场文书
网络管理员岗位职责
2015/02/12 职场文书
外贸采购员岗位职责
2015/04/03 职场文书
民间借贷纠纷答辩状
2015/08/03 职场文书
好段摘抄大全(48句)
2019/08/08 职场文书
2021-4-5课程——SQL Server查询【3】
2021/04/05 SQL Server
Java实现房屋出租系统详解
2021/10/05 Java/Android