Jump to content

0x01 前言任意文件下載漏洞作為最常見的WEB漏洞之一,在平常的滲透測試中經常遇到,但是很多人卻並沒有深入去想該如何利用這種漏洞,導致忽略了一些細節的信息。

0x02傳統利用1) 下載配置文件連數據庫通過任意文件下載漏洞下載網站配置文件,利用數據庫配置信息遠程連接數據庫。

php:通過讀取當前頁面源碼反向查找數據庫配置文件

aspx:Web.config

java:WEB-INF/web.xml、WEB-INF/classes/applicationContext.xml 、application.yml、application.properties、conf/tomcat-users.xml

其它配置:php.ini、my.ini、MetaBase.xml、access.log

2) 下載操作系統敏感文件通過下載操作系統中的文件獲取敏感信息,不同操作系統中的敏感文件包括

Windows:

C:\Windows\win.ini

C:\Windows\System32\drivers\etc\hostsC:\ProgramData\Microsoft\Search\Data\Applications\Windows\GatherLogs\SystemIndex\SystemIndex.{%d}.gthr其中%d替換為1-500的數字,文件中保存大量應用對應的臨時文件路徑,可以洩露敏感信息,有時有奇效C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\PowerShell\PSReadline\ConsoleHost_history.txt其中Administrator可以替換為其它系統用戶名,文件中保存Powershell歷史執行命令記錄

Linux:

/etc/passwd

/etc/shadow

/etc/profile

/etc/hosts

/etc/issue

/etc/ssh/sshd_config

/root/.bash_history歷史命令

/root/.ssh/authorized_keys

ssh公鑰/root/.ssh/id_rsa

ssh私鑰/root/.mysql_history

/proc/net/arp

內網arp表信息

/proc/net/route

內網路由表信息

/proc/net/tcp

主機建立的tcp連接信息,類似於netstat

/proc/[PID]/cmdline

其中pid替換為進程號,返回當進程運行時的命令

/proc/[PID]/environ其中pid替換為進程號,返回當進程運行時的環境變量信息

/proc/self/loginuid當前用戶

/proc/sched_debug獲取當前進程信息0x03 進階利用1)SpringBoot環境下的任意文件利用SpringBoot一般來說是通過jar包來啟動服務,如圖3.1所示,所以通過任意文件下載漏洞最有利用價值的是下載到SpringBoot對應的jar包。

QQ截图20231225110711.png

這裡可以組合linux文件下載中的多個文件,構造一條SpringBoot任意文件下載利用鏈,如下所示。

【Step1】

從圖3.1可以看出SpringBoot一般是通過java命令來啟動的,所以可以通過java關鍵字來定位對應的pid進程號。

通過任意文件讀取/proc/sched_debug,獲取服務器中的進程信息。通過關鍵字java定位SpringBoot對應的進程,獲取進程號pid,如圖3.2所示。

QQ截图20231225110851.png

【Step2】

通過/proc/[PID]/cmdline和/proc/[PID]/environ獲取進程對應的信息,一般情況下通過這種方式可以拿到SpringBoot對應的jar包的絕對路徑,如圖3.3,圖3.4所示。其中cmdline可以獲取進程對應的包名,environ可以獲取對應的絕對路徑,組合之後可以得到jar包對應絕對路徑,如圖3.5所示。

QQ截图20231225110949.png

通過組合/proc/sched_debug和/proc/[PID]/environ可以滿足絕大部分場景下對目標進程信息的探索。

2)SpringMVC環境下的任意文件利用由於java程序並不能像PHP那樣通過讀當前文件來一步步下載整個程序的源碼做代碼審計,SpringMVC環境下一般的代碼處理邏輯都在controller類中,但是我們仍然可以通過任意文件下載漏洞來下載對應的源碼。

【Step1】

通過下載WEB-INF/web.xml文件,查看其中的servlet-class標籤,有針對性下載標籤對應的類名,如圖3.6所示。

QQ截图20231225111038.png【Step2】

基於拿到的類的全限定類名,下載對應的class文件。如圖3.6所示,拿到類的全限定類名是com.js.oa.jsflow.action.WorkFlowPdfServlet,則對應的class文件相對路徑為classes/com/js/oa/jsflow/action/WorkFlowPdfServlet.class,如圖3.7所示。

QQ截图20231225111111.png

除了web.xml中可以找到類的全限定類名,在任何一個.class文件中,均可以找到這種類似的全限定類名。通過這種方式遍歷可以較完整的拿到整個SpringMVC的源碼,對於其它tomcat servlet項目也是一樣的思路。

需要說明的是,並不是所有的tomcat項目的controller源碼都能在WEB-INF/classes/目錄下找到,還有部分系統會把邏輯代碼寫到jar包中並放在WEB-INF/lib/目錄下,如圖3.8所示,某系統在classes目錄下不存在任何class文件,所有的邏輯均在WEB-INF/*.jar包中。如果代碼邏輯在jar包中,就需要猜測jar包的完整名稱,這種情況下通常不容易通過黑盒方式下載到源代碼。

QQ截图20231225111145.png0x04 深度利用在上面的方式中,還是偏向於通過任意文件下載下載網站源代碼進行源碼分析,但是在某些框架中,可以通過源碼下載漏洞構造反序列化利用鏈,達到RCE的效果。

CodeIgniter框架是一個非常流行的php框架,在中小WEB應用中具有較大的使用量。舊版本的CodeIgniter默認情況下CodeIgniter的session保存在Cookie中,並且通過反序列的方式來加載。

我下載的CodeIgniter的源碼是以前下載的,可能和最新的代碼稍有出入。在system/libraries/Session.php文件中,如圖4.1所示。

QQ截图20231225111249.png

其中保證Cookie不被篡改的關鍵是通過hash_hmac方法計算Cookie最後40位的hash值,其中$this-encryption_key是CodeIngniter框架配置文件中的值,保存在application/config/config.php文件中,這個值沒有默認值,並且不能為空,如圖4.2所示。

QQ截图20231225111316.png

如果存在任意文件下載漏洞,下載對應的application/config/config.php文件,則可以獲取Cookie加密的key,這樣就可以把任意文件下載漏洞轉化為反序列化漏洞。

在CodeIgniter框架中,如果Cookie中包含了序列化的內容,如圖4.3所示,則代表可以通過任意文件讀取獲取加密key來構造反序列化過程,結合框架本身的反序列化利用鏈,則可能造成反序列化漏洞。

QQ截图20231225111349.png基於框架的Cookie反序列化漏洞在實際中非常普遍,其它還有很多框架也有類似的問題,Yii框架也有類似於CodeIgniter一樣的邏輯,在之前一篇關於通達OA的反序列化漏洞的文章https://mp.weixin.qq.com/s/nOQuqt_mO0glY-KALc1Xiw中,介紹過關於Yii硬編碼key導致的反序列化漏洞。同樣如果存在任意文件下載漏洞,則可以讀取對應的key構造反序列化利用鏈。

如果是aspx的目標網站,同樣可以通過任意文件下載,獲取Web.config中關於ViewState參數的加密密鑰,ViewState參數經過解密之後會進行反序列化操作,造成.net的反序列化漏洞,詳情可以參考文章

https://paper.seebug.org/1386/。0x05 總結在滲透測試的過程中,如果遇到任意文件下載漏洞,多數場景下都可以對任意文件下載漏洞進行深入利用。本文主要結合一些特定的目標場景,總結一些關於任意文件下載漏洞的利用思路,本文僅做學習研究,請勿進行非法的網絡攻擊活動。

來源:烽火台實驗室

0 Comments

Recommended Comments

There are no comments to display.

Guest
Add a comment...