ID: 47796
User updated by: spam04 at pornel dot net
Reported By: spam04 at pornel dot net
Status: Open
Bug Type: PCRE related
Operating System: *
PHP Version: 5.2.9
New Comment:
I forgot to add echo before preg_replace() in reproduce code.
Previous Comments:
------------------------------------------------------------------------
[2009-03-26 22:36:08] spam04 at pornel dot net
Description:
------------
preg_replace does not escape $ character. If double quotes are used in
replacement code, this enables unwanted injection of variables or even
execution of PHP code.
My suggestion is to escape $ character and discourage use of single
quotes in replacement code (because they're not compatible with the way
$ and " are escaped).
Reproduce code:
---------------
// simple case:
preg_replace('/.*/e','strtoupper("$0")', '$foo');
// code execution:
class test
{
function pwnd() {echo "pwnd!\n";}
function replace($str)
{
preg_replace('/.*/e','strtoupper("$0")', $str);
}
}
$t = new test();
$t->replace('{$this->pwnd()}');
Expected result:
----------------
$FOO
{$THIS->PWND()}
Actual result:
--------------
PHP Notice: Undefined variable: foo
pwnd!
------------------------------------------------------------------------
--
Edit this bug report at http://bugs.php.net/?id=47796&edit=1