歡迎來到 黑吧安全網 聚焦網絡安全前沿資訊,精華內容,交流技術心得!

CSS-T | Mysql Client 任意文件讀取攻擊鏈拓展

來源:本站整理 作者:佚名 時間:2020-01-21 TAG: 我要投稿

這應該是一個很早以前就爆出來的漏洞,而我見到的時候是在TCTF2018 final線下賽的比賽中,是被 Dragon Sector 和 Cykor 用來非預期h4x0r’s club這題的一個技巧。http://russiansecurity.expert/2016/04/20/mysql-connect-file-read/在后來的研究中,和@Dawu的討論中頓時覺得這應該是一個很有趣的trick,在逐漸追溯這個漏洞的過去的過程中,我漸漸發現這個問題作為mysql的一份feature存在了很多年,從13年就有人分享這個問題。
Database Honeypot by design (2013 8月 Presentation from Yuri Goltsev)
Rogue-MySql-Server Tool (2013年 9月 MySQL fake server to read files of connected clients)
Abusing MySQL LOCAL INFILE to read client files (2018年4月23日)
在圍繞這個漏洞的挖掘過程中,我們不斷地發現新的利用方式,所以將其中大部分的發現都總結并準備了議題在CSS上分享,下面讓我們來一步步分析。
 
Load data infile
load data infile是一個很特別的語法,熟悉注入或者經常打CTF的朋友可能會對這個語法比較熟悉,在CTF中,我們經常能遇到沒辦法load_file讀取文件的情況,這時候唯一有可能讀到文件的就是load data infile,一般我們常用的語句是這樣的:
load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
mysql server會讀取服務端的/etc/passwd然后將數據按照’\n’分割插入表中,但現在這個語句同樣要求你有FILE權限,以及非local加載的語句也受到secure_file_priv的限制
mysql> load data infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
ERROR 1290 (HY000): The MySQL server is running with the --secure-file-priv option so it cannot execute this statement
如果我們修改一下語句,加入一個關鍵字local。
mysql> load data local infile "/etc/passwd" into table test FIELDS TERMINATED BY '\n';
Query OK, 11 rows affected, 11 warnings (0.01 sec)
Records: 11  Deleted: 0  Skipped: 0  Warnings: 11
加了local之后,這個語句就成了,讀取客戶端的文件發送到服務端,上面那個語句執行結果如下

很顯然,這個語句是不安全的,在mysql的文檔里也充分說明了這一點
https://dev.mysql.com/doc/refman/8.0/en/load-data-local.html
在mysql文檔中的說到,服務端可以要求客戶端讀取有可讀權限的任何文件。
mysql認為客戶端不應該連接到不可信的服務端。

我們今天的這個問題,就是圍繞這個基礎展開的。
 
構造惡意服務端
在思考明白了前面的問題之后,核心問題就成了,我們怎么構造一個惡意的mysql服務端。
在搞清楚這個問題之前,我們需要研究一下mysql正常執行鏈接和查詢的數據包結構。
1、greeting包,服務端返回了banner,其中包含mysql的版本

2、客戶端登錄請求

3、然后是初始化查詢,這里因為是phpmyadmin所以初始化查詢比較多

4、load file local
由于我的環境在windows下,所以這里讀取為C:/Windows/win.ini,語句如下
load data local infile "C:/Windows/win.ini" into table test FIELDS TERMINATED BY '\n';
首先是客戶端發送查詢

然后服務端返回了需要的路徑


然后客戶端直接把內容發送到了服務端


看起來流程非常清楚,而且客戶端讀取文件的路徑并不是從客戶端指定的,而是發送到服務端,服務端制定的。
原本的查詢流程為
客戶端:我要把win.ini插入test表中
服務端:我要你的win.ini內容
客戶端:win.ini的內容如下....
假設服務端由我們控制,把一個正常的流程篡改成如下
客戶端:我要test表中的數據
服務端:我要你的win.ini內容
客戶端:win.ini的內容如下???
上面的第三句究竟會不會執行呢?
讓我們回到mysql的文檔中,文檔中有這么一句話:

[1] [2] [3] [4] [5]  下一頁

【聲明】:黑吧安全網(http://www.zjtpzs.live)登載此文出于傳遞更多信息之目的,并不代表本站贊同其觀點和對其真實性負責,僅適于網絡安全技術愛好者學習研究使用,學習中請遵循國家相關法律法規。如有問題請聯系我們,聯系郵箱[email protected],我們會在最短的時間內進行處理。
  • 最新更新
    • 相關閱讀
      • 本類熱門
        • 最近下載
        神秘东方电子游艺 宁夏十一选五开奖结果一定牛 山东福彩群英会开奖查询 日本女优三及电影 下载qq麻将手机版 今天的3d开奖结果 老快3开奖结果江苏 河南22选5大星走势图 捕鱼大亨3现金版 吉林麻将吉祥棋牌下载 福彩快乐十分走势图 幸运十一选五-手机APP下载 兰州沐足桑拿 江苏足球e球彩走势图 河南麻将下载安装 官方1分彩快 2008上证指数最低点