版本
- php5.5.0以下,php5.5.0以上,已经被废弃
前置知识
有如下代码:
<?php preg_replace("/test/e",$_GET["a"],"jutst test");?>
preg_replace("/pattern/e", replacement, subject)
解释:
/pattern/
:这是正则表达式模式,用于匹配字符串中的特定部分。
/e
:是一个非常关键的选项,表示 PHP 会在替换时执行替换内容中的 PHP 代码(通过 eval()来执行
)。e
被认为是危险的,因为它允许在替换过程中执行任意的 PHP 代码,从而可能导致安全漏洞。
replacement
:这是用来替换匹配部分的内容。在这个例子中,$_GET["a"]
将作为替换内容,并且 PHP 会执行 $_GET["a"]
中的 PHP 代码。也就是说用来替换的内容会经一次eval。
subject
:这是要进行搜索和替换的原始字符串。在这个例子中,原始字符串是 "jutst test"
。
意为在 “this is a test” 字符串中找到 “test”,并将其替换为通过$_GET["a"]获取的代码执行结果
也就是说只要提交GET参数“a”的内容为php代码,即可实现远程代码执行,比如提交:
?a=phpinfo();
便会回显phpinfo页面