From: 5up3rh3i at gmail dot com
Operating system: Any
PHP version: 5.2.9
PHP Bug Type: mbstring related
Bug description: mb_ereg(i)_replace() evaluate replacement string vulnerability
Description:
------------
when option parameter set e, matches not be escaped.
ex:
<?php
function 80vul() {}
$str = '\', phpinfo(), \'';
mb_ereg_replace('^(.*)$', '80vul(\'\1\')', $str, 'e');
?>
phpinfo() will be evaluated.
mb_ereg_replace()
if ((replace_len - i) >= 2 && fwd == 1 &&
p[0] == '\\' && p[1] >= '0' && p[1] <=
'9') {
n = p[1] - '0';
}
if (n >= 0 && n < regs->num_regs) {
if (regs->beg[n] >= 0 && regs->beg[n] <
regs->end[n] && regs->end[n]
<= string_len) {
smart_str_appendl(pbuf, string
+ regs->beg[n], regs->end[n] -
regs->beg[n]);
// matches not be escaped
}
preg_replace()
if ('\\' == *walk || '$' == *walk) {
smart_str_appendl(&code, segment, walk - segment);
if (walk_last == '\\') {
code.c[code.len-1] = *walk++;
segment = walk;
walk_last = 0;
continue;
}
segment = walk;
if (preg_get_backref(&walk, &backref)) {
if (backref < count) {
/* Find the corresponding string match
and substitute it
in instead of the backref */
match = subject + offsets[backref<<1];
match_len = offsets[(backref<<1)+1] -
offsets[backref<<1];
if (match_len) {
esc_match =
php_addslashes_ex(match, match_len, &esc_match_len, 0, 1
TSRMLS_CC);
// matches escaped by addslashes()
...
smart_str_appendl(&code, esc_match,
esc_match_len);
--
Edit bug report at http://bugs.php.net/?id=48180&edit=1
--
Try a CVS snapshot (PHP 5.2):
http://bugs.php.net/fix.php?id=48180&r=trysnapshot52
Try a CVS snapshot (PHP 5.3):
http://bugs.php.net/fix.php?id=48180&r=trysnapshot53
Try a CVS snapshot (PHP 6.0):
http://bugs.php.net/fix.php?id=48180&r=trysnapshot60
Fixed in CVS:
http://bugs.php.net/fix.php?id=48180&r=fixedcvs
Fixed in CVS and need be documented:
http://bugs.php.net/fix.php?id=48180&r=needdocs
Fixed in release:
http://bugs.php.net/fix.php?id=48180&r=alreadyfixed
Need backtrace:
http://bugs.php.net/fix.php?id=48180&r=needtrace
Need Reproduce Script:
http://bugs.php.net/fix.php?id=48180&r=needscript
Try newer version:
http://bugs.php.net/fix.php?id=48180&r=oldversion
Not developer issue:
http://bugs.php.net/fix.php?id=48180&r=support
Expected behavior:
http://bugs.php.net/fix.php?id=48180&r=notwrong
Not enough info:
http://bugs.php.net/fix.php?id=48180&r=notenoughinfo
Submitted twice:
http://bugs.php.net/fix.php?id=48180&r=submittedtwice
register_globals:
http://bugs.php.net/fix.php?id=48180&r=globals
PHP 4 support discontinued: http://bugs.php.net/fix.php?id=48180&r=php4
Daylight Savings: http://bugs.php.net/fix.php?id=48180&r=dst
IIS Stability:
http://bugs.php.net/fix.php?id=48180&r=isapi
Install GNU Sed:
http://bugs.php.net/fix.php?id=48180&r=gnused
Floating point limitations:
http://bugs.php.net/fix.php?id=48180&r=float
No Zend Extensions:
http://bugs.php.net/fix.php?id=48180&r=nozend
MySQL Configuration Error:
http://bugs.php.net/fix.php?id=48180&r=mysqlcfg