RDot

RDot (https://rdot.org/forum/index.php)
-   Статьи/Articles (https://rdot.org/forum/forumdisplay.php?f=10)
-   -   Ingres SQL Injection (https://rdot.org/forum/showthread.php?t=25)

Ded MustD!e 03.07.2010 02:34

Ingres SQL Injection
 
Ingres SQL-Injection

Небольшая заметка по Ingres, информации по этой СУБД крайне мало, поэтому решил поставить себе на локалхост и потренироваться. Далее мои впечатления и изыскания, форма представления материала скорее повествовательная, не привык писать строгие мануалы. Многие вещи основаны только на практике и моих домыслах, документация очень не понравилась, хотя без неё никуда.

Касательно материала по Ingres в интернете, всё что нашел - это фак от Elekt, в котором всё взять отсюда: http://www.xakep.ru/magazine/xa/105/082/1.asp и http://pentestmonkey.net/blog/ingres-sql-injection-cheat-sheet/.

Вступление/Впечатления

Скачал я последнюю версию Ingres 9.3 и попытался натянуть её на PHP+Apache, но работать оно у меня напрочь отказывалось. К счастью в скором времени я нашел сборку наподобии Денвера, но с Ингрес вместо Мускула, если кто захочет потыкать эту дрянь, скачать можно здесь http://esd.ingres.com/product/Commun...it/EasyIngres/.

Изначально у нас создается три БД: demodb, iidbdb, imadb и четыре юзера: admin, system, administrateur и $ingres. Нахрена так много я так и не понял, но вобщем-то не суть важно. Способов подключиться к БД извне я не нашел, а у всех пользователей по умолчанию отсутствует пароль. Пробовал создать своего пользователя, пароль у него шифруется такой абракадаброй, что я даже боюсь предположить, что это. По умолчанию у нового юзера отбираются вообще все права.

Практика

Для теста использовал нехитрый скрипт:

PHP код:

<?php
$link 
ingres_connect("demodb") or die("Could not connect");
$id $_GET[id];
$result ingres_query($link"select reltid,reltidx,relid from iirelation where reltid = $id");
$row ingres_fetch_row($result);
echo 
$row[1];
?>

Тут хотелось бы обратить внимание на то, как работает ingres_query(), первым параметром мы указываем БД к которой подключились, перескочить с одной на другую через db.table у меня не получилось.

С реализацией всё просто:
Код:

http://127.0.0.1/test.php?id=22+union+select+1,2,3
Что касается комментариев, можем использовать "--" и "/**/", но вот незадача, если я добавляю в конец комментарий, выпадает ошибка, поэтому на практике я их не использовал. Скажу больше, "--" у меня не сработал ни только в браузере, но и в консоли и графической оболочке, а "/*" вообще вешал графическую оболочку. Поэтому что делать, если нам нужно отсечь часть запроса я пока не придумал.

Достаем нужную инфу, от версии нам тут толку нет, по крайней мере я не нашел ничего полезного, что было бы в одной версии, но не было в другой. Смотрим БД с которой мы работаем:
Код:

http://127.0.0.1/test.php?id=22+union+select+dbmsinfo('database'),2,3
То что в скобках можно хексить привычным способом через 0x. В БД есть таблицы iitables и iicolumns, в которых можем посмотреть имена таблиц и колонок. Нас также интересует пользователь БД, ибо у таблиц есть владельцы и доступ к чему-либо можно закрыть.
Код:

http://127.0.0.1/test.php?id=-22+union+select+dbmsinfo('username'),2,3
Смотрим таблицы:
Код:

select table_name from iicolumns
И колонки в нужной таблице:
Код:

select column_name from iicolumns where table_name='таблица'
Вот тут начинаются проблемы, limit здесь отсутствует, а его замена OFFSET 1 FETCH NEXT 1 ROWS ONLY выдает ошибку, что может быть использована только в первом выражении select, следовательно мы в пролёте. Так что приходится довольствоваться "where table_name not in ()". Для поиска можно использовать LIKE по аналогии с MySQL.

Объединять строки можно через "||", при этом нам услужливо добавляется пробел между двумя записями. Также можно юзать concat, синтаксис шикарен)). Объединяем 2 колонки:
Код:

concat(concat(table_name,':'),column_name)
К сожалению отсутствует разделение запросов, поэтому самое вкусное остается за бортом. В Ingres можно создавать процедуры, очень похоже на PostgreSQL, чтобы скопировать что-то в файл используется команда COPY, но в выражение с SELECT её никак не пришьешь.

Интересные особенности:
Мануалы нереальной длины, всего в документации 24 гайда, док по SQL, например, занимает 866 страниц.
Вместо привычной конструкции 0xHEX можем использовать местный аналог X'HEX'.

Ну и в качестве вывода скажу, что с Ingres вполне можно работать, но выполнения команд и записи в файл либо сделать невозможно, либо я еще не нашел как=). Конструктивная критика, а также дополнения приветствуются, я мог где-то ошибиться, что-то не углядеть, надеюсь вместе разберемся.

FIXER 06.07.2010 06:18

Хорошая статья ..читали...
P.S улубнуло http://pentestmonkey.net/blog/ingres-sql-injection-cheat-sheet =)


Часовой пояс GMT +3, время: 13:14.

Powered by vBulletin® Version 3.8.5
Copyright ©2000 - 2018, Jelsoft Enterprises Ltd. Перевод: zCarot