ОБСУЖДЕНИЕ

Спам обходит логику перл скрипта!

1 ответов 5,7 тыс.
AI-выжимка обсуждения скоро

Краткие тезисы обсуждения со ссылками на ключевые ответы появятся здесь.

Автор темы
Добрый день!

Вебмастерю сайт, на сайте кастомный кмс написан на перл очень давно нанятым программистом. Недавно стали к нам захаживать проститутки из разных регионов, слать спам. Решил заблокировать возможность добавлять ссылки (для этого поменял перл код, обрабатывающий входящие сообщения в гостевую). Смысл в том, что спаммер ОБХОДИТ логику моего скрипта! Cам я знаю разные языки программированя и пишу сам, но Перл не учил, и не скажу чтобы знаю, так, разобрался на основании общих понятий о языках программирования.

Вот запись из лога сайта:
Код:
93.178.71.75 - - [01/Jul/2010:03:28:34 +0400] "GET /addgbook.html+++++++++++++++++++++++++++++
Result:+%E8%F1%EF%EE%EB%FC%E7%EE%E2%E0%ED%FB+
%E4%E0%ED%ED%FB%E5+%F1%E8%F1%F2%E5%EC%FB+
%F1%E0%EC%EE%EE%E1%F3%F7%E5%ED%E8%FF;
%E8%F1%EF%EE%EB%FC%E7%EE%E2%E0%ED+
%ED%E8%EA%ED%E5%E9%EC+%22apalsalacle%22;
%F3%F1%EF%E5%F5; 
HTTP/1.0" 404 2860 "http://phalisi.co.cc/prostitutki-primorya.html" "Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 6.0 [en]"
93.178.71.75 - - [01/Jul/2010:03:28:37 +0400] "GET / HTTP/1.0" 200 57194 "http://www.liderclub.ru/" "Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 6.0 [en]"
93.178.71.75 - - [01/Jul/2010:03:28:44 +0400] "GET /guestbook/ HTTP/1.0" 200 47670 "http://www.liderclub.ru/guestbook/" "Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 6.0 [en]"
93.178.71.75 - - [01/Jul/2010:03:28:49 +0400] "GET /addgbook.html HTTP/1.0" 200 37828 "http://www.liderclub.ru/addgbook.html" "Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 6.0 [en]"
93.178.71.75 - - [01/Jul/2010:03:28:51 +0400] "POST /guestbook/cgi-bin/gbook_in.pl HTTP/1.0" 200 53417 "http://www.liderclub.ru/addgbook.html" "Mozilla/4.0 (compatible; MSIE 5.0; Windows 2000) Opera 6.0 [en]"
(концов строк в первой строке нет, добавил чтоб на страницу влезало)

Сначала спаммер заходит на какуюто несуществующую ссылку. абракадабра после плюсов и Result: переводится как "использованы данные системы самообучения;использован никнейм apalsalacle;успех"
Затем спаммер открывает корень сайта, гостевую книгу, нажимает добавить, вводит данные в форму и отправляет форму post'ом. Либо это делает его программа-бот, хз (хрумер какойнибудь).

После этого в гостевой появляется спам - сообщение.

Гостевая хранит свои данные в текстовом файле, одна строка - одна запись, разделенная табуляцией.

Гостевая сайта находится по адресу http://liderclub.ru/guestbook/

Вот что находится по этому поводу в .htaccess

Код:
RewriteRule ^(.*)guestbook/(.*)$ $1/cgi-bin/gbook_out.pl?show=news$2

Насколько я понимаю это перенаправляет запросы к guestbook на перловый скрипт, выводящий содержимое гостевой

Добавляются сообщения через адрес http://liderclub.ru/addgbook.html

Это страничка - шаблон, которая подгружает форму при помощи перл скрипта:
Код:
 <p><b>Добавить сообщение</b><br><br>		 <!--#include virtual="/cgi-bin/gbook_in.pl?show=news&action=add"-->

Текст, выводящий форму, выглядит так:
Код:
$content.=qq(
<form action="/cgi-bin/$myname" method=post>
<input type=hidden name=show value=news>
<input type=hidden name=numz value=$secureid>
<input type=hidden name=action value=save>
<input type=hidden name=id value=$Form{'id'}>
<input type=hidden name=ps0 value="$ps[0]">
<input type=hidden name=ps1 value="$ps[1]">
<input type=hidden name=ps2 value="$ps[2]">	 
<input type=hidden name=ps8 value="$ps[8]">
<input type=hidden name=ps9 value="$ps[9]">
<input type=hidden name=ps10 value="$ps[10]">
<input type=hidden name=ps11 value="$ps[11]">
<input type=hidden name=ps3 value="$ps[3]">
<input type=hidden name=ps4 value="$ps[4]"> 

<table BORDER="0" CELLSPACING="0" CELLPADDING="4" width="100%">

<tr>
<td><b>Автор:</b> </td><td align=right width="93%"><input class=subz type="text" name="ps12" value="$ps[12]" maxlength="50" style="WIDTH: 100%"></td>
</tr>

<tr>
<td><b>Город:</b> </td><td align=right width="93%"><input class=subz type="text" name="ps13" value="$ps[13]" maxlength="50" style="WIDTH: 100%"></td>
</tr>

<tr>
<td><b>E-mail:</b> </td><td align=right width="93%"><input class=subz type="text" name="ps6" value="$ps[6]" maxlength="50" style="WIDTH: 100%"></td>
</tr>


<tr>
<td><b>Тема:</b> </td><td align=right><input class=subz type="text" name="ps15" value="$ps[15]" maxlength="80" style="WIDTH: 100%"></td>
</tr>

<tr>
<td valign=top><b>Сообщение:</b> </td><td align=right width="93%"><textarea name="ps16" rows="5"
cols="33" wrap=VIRTUAL class=subz style="WIDTH: 100%">$ps[16]</textarea></td>
</tr>

<tr><td colspan=2><b>Введите защитный код:</b>
<table cellpadding="4" cellspacing="5" align="center">
<tr><td><input type="text" size="7" name="secure_code" class="input" /><input type="hidden" name="secureid" value="$secureid" /></td>
<td><img src="/secureimage2.php?secureid=$secureid" width="100" height="50" alt="Это защитный код" /></td></tr>
</table></td>
</tr>


</table>	



<br><input type=submit value="Отправить">  <INPUT type=reset value="Очистить">

</form>

);
затем ниже print'ом content выводится на stdout тобишь на страницу.
$myname это имя файла т.е. gbook_in.pl

Далее после заполнения формы она отправляется методом POST в тот же самый скрипт - /cgi-bin/gbook_in.pl.

Данный скрипт после всех проверок делает запись в файл. Так вот. Раньше он так просто писал полученные данные в файл. После появления спама я решил добавить проверку вида "если никнейм длинной в ноль - запретить добавлять, если емейл некорректный - запретить добавлять, если в сообщении есть активные ссылки - запретить добавлять. НО! это НЕ РАБОТАЕТ.

Весь файл /cgi-bin/gbook_in.pl приводить не буду, большой. Приведу лишь ЕДИНСТВЕННОЕ в этом файле место где происходит ЗАПИСЬ в файл, содержащий содержимое гостевой книги.
Код:
 $search_for='<a href=';
$found_link=index($Form{'ps16'},$search_for);

if 
(
($corr_em==1)
&&
(length($Form{'ps12'}) > 0) 
&&
($Form{'secure_code'} eq $text)
&&
($found_link==-1)
)
{

#$Form{'ps16'}=encode_entities($Form{'ps16'}); 
#$encps16=encode_entities($Form{'ps16'}); 

$Form{'ps18'}='1'; 
$Form{'ps17'}='Foundlink: '.$found_link.'; lengthname: '.length($Form{'ps12'}).'; name itself=('.$Form{'ps12'}.'); '; 


$nl="$Form{'ps0'}\x09$Form{'ps1'}\x09$Form{'ps2'}\
x09$Form{'ps3'}\x09$Form{'ps4'}\x09$Form{'ps5'}\
x09$Form{'ps6'}\x09$Form{'id'}\x09$Form{'ps8'}\x09$Form{'ps9'}\
x09$Form{'ps10'}\x09$Form{'ps11'}\x09$Form{'ps12'}\
x09$Form{'ps13'}\x09$Form{'ps14'}\x09$Form{'ps15'}\
x09$Form{'ps16'}\x09$Form{'ps17'}\x09$Form{'ps18'}\x09$Form{'ps19'}\n";
push @NL, $nl;
open FL, ">base/gbook.txt";
&lock;
print FL @NL;
close FL;
@L=@NL;

}
(концов строк в $nl= после слешей нет, добавил чтобы на страницу влезало(
(#$Form{'ps16'}=encode_entities($Form{'ps16'}); #$encps16=encode_entities($Form{'ps16'}); это попытки борьбы с инжектом кода, пока отключил ибо русские буквы убивает...)

Это - ЕДИНСТВЕННОЕ место где происходит принт в файл и после этого клоз файл. И единственное из двух мест, где вообще происходит обращение к файлу, другое выглядит вот так:

Код:
 open F, "base/gbook.txt";
@L=<F>; close F;
Очевидно это только чтение.

Так вот, код, пишущий в файл, обрамлен условием - $corr_em это корректность емейла, length($Form{'ps12'}) это длинна ника, $Form{'secure_code'} eq $text это проверка капчи, и проверка наличия ссылок. Кроме того, в коде вот здесь:
Код:
$Form{'ps18'}='1'; 
$Form{'ps17'}='Foundlink: '.$found_link.'; lengthname: '.length($Form{'ps12'}).'; name itself=('.$Form{'ps12'}.'); ';
идет добавление, во-первых, статуса "не выводить" (ps18=1) а во-вторых, комментария к посту, содержащего дебаг информацию.

Таким образом если сейчас добавить сообщение в гостевую, не пройдет сообщение без ника или с некорректным емейлом или со ссылками. Любое другое на сайте не появится, а только в админской панели, в комментарии будет видно дебаг-инфу. Это работает, я проверял.

Так вот, это НЕ РАБОТАЕТ Против спаммера!

Спаммер добавляет сообщение которое в файле гостевой выглядит так:

Код:
2010	07	01	03	28		godyjitoq@rambler.ru	127794053012682	5802	2010	07	01					
<a href=http://gueriti.co.cc/page_48.html> проститутка в костомукше </a>... интим и проститутки красноярска </a>
(убрал большинство, там реально строчек 10 ссылок на разные поддельные сайты с проститутками, добавил конец строки перед началом сообщения чтобы на страницу влезало)
То есть последние поля в него попросту не попали! Проверку на содержимое сообщения и никнейма он обошел. Я вручную такое сообщение добавить НЕ могу (ни сообщение без ника, ни сообщение с таким содержимым - со ссылками). Как буд-то он использует какой-то бекдор! Или напрямую пишет в файл! Это нонсенс!

Я в растерянности. Готов предоставить другую информацию если надо. Подскажите, в чем может быть беда... Наверняка здесь всё тривиально, просто я в силу незнания Перл не понимаю...
 
Прошу прощения, не знаю как удалить свою тему.

Проблема действительно оказалась в бекдоре. Тот кто писал наш CMS оставил много лишнего кода, втч опцию постить формы в тот .pl файл, который должен только выводить на экран сообщения. Убрал эту возможность, и вероятно, спам на этом прекратится.