Авторские статьи Отправляем данные серверу.

Discussion in 'Статьи' started by Talisman, 10 Mar 2007.

  1. Talisman

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

    Joined:
    22 Apr 2006
    Messages:
    400
    Likes Received:
    151
    Reputations:
    80
    Отправляем данные серверу. Http протокол.

    HTTP протокол:
    Hypertext Transfer Protocol (HTTP, протокол передачи гипертекста) -
    это язык, которым клиенты и серверы World Wide Web пользуются для общения
    между собой. Он, по сути дела, является основой в Web.
    Из всего протокола нам нужно уяснить структуру его пакета - тип(только в пакетах клиент-сервер)+заголовоки+данные.
    В заголовках передается информация о клиенте, или о сервере (инфа отправителя и инфа о содержимом данных).
    Вот дамп данных, идущих сереру от FireFox`a:
    первые 2 строчки обязательны - в них указывается тип запроса, и хост, на который он идет, далее идет инфа от браузера и всякий бред :)
    Наиболее интересными и частоизменяемыми в хакерских целях являются поля:
    кукисы, передаваемые серверу:
    Cookie: L=1173559675.28403277; mesort=from;
    поле Referer - откуда нас сюда послали:
    Referer: http://ya.ru
    и поле X_FORWARDED_FOR, которое передает неанонимный проксисервер :
    X_FORWARDED_FOR: 12.153.13.24
    ведь сюда мы можем подставить все, что угодно, а серверное ПО может обработать такую информацию некорректно - иксс, инъекция кода и тому подобное, существует очень много уязвимостей, использующих эти поля.

    Итак, метод GET посылает запрос на сервер, и читает ответ - заголовки сервера и тело ответа - используется класика сплойтостроения - провести инъекцию через уязвимый параметр и получить ответ с результатом.
    Метод POST аналогичен методу гет, только с помощью него можно передавать больше данных - аналогично, только если данные передаются формой.
    Метод HEAD - отправляет запрос на сервер, но получает только заголовок - используется в брутах и досерах (когда дос идет не на отдаваемое содержимое, а на время обработки запроса).

    лучше 100 раз увидеть, чем 1 раз прочитать, поэтому берем снифер, и снифам за своим браузером, что он посылает и как принимает, роемся в сорцах приложения(если есть), ищем дырки, составляем запрос, и вуаля, ставьте штамп взломано!
    Так же снифинг трафика очень помогает изучить систему неимея ее исходного кода.
    вот клевый снифер WPE-PRO

    Более подробно ознакомиться с протоколом можно ТУТ и ТУТ

    WPE-PRO
    так.. как отправлять разобрались, а как же получить дамп пакета, идущего к серверу? лично я использую снифер WPE-PRO в нем выбираем имя приложения, и нажимаем кнопку запись, ловим дампы летящих пакетов, которые затем можем изменить и переслать либо с помощью того же WPE-PRO, либо с помощью Inet-Crack.
    InetCrack
    Качаем его отсюда: InetCrack интерфейс интуитивно понятный)))
    Поехали!
    Итак, как же отправлять запросы и получать ответы? мы рассмотрим несколько языков и методов:

    PHP (fsockopen)
    Вот небольшой кусочек кодаотправляющий запрос серверу через сокеты (CURL юзать не будем, т.к. статья для новичков - там не все видно, да и не везде он стоит):
    PHP:
    <?php
    // открываем сокет на хост: локалост и на 80 порт (стандартный веб)
        
    $fp fsockopen('localhost'80$errno$errstr30); 
        
    // Проверяем успешность установки соединения
        
    if (!$fp) echo "$errstr ($errno)<br />\n"
        else
        { 
          
    $headers "HEAD / HTTP/1.1\r\n"// отвечает за тип протокола!
          
    $headers .= "Host: localhost\r\n"
          
    $headers .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1\r\n"
          
    $headers .= "Referer: http://ya.ru/\"\r\n"
          
    $headers .= "Connection: Close\r\n\r\n"
          
    // Отправляем HTTP-запрос серверу
          
    fwrite($fp$headers); 
          
    // Получаем ответ
          
    $line='';
          while (!
    feof($fp))
          { 
            
    $line .= fgets($fp1024); 
          } 
          
    fclose($fp); 
        } 
        echo 
    $line
    ?>
    вот эта строчка:
    PHP:
    $headers "HEAD /js.js HTTP/1.1\r\n";
    указывает, что тип запроса - HEAD, т.е. мы получим только заголовки ответа сервера, вот один из ответов на денвер:
    если бы мы указали GET вместо HEAD, то получили бы не только заголовки ответа, но и сам ответ, как например тут:
    PHP:
    $headers "GET / HTTP/1.1\r\n";
    Примечание: в конце каждой строчки запроса дописываем: \r\nэто "символ перевода каретки". в конце каждого запроса нужно ставить двойное: \r\n\r\n (В HEX-дампе это выглядит как 0D 0A и 0D 0A 0D 0A)
    PHP (cURL)
    cURL - модуль для пшп, для начала - как его установить? т.к. по дефолту не идет, качаем:
    http://slil.ru/24058043
    зырим в файл php.ini, находим там строчку: extension_dir = "директория", в эту директорию и кидаем скачаный плагин.
    Находим в том же файле php.ini строчку ;extension=php_curl.dll и заменяем на extension=php_curl.dll (если нету, то добавляем).
    Итак, cURL - настроен. Работа с ним абсолютно аналогична, как и с сокетами, например:
    PHP:
    function PrintPage($cookieStr$url)
    {
    $ch curl_init();
    curl_setopt($chCURLOPT_USERAGENT'ослик маздай');
    curl_setopt($chCURLOPT_COOKIE$cookieStr);
    curl_setopt($chCURLOPT_URL$url);
    curl_setopt($chCURLOPT_HEADER0);
    curl_setopt($chCURLOPT_REFERER'http://antichat.ru/');
    curl_setopt($chCURLOPT_RETURNTRANSFER1);
    $pageOut curl_exec($ch);
    curl_close($ch);
    return 
    $pageOut;
    }  
    Плюсы cURL - поддерживает и https, к минусам же относится - редко установлен на хостингах, да и синтаксис его знать нужно) в сокетах его гораздо меньше), поэтому предпочтительнее использовать сокеты - и быстрее, и "переносимее", т.к. сокеты всегда есть (если не продизаблены)
    PERL
    вот отличный пример - http://www.milw0rm.com/exploits/1063 - учитесь рыться в чужих сорцах ) и вообще, милворм - кладезь информации :)))
    да и вот две статьи: http://forum.antichat.ru/thread27981-inetcrack.html
    http://forum.antichat.ru/thread28960-inetcrack.html - от Gh0s7`a
     
    #1 Talisman, 10 Mar 2007
    Last edited: 11 Mar 2007
    9 people like this.
  2. vmn

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

    Joined:
    16 Oct 2006
    Messages:
    26
    Likes Received:
    12
    Reputations:
    3
    Не раскрыты 3 важных вопроса:
    1. Как там кукисы отсылать.
    2. Как с https через php работать.
    3. Как многопоточность организовать (я так понимаю curl, но возможно ошибаюсь).

    Особенно второй вопрос интересует.
     
    1 person likes this.
  3. Talisman

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

    Joined:
    22 Apr 2006
    Messages:
    400
    Likes Received:
    151
    Reputations:
    80
    1.
    PHP:
    $headers .= "Cookie: var1=value; var2=value \r\n"
    2. через cURL, ок, щас добавлю.
    3. многопоточности в ПШП НЕТ!!! только извращения с неблокировкой сокетов.
    Печенька)))
    начальный вариант скрипта взят из книги "Головоломки для хакера на PHP", я же изменил регулярку, скрипт теперь снова живой!!!
    PHP:
    <?php 
      
    // Формируем фрагменты запроса
      
    $hostname "www.google.ru";
      
    $button "Поиск";
      
    $query "Форум по регулярным выражениям";
      
    $path "/search?hl=ru&q=".win_utf8($query)."&btnG=".win_utf8($button)."&lr=";

      
    // Снимаем ограничение на время выполнения скрипта
      
    set_time_limit(0);
      
    // Вызываем функцию, которая загружает страницу
      
    $contents get_content($hostname$path);

      
    // Регулярное выражение
      
    $pattern '|<a href=\"([^\"]*)[^>]*>|is'

      
    // Выполняем поиск по регулярному выражению
      
    preg_match_all($pattern$contents$outPREG_PATTERN_ORDER); 
      
    // Выводим результаты поиска
      
    for($i 0$i count($out[1]); $i ++) 
      { 
        echo 
    $out[1][$i]."<br>"
      } 

      
    // Функция загружающая страницу при помощи секетов
      
    function get_content($hostname$path)
      { 
        
    $line "";
        
    // Устанавливаем соединение, имя которого
        // передано в параметре $hostname
        
    $fp fsockopen($hostname80$errno$errstr30); 
        
    // Проверяем успешность установки соединения
        
    if (!$fp) echo "$errstr ($errno)<br />\n"
        else
        { 
          
    // Формируем HTTP-заголовки для передачи
          // его серверу
          
    $headers "GET $path HTTP/1.1\r\n"
          
    $headers .= "Host: $hostname\r\n"
          
    // Подделываем пользовательский агент, маскируясь
          // под пользователя WindowsXP
          
    $headers .= "User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1\r\n"
          
    // Подделываем реферер, сообщая серверу, что мы повторно
          // нажимаем кнопку "Поиск"
          
    $headers .= "Referer: http://".$hostname.$path."\r\n"
          
    $headers .= "Connection: Close\r\n\r\n"
          
    // Отправляем HTTP-запрос серверу
          
    fwrite($fp$headers); 
          
    // Получаем ответ
          
    while (!feof($fp))
          { 
            
    $line .= fgets($fp1024); 
          } 
          
    fclose($fp); 
        } 
        return 
    $line
      }

      
    // Функция преобразования текста из кодировки cp-1251 (Windows)
      // в UTF-8 в формате Google
      
    function win_utf8($str)
      {
        
    $win = array("а","б","в","г","д","е","ё","ж","з","и",
                     
    "й","к","л","м","н","о","п","р","с","т",
                     
    "у","ф","х","ц","ч","ш","щ","ъ","ы","ь",
                     
    "э","ю","я","А","Б","В","Г","Д","Е","Ё",
                     
    "Ж","З","И","Й","К","Л","М","Н","О","П",
                     
    "Р","С","Т","У","Ф","Х","Ц","Ч","Ш","Щ",
                     
    "Ъ","Ы","Ь","Э","Ю","Я"," ");
        
    $utf8 = array("%D0%B0","%D0%B1","%D0%B2","%D0%B3","%D0%B4",
                      
    "%D0%B5","%D1%91","%D0%B6","%D0%B7","%D0%B8",
                      
    "%D0%B9","%D0%BA","%D0%BB","%D0%BC","%D0%BD",
                      
    "%D0%BE","%D0%BF","%D1%80","%D1%81","%D1%82",
                      
    "%D1%83","%D1%84","%D1%85","%D1%86","%D1%87",
                      
    "%D1%88","%D1%89","%D1%8A","%D1%8B","%D1%8C",
                      
    "%D1%8D","%D1%8E","%D1%8F","%D0%90","%D0%91",
                      
    "%D0%92","%D0%93","%D0%94","%D0%95","%D0%81",
                      
    "%D0%96","%D0%97","%D0%98","%D0%99","%D0%9A",
                      
    "%D0%9B","%D0%9C","%D0%9D","%D0%9E","%D0%9F",
                      
    "%D0%A0","%D0%A1","%D0%A2","%D0%A3","%D0%A4",
                      
    "%D0%A5","%D0%A6","%D0%A7","%D0%A8","%D0%A9",
                      
    "%D0%AA","%D0%AB","%D0%AC","%D0%AD","%D0%AE",
                      
    "%D0%AF","+");
        return 
    str_replace($win$utf8$str);
      }
    ?>
    ЗЫ он вырывает ссылки с гугла... гугла хак на автомате так сказать)
     
    #3 Talisman, 10 Mar 2007
    Last edited: 11 Mar 2007
    4 people like this.
  4. fucker"ok

    fucker"ok Elder - Старейшина

    Joined:
    21 Nov 2004
    Messages:
    580
    Likes Received:
    279
    Reputations:
    91
    Хоть для себя ничего нового не узнал, но года три назад я бы танцевал с бубном, после прочтения этой статьи (как-раз этой темой занимался)
    ++

    Сам батька nerezus писал - есть!
    http://www.php.net/pcntl-fork
    ;)
     
    #4 fucker"ok, 10 Mar 2007
    Last edited: 10 Mar 2007
  5. Talisman

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

    Joined:
    22 Apr 2006
    Messages:
    400
    Likes Received:
    151
    Reputations:
    80
    есть то есть, но это многопоточность операционки, а не пшп(интерпретируемый язык)
    вот еще 1 из вариантов без форка:
    http://www.stableversion.com/2006/04/17/multithread-php/
    вот неблокируемые сокеты от задохлика: http://zadoxlik.info/portscan.php.txt
    ну и вкусность: http://php.rinet.ru/manual/en/ref.pcntl.php
    все же это не потоки, в общепринятом понятии)
     
  6. Talisman

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

    Joined:
    22 Apr 2006
    Messages:
    400
    Likes Received:
    151
    Reputations:
    80
    PHP-снифер
    Может применяться как и снифер для XSS атак, так и для анализа отправляемых заголовков.
    PHP:
    <?
    $location $_SERVER["HTTP_REFERER"]; // откуда пришел юзер
    $out=$_GET['out']; // строка GET данных
    $headers apache_request_headers(); // хедеры, переданные апачу
    foreach ($headers as $header => $value) {
       
    $out.= "$header$value <br />"// складываем все это все в читабельный вид
    }
    $fo=fopen("log.html","a"); // открываем лог
    $entry="<pre>Адрес запроса: $location $out\r\n"// готовим данные
    fputs($fo,$entry); // записываем их
    fclose($fo); // закрываем лог
    ?>
     
  7. Talisman

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

    Joined:
    22 Apr 2006
    Messages:
    400
    Likes Received:
    151
    Reputations:
    80
    DELPHI
    юзаем TCP Socket или читаем дальше:
    http://www.delphiworld.narod.ru/base/get_post_data.html
    http://www.delphiworld.narod.ru/base/browser_post.html
    http://www.delphiworld.narod.ru/base/http_post_result.html
    http://www.delphiworld.narod.ru/base/http_get.html
    Ну и:
    Code:
    NMHTTP компонент, закладка FastNet. Там есть то что нужно - Функция post.
    
    все это было найдено за 5 сек тут: http://www.delphiworld.narod.ru/dw.html архив дв качаем тут: http://forum.antichat.ru/showpost.php?p=108830&postcount=3
    ЗЫ: Люди! используйте поиск и не бомбите мне аську))
    не.. бомбите - тут больше материала будет тогда)
     
    1 person likes this.
  8. p-range

    p-range Elder - Старейшина

    Joined:
    5 Feb 2006
    Messages:
    137
    Likes Received:
    145
    Reputations:
    118
    еще 3 года назад у меня не было компьютера и я не знал как его включать :D

    ну а насчет обзора, конечно все это известно, но для новичков думаю будет познавательно почитать ;)