• 15 апреля стартует «Курс «SQL-injection Master» ©» от команды The Codeby

    За 3 месяца вы пройдете путь от начальных навыков работы с SQL-запросами к базам данных до продвинутых техник. Научитесь находить уязвимости связанные с базами данных, и внедрять произвольный SQL-код в уязвимые приложения.

    На последнюю неделю приходится экзамен, где нужно будет показать свои навыки, взломав ряд уязвимых учебных сайтов, и добыть флаги. Успешно сдавшие экзамен получат сертификат.

    Запись на курс до 25 апреля. Получить промодоступ ...

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

  • Автор темы Истребитель
  • Дата начала
И

Истребитель

Добрый день!

Вебмастерю сайт, на сайте кастомный кмс написан на перл очень давно нанятым программистом. Недавно стали к нам захаживать проститутки из разных регионов, слать спам. Решил заблокировать возможность добавлять ссылки (для этого поменял перл код, обрабатывающий входящие сообщения в гостевую). Смысл в том, что спаммер ОБХОДИТ логику моего скрипта! 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'ом. Либо это делает его программа-бот, хз (хрумер какойнибудь).

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

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

Гостевая сайта находится по адресу

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

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

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

Добавляются сообщения через адрес

Это страничка - шаблон, которая подгружает форму при помощи перл скрипта:
Код:
 <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 файл, который должен только выводить на экран сообщения. Убрал эту возможность, и вероятно, спам на этом прекратится.
 
Мы в соцсетях:

Обучение наступательной кибербезопасности в игровой форме. Начать игру!