在网络安全领域,SQL 注入(SQL Injection)是一种非常经典且常见的攻击方式。而想要进行有效的 SQL 注入,熟悉不同数据库的基本特点和差异是非常重要的。
为什么要了解不同数据库?
在实际攻击或测试过程中,目标系统后端使用的数据库类型可能不同,如 MySQL、Oracle、SQL Server、PostgreSQL、SQLite 等。
不同数据库在:
- SQL语法(特别是字符串处理、条件判断、错误信息)
- 特定函数(如字符串拼接、取子串、时间延迟)
- 特殊表(如 Oracle 的 dual 表)
- 错误处理机制
1. MySQL
- 字符串拼接:
使用CONCAT('a', 'b')
进行字符串连接。
'a' 'b'
注意中间的空格 - 注释:
单行注释:--
(注意后面跟空格)
另一种:#
,/*abc*/
- 盲注常用技巧:
SLEEP(5)
实现延时注入。
SELECT IF(YOUR-CONDITION-HERE,SLEEP(10),'a')
实现条件延时 - 特有函数:
SUBSTRING(str, pos, len)
提取子串。
LENGTH(str)
计算字符串长度。 - 常用查询语句:
SELECT @@version
查询数据库版本
SELECT * FROM information_schema.table
查询数据库中信息
SELECT * FROM information_schema.columns WHERE table_name = 'TABLE-NAME'
查询数据库中特定表中信息
SELECT IF(YOUR-CONDITION-HERE,(SELECT table_name FROM information_schema.tables),'a')
条件判断,布尔盲注 - 常见错误识别:
报错信息中经常出现You have an error in your SQL syntax
。
特点:容错性高,注释灵活,注入 payload 构造比较简单。
2. Oracle
- 注释:
--
也是Oracle注释,但小心空格问题。 - 字符串拼接:
使用||
进行拼接,如'abc' || 'def'
。 - 特有表:
dual
,用于没有 FROM 子句时补充,比如SELECT 1 FROM dual
。 - 常用查询语句:
SUBSTR(str, pos, len)
提取子串。
SELECT banner FROM v$version
,SELECT version FROM v$instance
查询数据库版本
SELECT * FROM all_tables
查询数据库中信息
SELECT * FROM all_tab_columns WHERE table_name = 'TABLE-NAME-HERE'
查询数据库中特定表中信息 - 盲注常用技巧:
1.利用条件触发异常,例如:TO_CHAR(1/0)
造成除零错误。
2.dbms_pipe.receive_message(('a'),10)
延时
3.SELECT CASE WHEN (YOUR-CONDITION-HERE) THEN 'a'||dbms_pipe.receive_message(('a'),10) ELSE NULL END FROM dual
条件延时 - 常见限制:
不允许SELECT
返回多行;需要ROWNUM=1
限制。
特点:语法严格,需要对 SQL 构造非常精细;通过错误反馈判断注入是否成功。
3. Microsoft SQL Server(MSSQL)
- 字符串拼接:
使用+
进行拼接,如'abc' + 'def'
。 - 盲注常用技巧:
使用WAITFOR DELAY '00:00:05'
进行时间盲注。 - 特殊函数:
LEN(str)
计算长度。
SUBSTRING(str, start, length)
截取子串。 - 错误注入:
比如非法转换错误:CONVERT(int, 'abc')
。 - 常见注释:
--
注释行。
特点:延迟注入好用,字符串处理灵活。
4. PostgreSQL
- 字符串拼接:
使用||
拼接。 - 盲注技巧:
使用pg_sleep(5)
进行延迟。 - 其他特性:
错误信息非常详细。
支持子查询、UNION注入等多种方式。 - 注释:
标准 SQL 风格--
。
特点:语法接近标准 SQL,支持复杂查询,但安全配置较好时防护很强。
5. SQLite
- 字符串拼接:
使用||
。 - 盲注技巧:
支持randomblob()
或使用复杂查询绕过。 - 常见限制:
不支持很多传统数据库中的高级功能,比如延迟函数。 - 注释:
--
注释行。
特点:轻量,语法简洁,但功能有限,注入方式相对简单。
小结
- 不需要把每种数据库学得很深,只要掌握:
- 拼接方式(CONCAT / || / +)
- 延迟注入方法(SLEEP / pg_sleep / WAITFOR DELAY)
- 特殊表和错误处理(dual表 / 错误特征)
- 注释符
只要掌握了这些内容,进行基本的 SQL 注入测试和攻防演练已经完全够用了。