preg_replace相关问题
preg_replace
preg_replace 函数执行一个正则表达式的搜索和替换。
语法:
preg_replace ( mixed $pattern , mixed $replacement , mixed $subject [, int $limit = -1 [, int >&$count ]] ) : mixed
参数:
$pattern: 要搜索的模式,可以是字符串或一个字符串数组。
$replacement: 用于替换的字符串或字符串数组。
$subject: 要搜索替换的目标字符串或字符串数组。
$limit: 可选,对于每个模式用于每个 subject 字符串的最大可替换次数。 默认是-1(无限制)。
$count: 可选,为替换执行的次数。
0x01 /e修饰符
在php5+,若正则表达式pattern有/e修饰符,并且成功匹配,就会把replacement的值当作php代码执行,例如:
preg_replace('/(abc)/e', 'phpinfo();', '123abc');
这种危险的做法在php5.5+会发出警告,在php7已经废除
0x02经典漏洞
<?php
$str = addslashes($_GET['option']);
$file = file_get_contents('./option.php');
$file = preg_replace('|\$option=\'.*\';|',"\$option='$str';",$file);
file_put_contents('xxxxx/option.php',$file);
解法这篇文章写的很详细:
链接
0x03
代码如下:
foreach ($_GET as $regex => $value) {
preg_replace('/(' . $regex . ')/ei','strtolower("\\1")',$value);
}
例如?a=abc
就会在abc当中匹配a,匹配成功,并且是/e修饰符,就会将strtolower("\1")执行,也就是:
eval(strtolower("\1"));
而\1变成\1
每个这样的引用将被匹配到的第n个捕获子组捕获到的文本替换。 n可以是0-99,\0和$0代表完整的模式匹配文本。
\1也就是匹配到的第一个子组
先不看结果,理想情况是
.*?=${phpinfo()}
${phpinfo()}是将phpinfo()当作一个变量,此时匹配就变成:
preg_replace('/(.*)/ei', 'strtolower("\\1")', ${phpinfo()});
.*全部匹配${phpinfo()},由于这里只有一组匹配项,所以\1=phpinfo(),转换为小写不影响,成功构造出phpinfo()
而由于php的特性,包括空格 + [ ] . 等都会转化成_
可以用\S匹配非空白字符
preg_replace相关问题的更多相关文章
- 嵌入式单片机STM32应用技术(课本)
目录SAIU R20 1 6 第1页第1 章. 初识STM32..................................................................... ...
- PHP获取手机相关信息
该PHP操作类实现获取手机号手机头信息,取UA,取得手机类型,判断是否是opera,判断是否是m3gate,取得HA,取得手机IP 代码如下: <?php /** * @desc 手机操作类 获 ...
- PHPWeb开发相关知识
转载:https://blog.csdn.net/wj610671226/article/details/78426698 正则表达式 作用:分割.查找.匹配.替换字符串 分割符:正斜线(/).has ...
- php array数组的相关处理函数and str字符串处理与正则表达式
下面给各位同学整理了一些关于php array数组的相关处理函数and str字符串处理与正则表达式,希望文章对你会有所帮助. 数组的相关处理函数: 1)数组的键值操作函数 array_value ...
- php 文件包含base64读取文件 preg_replace函数
解题部分题目来源攻防世界web高手进阶区1.拿到题目以后,发现是一个index.php的页面,并且设备-没有显示完全,此位置可疑.2.源代码中发现?page=index,出现page这个get参数,联 ...
- preg_replace函数/e 模式下的代码执行+一道例题
目录 例一 例二 补充 看一道ctf题-----[BJDCTF2020]ZJCTF,不过如此 参考链接 例一 源码: <?php preg_replace('/(.*)/ei', 'strtol ...
- 齐博x1再来个抛砖引玉 内容页根据关键词调用相关内容 新功能哦!
昨天升级了一个隐藏的功能,今天就简单的做个说明怎么用,反正也不能浪费不是 那就用内容页面关键词读取相关内容为例吧. 前台是你模型中已经存在keywords字段 关键词支持 空格分割,号分割 那么就开 ...
- java中的字符串相关知识整理
字符串为什么这么重要 写了多年java的开发应该对String不陌生,但是我却越发觉得它陌生.每学一门编程语言就会与字符串这个关键词打不少交道.看来它真的很重要. 字符串就是一系列的字符组合的串,如果 ...
- SQL Server相关书籍
SQL Server相关书籍 (排名不分先后) Microsoft SQL Server 企业级平台管理实践 SQL Server 2008数据库技术内幕 SQL Server性能调优实战 SQL S ...
随机推荐
- Codeforces Round #599 (Div. 2) B2. Character Swap (Hard Version)
This problem is different from the easy version. In this version Ujan makes at most 2n2n swaps. In a ...
- AcWing 837. 连通块中点的数量
#include <iostream> using namespace std; ; int n, m; int p[N], size[N]; int find(int x) { if ( ...
- 7-3 Path to Infinity(还没ac)
留坑 #include<bits/stdc++.h> using namespace std; ; ; typedef long long ll; string s,t; ,tol2=,t ...
- 【C语言】一元二次方程(求实根和虚根)
求一元二次方程:ax2+bx+c=0 的根. 输入三个实数a,b,c的值,且a不等于0. #include<stdio.h> #include<math.h> int main ...
- Cesium 基于MapBox底图加载3DTiles 模型
3DTiles 模型采用 CATIA V5 R22 --->3dxml --->GLB--->B3DM var extent = Cesium.Rectangle.fromDeg ...
- websocket对象及方法
# websocket对象及方法 1.websocket对象 以下 API 用于创建 WebSocket 对象. var Socket = new WebSocket(url, [protocol] ...
- 原生js按回车键实现登录
这篇文章主要介绍了原生JS按回车键实现登录的方法,众所周知,这是在web程序设计中的一个非常实用的小技巧,主要用于表单提交,包括注册.登录等等功能,具有很好的用户体验,有着非常广泛的实用价值,需要的朋 ...
- 通过web页面修改nginx配置
资源路径:https://download.csdn.net/download/song_yan_/12002460 nginx动态配置 一.页面展示 二.前端代码 (1)jsp页面(nginxCon ...
- Jmeter_正则表达式提取器_提取数组 & For Each 控制器
1.举例: https://demodaojia.ecjia.com/ 提取黄色标注的这些内容 2. 3. 匹配数字:-1 表示匹配全部,0表示随机一个 4. 5.我们获取了10组数据,通过正则提取器 ...
- 关于强化神兽(圣兽)DBC参数详解
狗的攻击类型是114,名称.攻击类型.攻击图像.怪物样子.怪物等级.不死系.破隐身.经验值.生命值.魔法值.防御.魔防.最小攻击.最大攻击.魔法力.道术力.敏捷.准确.行走速度.一步几格.行走等待.攻 ...