文档分类: 漏洞利用,代码审计
内容目录
-
前言
案例
细节分析1:正则的反向引用
细节分析2:非法字符被转换
细节分析3:可变变量
前言
本文将深入研究 preg_replace /e
模式下的代码执行问题,其中包括 preg_replace
函数的执行过程分析、正则表达式分析、漏洞触发分析,当中的趣味
非常多,相信看完本文,你一定会有所收获。
案例
下面先看一个案例,思考如何利用此处的 preg_replace /e
模式,执行代码(可以先不看下文分析,自己思考出 payload
试试)。
<?php
header("Content-Type: text/plain");
function complexStrtolower($regex, $value){
return preg_replace('/('. $regex. ')/ei', 'strtolower("\\1\")', $value);
}
var_dump($_GET);
foreach($_GET as $regex => $value){
echo complexStrtolower($regex, $value)."\n";
}
这个案例实际上很简单,就是 preg_replace
使用了 /e
模式,导致可以代码执行,而且该函数的第一个和第三个参数都是我们可以控制的。我们都知道, preg_replace
函数在匹配到符号正则的字符串时,会将替换字符串(也就是上图 preg_replace 函数的第二个参数)当做代码来执行,然而这里的第二个参数却固定为 'strtolower("\\1")'
字符串,那这样要如何执行代码呢?
细节分析1:正则的反向引用
上面的命令执行,相当于 eval('strtolower("\\1");')
结果,当中的 \\1
实际上就是 \1
,而 \1
在正则表达式中有自己的含义。我们来看看 W3Cschool 中对其的描述: