Думаю, нелишне будет напомнить начинающим веб-мастерам о том, что какой бы движок для своего форума вы не выбрали, всегда существует вероятность взлома. И, чем популярнее ресурс, тем эта вероятность выше.
Сегодня я расскажу вам об одном популярном способе взлома форума на vbulletin 3.8.x, с которым сам когда то столкнулся. Этот взлом осуществляется через...картинки. Да-да, обыкновенные картинки.
Этот вид атаки известен давно. Представьте, каково было мое удивление, когда однажды открыв простой смайлик блокнотом среди всей абракадабры я увидел такой код:
PHP Code:
<?php
phpinfo();
?>
Такой вид атак называется XSS и весьма популярен. Выглядит все просто: пишем нужный код, засовываем его в изображение, загружаем изображение, например, как свою аватару и выполняем. Просто и сердито.
Но если до недавнего времени самой распространённой опасностью была загрузка PHP-скриптов через аватары и изображения, чаще всего PNG-формата, то сейчас на её место пришли картинки и Flash!-анимации, несущие в себе вредоносный код. У вас стоит крутая система защиты и фильтрации, админы и модераторы сутками дежурят на сайте, а сайт ломает какой нибудь школьник, прочитавший про XSS и немного знакомый с кодингом. Шутка ли?
Сегодня я не буду касаться обширной темы взлома, поговорим лишь о самом популярном - взломе с помощью картинок.
1. Подготовка
Перед началом взлома чаще всего подготавливается файл, который ваша система разрешает к загрузке. Пусть вы разрешили загрузку на сервер файлов формата PNG. Значит взломщик подготовит именно png-картинку. Защита загрузчиков во многих случаях примитивна и сводится к проверке заголовка файла, никоим образом не анализируя при этом его содержимое. И файл с вредоносным кодом успешно загружается на сервер.
Делается такая картинка простым дописыванием php или html-кода в конец PNG-файла (но иногда код встречается и в середине). В итоге при просмотре этой картинки браузер выплёвывает текстовое содержимое файла наружу и код выполняется. Неудобств у этой атаки 3:
- Атакуемый должен обратится непосредственно к картинке, а не к страничке её содержащую. Например www.vbsupport.com/image1.png
- Многие популярные движки хранят расширение файлов в базе, а сами файлы лежат переименованные в отдельной папке с одним и тем же расширением (например '.ext')
- Такие атаки проходят только с браузером Internet Explorer. Тот -же FireFox просто пишет что изображение повреждено
Как видите ограничения хоть и есть, но они не слишком значительны (кроме второго). Теперь разберём всё на практике. Давайте напишем небольшой скрипт который будет отвечать за аплоад картинок на сервер и форму в которой пользователь будет выбирать какую картинку загрузить. Давайте создадим файл index.html со следующим содержимым:
и скрипт upload.php:
Написали? Отлично! У нас есть самый простой аплоадер картинок. Теперь нарисуйте в любом редакторе картинку (например точку) и сохраните полученную картинку. Далее откройте эту картинку простым текстовым редактором, например блокнотом, и допишите в конец такой текст:
PHP Code:
<script>alert(1)</script>
2. Взлом
Если всё сделано правильно, то, обратившись к этому изображению с помощью IE вы увидите окошко с цифрой 1 и кишки картинки в виде обычной каши из разных символов. А цифра 1 в окошке означает, что взлом удался! Вместо тега
<script> можно написать любой другой код. И, если защита пропускает этот тег, можно выполнять абсолютно любые команды, в том числе и получить права администратора, выполнив с помощью PHP SQL-запрос.
3. Защита
Что бы защитить сайт от загрузки картинок, содержащих вредоносный код, нужно этот самый код как то фильтровать. В нашем примере нужно поставить фильтр на этот аплоад, что бы он не пропускал опасные картинки. Давайте сделаем это на примере тега
<script>. Мы будем действовать следующим образом:
- Сохраним загруженное изображение
- Откроем как текстовый файл и возьмём внутренности
- В получившемся тексте будем искать <script>
- Если данное выражение найдётся то удалим файл и сообщим об этом
Вот код который нужно добавить в аплоадер после загрузки файла:
PHP Code:
// Открываем файл для чтения
$handle = fopen($upload_file, "r");
// Читаем весь полностью
$file_text = fread($handle,filesize($upload_file));
fclose($handle);
// Если обнаружился <script
if (strpos($file_text,'<script')>-1)
{
// то удаляем этот файл и сообщаем пользователю
unlink($upload_file);
print 'XSS image!';
}
Вот и все! Попробуйте теперь загрузить вредоносную картинку!
Для проверки создайте ещё одно изображение, только полностью безопасное, и попробуйте загрузить его на сервер. У меня всё прошло нормально, а вот на загрузку опасного файла скрипт выругался. Значит защита работает!
Но помните, что фильтровать нужно не только тег <script> но и тэги типа <embed>,<applet>, <?php и т.д.. Так же нужно не забывать о фильтрации полного слова javascript. А перед проверкой лучше текстовые внутренности перевести через функцию strtolower(), так как могут попасться и <SCRIPT> и JAvAscRIpT
:alert(1)
И ещё. Не вздумайте проверять изображения на наличие '<' и '>' так как эти символы присутствуют в коде каждой картинки и каждое PNG-изображение будет считаться опасным.
Удачи!