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

Reply via email to