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 信息采集程序代码
Mar 17 PHP
PHPMyadmin 配置文件详解(配置)
Dec 03 PHP
php 上传功能实例代码
Apr 13 PHP
通过JavaScript或PHP检测Android设备的代码
Mar 09 PHP
PHP 5.3 下载时 VC9、VC6、Thread Safe、Non Thread Safe的区别分析
Mar 28 PHP
再Docker中架设完整的WordPress站点全攻略
Jul 29 PHP
php使用pdo连接sqlite3的配置示例
May 27 PHP
PHP7新增运算符用法实例分析
Sep 26 PHP
php删除数组指定元素实现代码
May 03 PHP
利用laravel+ajax实现文件上传功能方法示例
Aug 13 PHP
PHP基于phpqrcode类生成二维码的方法详解
Mar 14 PHP
php求斐波那契数的两种实现方式【递归与递推】
Sep 09 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.ini中添加extension=php_mysqli.dll指令的说明
2007/06/14 PHP
php读取文件内容的几种方法详解
2013/06/26 PHP
Zend Framework教程之Zend_Db_Table_Row用法实例分析
2016/03/21 PHP
JavaScript 全角转半角部分
2009/10/28 Javascript
Javascript学习笔记-详解in运算符
2011/09/13 Javascript
常见JS效果之图片减速度滚动实现代码
2011/12/08 Javascript
js模拟hashtable的简单实例
2014/03/06 Javascript
7个让JavaScript变得更好的注意事项
2015/01/28 Javascript
JS设置网页图片vspace和hspace属性的方法
2015/04/01 Javascript
jQuery实现响应鼠标滚动的动感菜单效果
2015/09/21 Javascript
JS数组合并push与concat区别分析
2015/12/17 Javascript
JavaScript实现九九乘法表的简单实例
2016/06/07 Javascript
浅谈js中test()函数在正则中的使用
2016/08/19 Javascript
JS限制条件补全问题实例分析
2016/12/16 Javascript
JavaScript实现星星等级评价功能
2017/03/22 Javascript
Angularjs的启动过程分析
2017/07/18 Javascript
详解Node.js利用node-git-server快速搭建git服务器
2017/09/27 Javascript
JS模拟实现哈希表及应用详解
2018/05/04 Javascript
Vue表单控件数据绑定方法详解
2020/02/05 Javascript
Python实现抓取网页并且解析的实例
2014/09/20 Python
详解Python实现按任意键继续/退出的功能
2016/08/19 Python
django query模块
2019/04/20 Python
Python切片操作去除字符串首尾的空格
2019/04/22 Python
Python实现直播推流效果
2019/11/26 Python
Python Django2 model 查询介绍(条件、范围、模糊查询)
2020/03/16 Python
详解如何修改jupyter notebook的默认目录和默认浏览器
2021/01/24 Python
python 获取计算机的网卡信息
2021/02/18 Python
捷克领先的户外服装及配件市场零售商:ALPINE PRO
2018/01/09 全球购物
Ajax和javascript的区别
2013/07/20 面试题
经理秘书岗位职责
2013/11/14 职场文书
镇人大副主席民主生活会对照检查材料思想汇报
2014/10/01 职场文书
模范教师材料大全
2014/12/16 职场文书
2015年艾滋病宣传活动总结
2015/03/27 职场文书
2015年社区创卫工作总结
2015/04/21 职场文书
交通事故调解协议书
2015/05/20 职场文书
2019幼儿园感恩节活动策划书
2019/11/28 职场文书