Форум АНТИЧАТ

Форум АНТИЧАТ (https://forum.antichat.xyz/index.php)
-   Статьи (https://forum.antichat.xyz/forumdisplay.php?f=30)
-   -   Пишем спам бот/авторассыльщик/брутфорс на Php + Curl (https://forum.antichat.xyz/showthread.php?t=79123)

prescott 31.07.2008 00:31

Пишем спам бот/авторассыльщик/брутфорс на Php + Curl
 
Писал давненько статью для web-hacka, решил запостить и тут, наверняка найдутся люди которым она в чем то поможет. Итак.

===========================

/********* Предисловие ***********/

В один прекрасный день я столкнулся с задачей сделать авторассыльщик по доскам объявлений прямо с сайта заказчика. Порыл гугль, но ничего конкретного на эту тему не нашел , решил сделать сам.

Итак, для работы нам понадобится PHP как минимум четвертой версии (при младших версиях работоспособность не проверял) с прикрученной библиотекой CURL. Что это за штука и где ее найти можно прочитать здесь . Даже если вы не собираетесь делать то, что я тут описываю, настоятельно рекомендую ознакомится с этой библиотекой, она вам обязательно понравится и в будущем пригодится. Поставили курл - вызываем phpinfo() и ищем там строчку "CURL support ======== Enabled". Нашли? Тогда идем дальше.

Помимо CURL'а вам понадобятся как минимум начальные знания языка PHP, минимальное представление о работе протокола http и хорошее настроение, организованное любимым треком в WinAmp'е. Прямые руки, как всегда, приветсвуются.

/********* Преступим [теория]***********/

Чтобы не быть голословным, буду писать скриптег под реальный сайт - _optsib.ru. Заходим на сайт, тыкаем "Доска объявлений" => "Добавить объявление". Смотрим в адресную строку браузера и видим там какую то бяку типа этой s=20080ч221521288b93b4a822fe4e235843df043d76b774. Что то похожее на ПХП СессИд. Берем на заметку и открываем HTML код странички, плясать будем именно от него.

Там находим код формы, и выписываем имена полей, обязательных для заполнения. У нас это: name, email, phone, razdel, zag, text. Их значения мы будем передавать на сервер заголовком POST (так как форма использует именно этот способ отправки).

Так же мы видим в коде еще хидден поля - вот где на самом деле зарыта собака. У нас их три: ins, s, и sort. Не закрывая первого, открываем любой другой браузер переходим на ту же страничку добавления объявления и сравнивая ее ХТМЛ код с кодом первого браузера, убеждаемся что hidden поля ins и sort статичны и несут служебную информацию, а вот поле s изменило свое значение, это и есть защита от спама, оно же предупреждает нас что одним запросом на сервер нам не обойтись.

/********* Преступим [кодим наконец то :D ]***********/

Итак создаем новый php-файл и начинаем кодить. Первым делом объявляем серверу что мы пришли, чтобы он выдал нам куки, по которым в последствии он будет сверять, не робот ли мы:

[code]
$url="http://optsib.ru/do.phtml";
$ua = 'User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Widows NT)';

$ch=curl_init(); //инициализируем сеанс CURL

// ф-ция curl_setopt устанавливает параметры для запроса

curl_setopt($ch, CURLOPT_URL, $url); //указываем URL для запроса
curl_setopt($ch, CURLOPT_HEADER, 1); //просим CURL возвращать нам ответ вместе с заголовками (обязательно)
curl_setopt($ch, CURLOPT_USERAGENT, $ua); //утверждаем что мы браузер чтоб не спалили
curl_setopt($ch, CURLOPT_TIMEOUT, 10); //без коментариев
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); //говорим что ответ сервера нам нада возвращать, а не выводить прямо в браузер.

$answer=curl_exec($ch); //выполняем сам запрос, ответ сервера сохраняем в $answer.
[/quote]

Далее выводим ответ в браузер чтобы глянуть что там у нас пришло в заголовках. Там видим что в заголовке нам выдают кукисы PHPSESSID. Выдираем их и сохраняем себе на память :

Код:

$sess_cookie=substr($answer, strpos($answer, "PHPSESSID=")+10, 32);

Дальше вспоминаем что у нас еще есть хидден поле s, его значение тоже достаем:

Код:

$s_hidden=substr($answer, strpos($answer, 'name="s" value=')+16, 46);
Прямо как настоящий браузер мы приняли сессию, выданную нам доской, теперь можно послать объявление на доску:

Код:

$post="name=$company&email=$email&phone=$contacts&razdel=$cat
&zag=$ed_name&text=$text_full&ins=1&sort=2&s=$s_hidden";
/*сформировали строку пост данных состоящую из пар поле=>значение разделенных амперсандом (при необходимости строку надо url-кодировать)*/
 curl_setopt($ch, CURLOPT_URL, "http://optsib.ru/insert.php"); //адрес на который шлем запрос (выдираем значение из action нашей формы)
 curl_setopt($ch, CURLOPT_HEADER, 1); //дальше мы все уже видели
 curl_setopt($ch, CURLOPT_USERAGENT, $ua);
 curl_setopt($ch, CURLOPT_TIMEOUT, 10);
 curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
 curl_setopt($ch, CURLOPT_COOKIE, $sess_cookie); //а вот тут внимательнее! не забываем показать серверу наши, полученные ранее кукисы
 curl_setopt($ch, CURLOPT_POST, 1); //говорим что у нас есть POST данные для сервера
 curl_setopt($ch, CURLOPT_REFERER, "http://optsib.ru/do.phtml?d=ins&sort=2&s=$s_hidden"); /*ставим заголовок referer чтоб не спалится, вспоминаем про байду в адресной строке, теперь мы уже знаем что эта байда как раз значение нашего защитного поля */
 curl_setopt($ch, CURLOPT_POSTFIELDS, $post); //указываем на наши POST данные
 
 $answer=curl_exec($ch); //выполняем запрос на сервер


Печатаем ответ в браузер, видим "Ваше объявление успешно добавлено" и радуемся.

Думаю на первый раз достаточно, это моя первая статья, просьба сильно не пинать . Ах да, об оптимизации кода я особо не заботился, в первую очередь пытаясь написать все как можно яснее. Если на сайте стоит защитная картинка, придется вам порыскать информацию об ее распознавании, ибо это выходит за границы данной статьи.

3me9I 27.10.2008 18:48

Здравствуйте.
Вот пробую приспособить этот способ к сайту memori.ru.
Но там защита на регистрацию стоит.
Никаких изменяемых полей вроде нет.


PHP код:

$url "http://memori.ru/login/";
$ua 'User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Widows NT)';
$ch curl_init();

 
curl_setopt($chCURLOPT_URL$url); 
 
curl_setopt($chCURLOPT_HEADER1); 
 
curl_setopt($chCURLOPT_USERAGENT$ua); 
 
curl_setopt($chCURLOPT_TIMEOUT10); 
 
curl_setopt($chCURLOPT_RETURNTRANSFERtrue); 
$result=curl_exec($ch); 

$sess_cookie=substr($resultstrpos($result"PHPSESSID=")+1032);

$post="login=LOGIN&passw=PASSWORD&go_logining=1";

 
curl_setopt($chCURLOPT_URL"http://memori.ru/login/"); 
 
curl_setopt($chCURLOPT_HEADER1); 
 
curl_setopt($chCURLOPT_USERAGENT$ua);
 
curl_setopt($chCURLOPT_TIMEOUT10);
 
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);
 
curl_setopt($chCURLOPT_COOKIE$sess_cookie); 
 
curl_setopt($chCURLOPT_POST1); 
 
curl_setopt($chCURLOPT_REFERER"http://memori.ru/");
 
curl_setopt($chCURLOPT_POSTFIELDS$post); 

$result curl_exec($ch); 

echo 
$result

Чего не так делаю?? :confused:

prescott 28.10.2008 14:05

В данном случае сайт не делает лишних проверок, поэтому перед авторизацией сессию ставить не нада, можно сразу слать данные. Вот рабочий вариант:

PHP код:

$url "http://memori.ru/login/"
$ua 'User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Widows NT)'
$ch curl_init();  
$post="login=megalol&passw=nvidia&go_logining=1&book=0&sf=&remember=1";   

curl_setopt($chCURLOPT_URL"http://memori.ru/login/");   
curl_setopt($chCURLOPT_HEADER1);   
curl_setopt($chCURLOPT_USERAGENT$ua);  
curl_setopt($chCURLOPT_TIMEOUT10);  
curl_setopt($chCURLOPT_RETURNTRANSFERtrue);  
curl_setopt($chCURLOPT_POST1); 
curl_setopt($chCURLOPT_REFERER"http://memori.ru/");  
curl_setopt($chCURLOPT_POSTFIELDS$post);
   
$result curl_exec($ch);   

echo 
$result

В ответ получаем заголовки:

Код:

HTTP/1.1 302 Found Via: 1.1 RAID-PROXY Connection: Keep-Alive Proxy-Connection: Keep-Alive Content-Length: 0 Expires: Thu, 19 Nov 1981 08:52:00 GMT Date: Tue, 28 Oct 2008 10:02:41 GMT location: http://memori.ru/megalol/ Content-Type: text/html Server: nginx/0.5.28 X-Powered-By: PHP/5.2.3 Set-Cookie: PHPSESSID=3b731188cdf0c2369bf738f67ff1ce40; path=/ Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Pragma: no-cache Set-Cookie: isp=540df7f83845146f0287ff6d2da77900; expires=Sat, 27-Dec-2008 10:02:41 GMT; path=/ Set-Cookie: isl=megalol; expires=Sat, 27-Dec-2008 10:02:41 GMT; path=/
Вырезаем строку PHPSESSID=3b731188cdf0c2369bf738f67ff1ce40
и ее используем для дальнейших запросов к серверу, передавая кукисами, чтобы он считал вас авторизованым под вашим логином.

=========================
Кстати, если параметр равен нулю, это не значит что его нет, при отправкее запроса передавайте ВСЕ параметры, имеющиеся в форме, в вашем не хватает параметра book.

bombeg 28.10.2008 14:34

копи-пасте с php.net/curl
хотя бы показал про курл_мульти ...
да и проверок на ошибки нету, не показано про прокси ничего.

prescott 28.10.2008 14:49

Цитата:

Сообщение от bombeg
копи-пасте с php.net/curl
хотя бы показал про курл_мульти ...
да и проверок на ошибки нету, не показано про прокси ничего.

Именно это все можно посмотреть углубленно на php.ner/curl/, я же показал на примере с объяснением что есть курл и с чем его едят.

php.net хороший справочник по функциям, но наглядности в данном случае никакой.

Кстати на момент написания статьи русской документации по курлу я не нашел.

bombeg 28.10.2008 14:57

ну кто не знает основ пхп - наглядность не поможет. тем кто ее знает и так все понятно.

3me9I 28.10.2008 15:03

Спасибо.
Только я немного не так сделал.

PHP код:

$url "http://memori.ru/login/";
$ua 'User-Agent: Mozilla/4.0 (compatible; MSIE 5.01; Widows NT)';
$ch curl_init();
$post="login=megalol&passw=nvidia&go_logining=1&book=0&sf=&remember=1";
curl_setopt($chCURLOPT_URL$url); 
curl_setopt($chCURLOPT_RETURNTRANSFER,1);
curl_setopt($chCURLOPT_HEADER1);  //просим CURL возвращать нам ответ вместе с заголовками (обязательно)
curl_setopt($chCURLOPT_USERAGENT$ua);
curl_setopt($chCURLOPT_POST1);
curl_setopt($chCURLOPT_FOLLOWLOCATION1);
curl_setopt($chCURLOPT_POSTFIELDS"login=megalol&passw=nvidia&go_logining=1&book=0&sf=&remember=1");
curl_setopt($chCURLOPT_COOKIEFILE$_SERVER['DOCUMENT_ROOT'].'/cookie.txt');

$result curl_exec($ch);

echo 
$result

А то в браузер не выводится.
Еще раз спасибо))

satana8920 28.10.2008 15:56

а мна мну полный сорец в ЛС ну пажалста =) са мну плючеги

3me9I 28.10.2008 17:49

C мемори все хорошо получилось.
А теперь вот тренеруюсь на другом сайте.

Зарегистрировался, зашел на страницу добавления.
Заголовок
Код HTML:

HTTP/1.1 200 OK
Server: nginx/0.6.32
Date: Tue, 28 Oct 2008 13:43:39 GMT
Content-Type: text/html
Connection: close
X-Powered-By: PHP/5.2.4
Content-Length: 4672

И все нормально, пока пост запрос не посылаю.
Как только пост запрос идет, то пишет "пожалуйста зарегистрируйтесь".
Я так понял, есои какая то переменная чему то равна, то я не зарегистрированный.

Я сохранил страницу у себя, изменил post на get и добавил сообщение.

выдал вот что
PHP код:

note=0&url=11hhhh11&title=11111&desc=1111111&tags=11111&status=ALL&save=1&do_post=%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD%EF%BF%BD 

В чем пожет быть подвох?

3me9I 29.10.2008 00:01

Круто! Там
<input class=button type=submit name="do_post" value="Добавить" tabindex="9" >
оказывается проверяется значение do_post, если его нету, то куки не даются =)


Время: 02:14