http://ASP.NET的Web應用中比較常見的漏洞之一是本地文件泄露。如果您從未研究過相關技術,那麼如何利用本地文件下載漏洞(LFD)可能會讓您感到無所適從。在下面的文章中,我將描述一個受LFD漏洞影響的Web應用,然後利用這個漏洞控制伺服器。
確認漏洞
在測試目標網站時,我看到了這樣一個url…
https://domain.com/utility/download.aspx?f=DJ/lc1jVgHTZF...
當載入頁面時,這個url會從伺服器上的另一個路徑下載幫助文檔。我不認為我能夠篡改這個url,因為它的參數是被加密的,但是再一想。如果我能夠找到密鑰來解密參數(可能是AES加密演算法),那麼我可以偽造參數並找到一個LFD漏洞。
令我驚訝的是,我最終看到在這個網站的老版本上看到了相同功能的鏈接,具有如下
https://domain.com/utility/download.aspx?f=file1234.docx
這個請求的並返回包內容如下
HTTP/1.1 200 OK
Connection: close
Content-Length: 27363
?ó|u?Z^tù¢y?ˉ;!Y,}{?C?3/h>
...
我看到這之後做的第一件事是把字元串download.aspx作為參數,令我驚訝的是,請求返回了這個頁面的源碼。
GET /utility/download.aspx?f=download.aspx
HTTP/1.1 200 OK
Connection: close
Content-Length: 263
<%@ Page Language="C#" AutoEventWireup="true" Debug="true" %>
...
讀取download.aspx
的源碼錶明我可以訪問任意文件,但這其實還是存在限制,因為真正的源代碼(存儲文件的實際來源)位於文件filename.aspx.cs。我嘗試讀取它,但並沒有用。
事實證明,在我的測試這個漏洞過程的中,始終無法訪問.aspx.cs文件。 (有關.aspx和.aspx.cs文件之間差異, https://stackoverflow.com/questions/13182757/what-is-the-difference-between-aspx-and-aspx-cs )。
我必須找到解決這個問題的方法,但是現在,讓我們嘗試從不同的目錄中讀取儘可能多的文件,這樣我們就可以了解更多。
繞過遍歷文件的阻礙
我在測試過程發現我無法在末尾添加兩個點(..),否則請求將響應400。
為了繞過,我採取的一種模糊測試看是否有任何字元可以生效。
我使用了以下請求...
GET /utility/download.aspx?f=.[fuzz]./utility/download.aspx
我開始手動遍歷所有字元直到看到含有.+./utility/download.aspx
的url成功返回了download.aspx的內容。很好,現在我們就可以遍歷目錄了。為什麼這樣會生效?我不確定。我在我自己的搭建的ASP.NET應用上嘗試過這個,看看它是否具有通用性,但測試過不行。我的猜測是這和Window中含有空格文件名的內部邏輯有關,但我還未徹底研究。
證明漏洞影響
因為我現在可以跨目錄讀取閱讀文件,所以我嘗試的第一件事就是讀取.ashx文件。因為這些是處理程序而不是表示文件( https://www.dotnetperls.com/ashx ),我猜測它們也能被訪問。
果然有效!
HTTP/1.1 200 OK
Connection: close
Content-Length: 2398
<%@ WebHandler Language="C#" Class="redacted.redacted" %>
Imports System
Imports System.Data
Imports System.Data.SqlClient
Imports System.IO
Imports System.Web
Imports System.Configuration
...
這至少表明我能夠讀取一些更為敏感的東西。我的下一步是閱讀更多的源代碼。
我在閱讀http://ASP.NET文檔時發現的一點是,編譯後的類保存在/bin/className.dll
中。這意味著我們應該能夠提取.ashx文件中引用的類名。
通過發送以下請求,我能夠讀取源文件的DLL(有關DLL的更多信息, https://blogs.msdn.microsoft.com/tom/2008/07/21/asp-net-tips-loading-a-dll-out-of-the-bin-directory/ )
GET /utility/download.aspx?f=.+./.+./bin/redacted.dll
下載後,我可以使用使用dnSpy導入DLL並恢復應用程序的源,此外還有更多的類可以從中取得。