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 相关文章推荐
Excel数据导入Mysql数据库的实现代码
Jun 05 PHP
php 生成静态页面的办法与实现代码详细版
Feb 15 PHP
php下使用strpos需要注意 === 运算符
Jul 17 PHP
PHP网页游戏学习之Xnova(ogame)源码解读(三)
Jun 23 PHP
PHP中创建和验证哈希的简单方法实探
Jul 06 PHP
摘自织梦CMS中的图片处理类
Aug 08 PHP
Symfony2 session用法实例分析
Feb 04 PHP
thinkphp3.x连接mysql数据库的方法(具体操作步骤)
May 19 PHP
PHP与服务器文件系统的简单交互
Oct 21 PHP
php 开发中加密的几种方法总结
Mar 22 PHP
Yii输入正确验证码却验证失败的解决方法
Jun 06 PHP
PHP优化之批量操作MySQL实例分析
Apr 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
基于mysql的论坛(7)
2006/10/09 PHP
PHP文件下载类
2006/12/06 PHP
SMARTY学习手记
2007/01/04 PHP
深入php define()函数以及defined()函数的用法详解
2013/06/05 PHP
PHP实现图片裁剪、添加水印效果代码
2014/10/01 PHP
PHP实现PDO的mysql数据库操作类
2014/12/12 PHP
PHP使用递归生成文章树
2015/04/21 PHP
关于IE、Firefox、Opera页面呈现异同 写脚本很痛苦
2009/08/28 Javascript
JQuery切换显示的效果实例代码
2013/02/27 Javascript
js实现select跳转菜单新窗口效果代码分享(超简单)
2015/08/21 Javascript
javascript基础知识分享之类与函数化
2016/02/13 Javascript
利用JQuery写一个简单的异步分页插件
2016/03/07 Javascript
jquery获取所有选中的checkbox实现代码
2016/05/26 Javascript
JS弹出窗口插件zDialog简单用法示例
2016/06/12 Javascript
JavaScript实现页面定时刷新(定时器,meta)
2016/10/12 Javascript
Javascript中常用类型的格式化方法小结
2016/12/26 Javascript
angular+webpack2实战例子
2017/05/23 Javascript
AngularJS实现自定义指令与控制器数据交互的方法示例
2017/06/19 Javascript
vue2中使用sass并配置全局的sass样式变量的方法
2018/09/04 Javascript
JavaScript中的垃圾回收与内存泄漏示例详解
2019/05/02 Javascript
VUE项目中加载已保存的笔记实例方法
2019/09/14 Javascript
Nuxt v-bind绑定img src不显示的解决
2019/12/05 Javascript
jquery实现烟花效果(面向对象)
2020/03/10 jQuery
[08:08]DOTA2-DPC中国联赛2月28日Recap集锦
2021/03/11 DOTA
跟老齐学Python之再深点,更懂list
2014/09/20 Python
详解Django框架中用context来解析模板的方法
2015/07/20 Python
python实现数据写入excel表格
2018/03/25 Python
python中struct模块之字节型数据的处理方法
2019/08/27 Python
CentOS7下安装python3.6.8的教程详解
2020/01/03 Python
在python中使用pymysql往mysql数据库中插入(insert)数据实例
2020/03/02 Python
Snapfish爱尔兰:在线照片打印和个性化照片礼品
2018/09/17 全球购物
团队队名口号大全
2014/06/06 职场文书
忠诚教育心得体会
2014/09/03 职场文书
学习党的群众路线对照检查材料
2014/09/29 职场文书
优秀班集体事迹材料
2014/12/25 职场文书
《正比例》教学反思
2016/02/23 职场文书