Опубликованные статьи


Защита DLE от невидимых ссылок

После моей почти детективной истории, описанной в одной из предыдущих публикаций «Уверен, что на своем сайте зарабатываешь только ты?», на меня обрушилась масса вопросов, и предложений от моих знакомых. Разумеется, первым делом я проверил своих клиентов, счастливых обладателей DLE, а затем смог полностью окунуться в мир скуллхакеров и жалких задротов, которые до того измождены современным образованием, что без мануала фантазия уже не работает.

Где же я пропадал почти неделю? Нет, я не нажрался в говно, не бегал по кабакам и женщинам, я занимался исследованиями DLE и уничтожением уязвимостей. Самое прикольное, что было достаточно сложно только с первым сайтом, пораженным «мастерством» очередного задрота, остальные шли, словно семечки по часу на сайт. Все происходящее было похоже на азартную игру: вот ты поставил заплатки, вычистил все лишнее, и спустя пару часов видишь, что скуллхакер уже залил новое файло. Одно время стало даже интересно кто кого: умудренный жизненным опытом мозг, или задрот сидящий за компьютерным столом, нервно жамкающий мышку.

Пациенты шли потоком, и за пару дней пришлось вылечить десяток сайтов, и даже провести собственное расследование, которое я решил разбить на несколько частей, ведь разными были как взломщики, так и цели взлома сайтов на DLE. Сегодня вы услышите историю задрота zuser, которого мы будем в дальнейшем именовать просто Зюзя.

Цели и задачи нашего Зюзи, были абсолютно идентичны тому, что я описывал в вышеуказанном посте. Через уязвимость взламывается DLE, Зюзя попадает в админку, заливает шелл, и получает возможность управлять админкой и залитыми на сервер файлами удаленно. Как я выяснил, таким образом, даже создаются сетки под единым управлением, и в случае «потери бойца» ничего страшного не происходит. Но, не будем отвлекаться.

В папку uploads заливается папка с вредоносным кодом со свободной аббревиатурой. Она может иметь вид v3e4owy или любой другой подобный этому. В этой папке находится скрипт исполнения, который уже управляет функцией взаимодействия с сапой. Знаете, что меня поразило в этом скрипте? Надпись: This file is protected by copyright law and provided under license. Reverse engineering of this file is strictly prohibited. Что означает — Этот файл защищен законом об авторском праве предусмотренный лицензией. Любое изменение этого файла строго запрещено! Я охуел друзья! Задроты – взломщики заявляют об авторском праве! Сам закодированный скрипт уже отличался от предыдущих. Если ранее использовалась кодировка base64, то этот мне раскодировать не удалось. На одном из сайтов были тупо залиты скрипты, замаскированные под фото вида foto_42332.php. Вообщем наш Зюзя работал довольно изобретательно, с огоньком. Далее из админки в шаблоне main.tpl ставится код отображения ссылок. В моем случае он имел вид {lb}, но допускаю возможность размещения и иного задротского иероглифа. В работоспособном состоянии всей системы в папке engine/cache образуется еще один файлик function.php, где мы и сможем увидеть размещенные саповские ссылки.

Теперь возникает вопрос, как у Достоевского, «что делать?» Заходим в админку, и на главной странице нажимаем кнопку «Антивирус». После сканирования, вы увидите все файло, не относящееся к дистрибутиву DLE. ВНИМАНИЕ! Если вы устанавливали какие-либо модули DLE, антивирус будет считать их подозрительными файлами, поэтому будьте внимательными, иначе снесете свои модули к ебеням, а потом будете думать, почему это ничего не работает! Уничтожаем вредоносные папки и скрипты в uploads. Кстати, я попробовал закачать один из них по ftp, и при попытке открытия, Каспер удалил его, как трояна. Убираем {lb} из шаблона. Удалаем все содержимое из engine/cache и engine/cache/ system кроме файлов .htaccess. Все нужное потом там появится вновь, ну а не нужное, как вы понимаете нам и не надо.

А теперь начинаем защищать наш сайт на DLE

Как мы понимаем, дополнительных заплаток, о которых я писал ранее часто бывает недостаточно, поэтому применим дополнительные меры защиты нашего сайта на DLE. Первым делом в нашей папке /backup, если у нас старая версия скрипта создаем .htaccess с содержимым:

1
2
Order Deny,Allow
Deny from all

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

Теперь мы переименовываем свою админку в админке, и сам файл admin.php на сервере. Это защитит вас от лоха. Как вы обозвали свою админку в принципе можно легко узнать. Но следующей мерой мы ограничим в нее доступ по IP. Если у вас нет журналистов, то не будет вообще никаких проблем, но и с журналистами в принципе все достаточно решаемо. Открываем файл .htaccess в корне сайта. Находим:

1
RewriteEngine On

И ниже добавляем:

1
2
3
4
5
6
7
8
ErrorDocument 403 "<h1>Forbidden</h1>"
 
<Files "имя вашей админки.php">
Deny from all
Allow From 55.56. #Администратор
Allow From 55.56. #Журналист 1
Allow From 109.667. #Журналист 2
</files>

И этого должно быть достаточно для защиты вашего сайта от злоумышленника. Вы и ваши журналисты без проблем попадете в админку сайта, посторонние (а хрен там делать посторонним?) получат: Forbidden. Кроме того запретите зарегистрированным пользователям загружать на сайт файлы и картинки. Эта опция настраивается в «Список всех разделов» -> «Настройка групп пользователей».

Если эти меры не помогут, то существуют еще более радикальные способы защиты вашего сайта на DLE. Но сама тема все еще осталась не совсем раскрыта, поэтому в следующей публикации мы будем ловить Зюзю, так что подписывайтесь на RSS и вы узнаете еще много интересного!



Поделись с друзьями!

    Получай обновления сайта прямо на e-mail!

    Введите Ваш email:

    Кроме того, интересно почитать:

Comments13 комментариев

 

  1. Дле- вообще движок-дырка

  2. @ pavka:

    Дырки есть в любом движке…

  3. gin:

    @ webwm:
    Как с вами можно связатся? Контакт неработает.

  4. gin говорит, что:
    Контакт неработает.

    Откуда такое мнение? :-D Я получил два письма. Отвечу, не переживайте.

  5. baku:

    а че за 55.56. немпонял я %)

  6. baku говорит, что:
    а че за 55.56

    Подсеть IP администратора =)
    Можно и полностью указать — 55.56.555.333 (или иной), но в случае динамического IP, а по большей части все внешние IP провайдера динамические, сам администратор в админку не попадет :-D

  7. Очень помогло

  8. @ Алекс:

    Удачи, рад что пост был полезен =)

  9. Николай:

    @ webwm: , Спасибо, тебе за интересные и полезные посты.

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

    Классный ты парень, удачи тебе в DLE исследованиях.

  10. Николай говорит, что:
    Классный ты парень, удачи тебе в DLE исследованиях.

    Николай, спасибо конечно :-D но при написании всех этих постов я рассчитывал на то, что они помогут многим владельцам DLE в защите своих сайтов. И как показывает время они помогают =) А это главное!

    Что касается книги… то наверное тут не столько трудов чтобы хватило на книгу, и даже маловато для мануала =) И спецы есть гораздо круче меня по этому движку, так что книгу мы оставим ближе к пенсии =)

  11. Алекс:

    В 9.2 в файле htaccess так и должно быть?

    # Редиректы
    RewriteRule ^page/(.*)$ index.php?cstart=$1 [L]

    # Сам пост
    RewriteRule ^([0-9]{4})/([0-9]{2})/([0-9]{2})/page,([0-9]+),([0-9]+),(.*).html(/?)+$ index.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&cstart=$5&news_name=$6 [L]
    RewriteRule ^([0-9]{4})/([0-9]{2})/([0-9]{2})/page,([0-9]+),(.*).html(/?)+$ index.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&news_name=$5 [L]
    RewriteRule ^([0-9]{4})/([0-9]{2})/([0-9]{2})/print:page,([0-9]+),(.*).html(/?)+$ engine/print.php?subaction=showfull&year=$1&month=$2&day=$3&news_page=$4&news_name=$5 [L]
    RewriteRule ^([0-9]{4})/([0-9]{2})/([0-9]{2})/(.*).html(/?)+$ index.php?subaction=showfull&year=$1&month=$2&day=$3&news_name=$4 [L]

    RewriteRule ^([^.]+)/page,([0-9]+),([0-9]+),([0-9]+)-(.*).html(/?)+$ index.php?newsid=$4&news_page=$2&cstart=$3 [L]
    RewriteRule ^([^.]+)/page,([0-9]+),([0-9]+)-(.*).html(/?)+$ index.php?newsid=$3&news_page=$2 [L]
    RewriteRule ^([^.]+)/print:page,([0-9]+),([0-9]+)-(.*).html(/?)+$ engine/print.php?news_page=$2&newsid=$3 [L]
    RewriteRule ^([^.]+)/([0-9]+)-(.*).html(/?)+$ index.php?newsid=$2 [L]

    RewriteRule ^page,([0-9]+),([0-9]+),([0-9]+)-(.*).html(/?)+$ index.php?newsid=$3&news_page=$1&cstart=$2 [L]
    RewriteRule ^page,([0-9]+),([0-9]+)-(.*).html(/?)+$ index.php?newsid=$2&news_page=$1 [L]
    RewriteRule ^print:page,([0-9]+),([0-9]+)-(.*).html(/?)+$ engine/print.php?news_page=$1&newsid=$2 [L]
    RewriteRule ^([0-9]+)-(.*).html(/?)+$ index.php?newsid=$1 [L]

    # За день
    RewriteRule ^([0-9]{4})/([0-9]{2})/([0-9]{2})(/?)+$ index.php?year=$1&month=$2&day=$3 [L]
    RewriteRule ^([0-9]{4})/([0-9]{2})/([0-9]{2})/page/([0-9]+)(/?)+$ index.php?year=$1&month=$2&day=$3&cstart=$4 [L]
    # За весь месяц
    RewriteRule ^([0-9]{4})/([0-9]{2})(/?)+$ index.php?year=$1&month=$2 [L]
    RewriteRule ^([0-9]{4})/([0-9]{2})/page/([0-9]+)(/?)+$ index.php?year=$1&month=$2&cstart=$3 [L]
    # Вывод за весь год
    RewriteRule ^([0-9]{4})(/?)+$ index.php?year=$1 [L]
    RewriteRule ^([0-9]{4})/page/([0-9]+)(/?)+$ index.php?year=$1&cstart=$2 [L]
    # вывод отдельному тегу
    RewriteRule ^tags/([^/]*)(/?)+$ index.php?do=tags&tag=$1 [L]
    RewriteRule ^tags/([^/]*)/page/([0-9]+)(/?)+$ index.php?do=tags&tag=$1&cstart=$2 [L]
    # вывод для отдельного юзера
    RewriteRule ^user/([^/]*)/rss.xml$ engine/rss.php?subaction=allnews&user=$1 [L]
    RewriteRule ^user/([^/]*)(/?)+$ index.php?subaction=userinfo&user=$1 [L]
    RewriteRule ^user/([^/]*)/page/([0-9]+)(/?)+$ index.php?subaction=userinfo&user=$1&cstart=$2 [L]
    RewriteRule ^user/([^/]*)/news(/?)+$ index.php?subaction=allnews&user=$1 [L]
    RewriteRule ^user/([^/]*)/news/page/([0-9]+)(/?)+$ index.php?subaction=allnews&user=$1&cstart=$2 [L]
    RewriteRule ^user/([^/]*)/news/rss.xml(/?)+$ engine/rss.php?subaction=allnews&user=$1 [L]
    # вывод всех последних новостей
    RewriteRule ^lastnews/(/?)+$ index.php?do=lastnews [L]
    RewriteRule ^lastnews/page/([0-9]+)(/?)+$ index.php?do=lastnews&cstart=$1 [L]
    # вывод в виде каталога
    RewriteRule ^catalog/([^/]*)/rss.xml$ engine/rss.php?catalog=$1 [L]
    RewriteRule ^catalog/([^/]*)(/?)+$ index.php?catalog=$1 [L]
    RewriteRule ^catalog/([^/]*)/page/([0-9]+)(/?)+$ index.php?catalog=$1&cstart=$2 [L]
    # вывод непрочитанных статей
    RewriteRule ^newposts(/?)+$ index.php?subaction=newposts [L]
    RewriteRule ^newposts/page/([0-9]+)(/?)+$ index.php?subaction=newposts&cstart=$1 [L]
    # Статистические страницы
    RewriteRule ^static/(.*).html(/?)+$ index.php?do=static&page=$1 [L]
    # вывод избранных статей
    RewriteRule ^favorites(/?)+$ index.php?do=favorites [L]
    RewriteRule ^favorites/page/([0-9]+)(/?)+$ index.php?do=favorites&cstart=$1 [L]

    RewriteRule ^rules.html$ index.php?do=rules [L]
    RewriteRule ^statistics.html$ index.php?do=stats [L]
    RewriteRule ^addnews.html$ index.php?do=addnews [L]
    RewriteRule ^rss.xml$ engine/rss.php [L]
    RewriteRule ^sitemap.xml$ uploads/sitemap.xml [L]

    RewriteCond %{REQUEST_FILENAME} !-d
    RewriteRule ^([^.]+)/page/([0-9]+)(/?)+$ index.php?do=cat&category=$1&cstart=$2 [L]
    RewriteRule ^([^.]+)/?$ index.php?do=cat&category=$1 [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^.]+)/rss.xml$ engine/rss.php?do=cat&category=$1 [L]
    RewriteRule ^page,([0-9]+),([^/]+).html$ index.php?do=static&page=$2&news_page=$1 [L]
    RewriteRule ^print:([^/]+).html$ engine/print.php?do=static&page=$1 [L]

    RewriteCond %{REQUEST_FILENAME} !-f
    RewriteRule ^([^/]+).html$ index.php?do=static&page=$1 [L]

  12. @ Алекс:

    Я не знаю девятку, вообще не ковырял. Что мои что клиентские все на восьмой линейке. Я обновляться особо не вижу смысла, тк задачи сайтов весьма специфические. В одних случаях это визитка, в других новостники, ну и еще по мелочи =)

Комментировать