Ускорение работы брута POST-запросами

Discussion in 'Уязвимости' started by bnromanoff, 13 May 2011.

  1. bnromanoff

    bnromanoff New Member

    Joined:
    10 May 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Доброго времени суток!

    Есть необходимость отправить на сайт, находящийся на виртуальном хостинге masterhost, порядка 100 млн. POST-запросов и определенным образом зафиксировать результат.

    Написал php-скрипт, осуществляющий перебор, однако возникла проблема со скоростью:

    fsockopen() работает медленно, порядка 0.2-0.3 секунды на запрос, даже если в открытый сокет послать пачку запросов, и уже после принимать результат

    При использовании curl результат более приемлемый, при работе в 2 потока на запрос уходит порядка 0.03 секунды, однако процесс периодически залипает на несколько секунд. Если использовать больше потоков - валится сайт с ошибкой 503.

    Возможно есть какой-то более быстрый способ? Для фиксации результата можно использовать только заголовки, однако при использовании HEAD-запроса невозможно отправить данные через POST. Обрезать размер получаемых данных через curl также не представляется возможным - сервер не возвращает длину контента, поэтому ограничение CONTENT_LENGTH не работает.

    Буду признателен за советы!
     
  2. Expl0ited

    Expl0ited Members of Antichat

    Joined:
    16 Jul 2010
    Messages:
    1,037
    Likes Received:
    531
    Reputations:
    935
    Цель какая преследуется?
    Если нужно слить инфу например через скул инъекцию, тогда сложно что-то придумать если сайт падает с двух потоков (если бы не падал, можно было например запустить распределенный дамп с 10-100 серверов, и слать результаты на один), если тебе важно получить ответ от сервера, тогда ускорить процесс можно только многопоточностью. Да даже если цель какая-то другая, ты можешь уронить сервак (читай как задидосить) своими запросами.
     
    _________________________
  3. bnromanoff

    bnromanoff New Member

    Joined:
    10 May 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Цель именно получить информацию, т.е. ответ сервера на каждый из посылаемых запросов.

    В моем случае, в ответ на каждый запрос возвращается полный код страницы, но достаточно будет только получить заголовки ответа.
    Если есть способ получить только заголовки в ответ на POST-запрос, думаю это позволит ускорить перебор, по крайней мере будет не так забивать канал.
     
  4. Expl0ited

    Expl0ited Members of Antichat

    Joined:
    16 Jul 2010
    Messages:
    1,037
    Likes Received:
    531
    Reputations:
    935
    PHP:
    <?php 
    function get_header($host$data)
    {
        
    $curl curl_init($host);
        
    curl_setopt($curlCURLOPT_POST1);
        
    curl_setopt($curlCURLOPT_POSTFIELDS$data);
        
    curl_setopt($curlCURLOPT_RETURNTRANSFER1);
        
    curl_setopt($curlCURLOPT_HEADER1);
        
    curl_setopt($curlCURLOPT_NOBODY1);
        
    $content curl_exec($curl);
        
    curl_close($curl);
        return 
    explode("\r\n"$content);
    }
    $post = array('var1' => 'value''var2' => 'value');
    $host 'http://php.net/';

    print 
    "<pre>";
    print 
    implode('<br>',get_header($host$post));
    print 
    "</pre>";
    ?>
     
    _________________________
  5. bnromanoff

    bnromanoff New Member

    Joined:
    10 May 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Увы, такой вариант пробовал - CURLOPT_NOBODY не работает вместе с POST, т.е. при
    curl_setopt($curl, CURLOPT_NOBODY, 1);
    посылается HEAD-запрос, несмотря на то, что отмечен CURLOPT_POST
     
  6. Expl0ited

    Expl0ited Members of Antichat

    Joined:
    16 Jul 2010
    Messages:
    1,037
    Likes Received:
    531
    Reputations:
    935
    Собственно я так и не понял, что именно не работает?
     
    _________________________
  7. bnromanoff

    bnromanoff New Member

    Joined:
    10 May 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Скрипт на сайте, к которому обращается наш скрипт, принимает данные только через метод POST

    Если использовать Вашу функцию:
    PHP:
    $curl curl_init($host);     
    curl_setopt($curlCURLOPT_POST1);     
    curl_setopt($curlCURLOPT_POSTFIELDS$data);     
    curl_setopt($curlCURLOPT_RETURNTRANSFER1);     
    curl_setopt($curlCURLOPT_HEADER1);     
    curl_setopt($curlCURLOPT_NOBODY1);     
    $content curl_exec($curl);     
    curl_close($curl);     
    return 
    explode("\r\n"$content); 
    то curl при отмеченном параметре CURLOPT_NOBODY, посылает HEAD-запрос на сайт, вместо нужного нам POST, независимо от того, стоит ли флаг CURLOPT_POST.
    А в описании протокола http говорится, что метод HEAD во всем идентичен методу GET, за исключением одного - ответ на HEAD-запрос не содержит тела сообщения, только заголовки.

    Таким образом, если отметить CURLOPT_NOBODY, то параметры запроса будут посланы методом GET, и целевой скрипт их не обработает => не возвратит нужный результат.

    Доказано опытным путем )
     
  8. bnromanoff

    bnromanoff New Member

    Joined:
    10 May 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    1. Уверен, при наличии любого GET параметра возвращает 404
    2. Пробовал - увы, разница даже если и есть, то практически незаметна
     
  9. попугай

    попугай Elder - Старейшина

    Joined:
    15 Jan 2008
    Messages:
    1,587
    Likes Received:
    405
    Reputations:
    196
    А что fsockopen работает медленнее чем curl?
     
  10. bnromanoff

    bnromanoff New Member

    Joined:
    10 May 2011
    Messages:
    6
    Likes Received:
    0
    Reputations:
    0
    Да, в моем случае один запрос через curl выполняется быстрее на порядок чем через fsockopen
     
  11. Dr.Z3r0

    Dr.Z3r0 Leaders of the World

    Joined:
    6 Jul 2007
    Messages:
    284
    Likes Received:
    594
    Reputations:
    567
    Попробуй разбери мою утилиту, и выдерни классы для работы с сетью
    https://rdot.org/forum/showthread.php?t=1160
    Там же есть класс для работы с кип-аливе соединениями, пул неблокирующих сокетов и тд. Код прокоментирован, я думаю разберешься.

    PS. Я как-то тестировал, fsockopen работает быстрее курла. Одна из возможных проблем - посылаемый Connection: keep-alive вместо Connection: close, тогда соединение может долго висеть.
     
Loading...