Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|
Пишем спам бот/авторассыльщик/брутфорс на Php + Curl |

31.07.2008, 00:31
|
|
Участник форума
Регистрация: 28.07.2008
Сообщений: 158
Провел на форуме: 728470
Репутация:
115
|
|
Пишем спам бот/авторассыльщик/брутфорс на 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 изменило свое значение, это и есть защита от спама, оно же предупреждает нас что одним запросом на сервер нам не обойтись.
/********* Преступим [кодим наконец то ]***********/
Итак создаем новый 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); //выполняем запрос на сервер
Печатаем ответ в браузер, видим "Ваше объявление успешно добавлено" и радуемся.
Думаю на первый раз достаточно, это моя первая статья, просьба сильно не пинать . Ах да, об оптимизации кода я особо не заботился, в первую очередь пытаясь написать все как можно яснее. Если на сайте стоит защитная картинка, придется вам порыскать информацию об ее распознавании, ибо это выходит за границы данной статьи.
Последний раз редактировалось prescott; 31.07.2008 в 01:03..
|
|
|

27.10.2008, 18:48
|
|
Новичок
Регистрация: 27.10.2008
Сообщений: 14
Провел на форуме: 13381
Репутация:
0
|
|
Здравствуйте.
Вот пробую приспособить этот способ к сайту 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($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
curl_setopt($ch, CURLOPT_TIMEOUT, 10);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result=curl_exec($ch);
$sess_cookie=substr($result, strpos($result, "PHPSESSID=")+10, 32);
$post="login=LOGIN&passw=PASSWORD&go_logining=1";
curl_setopt($ch, CURLOPT_URL, "http://memori.ru/login/");
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);
curl_setopt($ch, CURLOPT_REFERER, "http://memori.ru/");
curl_setopt($ch, CURLOPT_POSTFIELDS, $post);
$result = curl_exec($ch);
echo $result;
Чего не так делаю?? 
|
|
|

28.10.2008, 14:05
|
|
Участник форума
Регистрация: 28.07.2008
Сообщений: 158
Провел на форуме: 728470
Репутация:
115
|
|
В данном случае сайт не делает лишних проверок, поэтому перед авторизацией сессию ставить не нада, можно сразу слать данные. Вот рабочий вариант:
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($ch, CURLOPT_URL, "http://memori.ru/login/");
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_POST, 1);
curl_setopt($ch, CURLOPT_REFERER, "http://memori.ru/");
curl_setopt($ch, CURLOPT_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.
Последний раз редактировалось prescott; 28.10.2008 в 14:22..
|
|
|

28.10.2008, 14:34
|
|
Участник форума
Регистрация: 27.10.2008
Сообщений: 244
Провел на форуме: 963613
Репутация:
428
|
|
копи-пасте с php.net/curl
хотя бы показал про курл_мульти ...
да и проверок на ошибки нету, не показано про прокси ничего.
|
|
|

28.10.2008, 14:49
|
|
Участник форума
Регистрация: 28.07.2008
Сообщений: 158
Провел на форуме: 728470
Репутация:
115
|
|
Сообщение от bombeg
копи-пасте с php.net/curl
хотя бы показал про курл_мульти ...
да и проверок на ошибки нету, не показано про прокси ничего.
Именно это все можно посмотреть углубленно на php.ner/curl/, я же показал на примере с объяснением что есть курл и с чем его едят.
php.net хороший справочник по функциям, но наглядности в данном случае никакой.
Кстати на момент написания статьи русской документации по курлу я не нашел.
|
|
|

28.10.2008, 14:57
|
|
Участник форума
Регистрация: 27.10.2008
Сообщений: 244
Провел на форуме: 963613
Репутация:
428
|
|
ну кто не знает основ пхп - наглядность не поможет. тем кто ее знает и так все понятно.
|
|
|

28.10.2008, 15:03
|
|
Новичок
Регистрация: 27.10.2008
Сообщений: 14
Провел на форуме: 13381
Репутация:
0
|
|
Спасибо.
Только я немного не так сделал.
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($ch, CURLOPT_URL, $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch, CURLOPT_HEADER, 1); //просим CURL возвращать нам ответ вместе с заголовками (обязательно)
curl_setopt($ch, CURLOPT_USERAGENT, $ua);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_FOLLOWLOCATION, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "login=megalol&passw=nvidia&go_logining=1&book=0&sf=&remember=1");
curl_setopt($ch, CURLOPT_COOKIEFILE, $_SERVER['DOCUMENT_ROOT'].'/cookie.txt');
$result = curl_exec($ch);
echo $result;
А то в браузер не выводится.
Еще раз спасибо))
|
|
|

28.10.2008, 15:56
|
|
Moderator - Level 7
Регистрация: 22.09.2006
Сообщений: 531
Провел на форуме: 3818187
Репутация:
369
|
|
а мна мну полный сорец в ЛС ну пажалста =) са мну плючеги
|
|
|

28.10.2008, 17:49
|
|
Новичок
Регистрация: 27.10.2008
Сообщений: 14
Провел на форуме: 13381
Репутация:
0
|
|
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
В чем пожет быть подвох?
|
|
|

29.10.2008, 00:01
|
|
Новичок
Регистрация: 27.10.2008
Сообщений: 14
Провел на форуме: 13381
Репутация:
0
|
|
Круто! Там
<input class=button type=submit name="do_post" value="Добавить" tabindex="9" >
оказывается проверяется значение do_post, если его нету, то куки не даются =)
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|