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

Тема в разделе "Perl программирование", создана пользователем Истребитель, 1 июл 2010.

  1. Истребитель

    Истребитель Well-Known Member

    Регистрация:
    9 июн 2010
    Сообщения:
    110
    Симпатии:
    0
    Добрый день!

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

    Вот запись из лога сайта:
    Код (Text):
    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

    Код (Text):
    RewriteRule ^(.*)guestbook/(.*)$ $1/cgi-bin/gbook_out.pl?show=news$2
    Насколько я понимаю это перенаправляет запросы к guestbook на перловый скрипт, выводящий содержимое гостевой

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

    Это страничка - шаблон, которая подгружает форму при помощи перл скрипта:
    Код (Text):
     <p><b>Добавить сообщение</b><br><br>       <!--#include virtual="/cgi-bin/gbook_in.pl?show=news&action=add"-->
    Текст, выводящий форму, выглядит так:
    Код (Text):
    $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 приводить не буду, большой. Приведу лишь ЕДИНСТВЕННОЕ в этом файле место где происходит ЗАПИСЬ в файл, содержащий содержимое гостевой книги.
    Код (Text):
     $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'}); это попытки борьбы с инжектом кода, пока отключил ибо русские буквы убивает...)

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

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

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

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

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

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

    Код (Text):
    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 ссылок на разные поддельные сайты с проститутками, добавил конец строки перед началом сообщения чтобы на страницу влезало)
    То есть последние поля в него попросту не попали! Проверку на содержимое сообщения и никнейма он обошел. Я вручную такое сообщение добавить НЕ могу (ни сообщение без ника, ни сообщение с таким содержимым - со ссылками). Как буд-то он использует какой-то бекдор! Или напрямую пишет в файл! Это нонсенс!

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

    Истребитель Well-Known Member

    Регистрация:
    9 июн 2010
    Сообщения:
    110
    Симпатии:
    0
    Прошу прощения, не знаю как удалить свою тему.

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

Поделиться этой страницей