當前位置:
首頁 > 新聞 > 深入分析web.config上傳方面的安全問題(下)

深入分析web.config上傳方面的安全問題(下)

2.2. 接管現有/上傳的.NET文件

下面的web.config可用於接管現有的Web服務文件:

這將從SMB共享載入webshell.aspx文件,並在打開該文件夾中的任何現有ASMX文件時執行它。

此外,我們也可以像ASMX文件那樣,重新映射和使用具有.master和.ascx擴展名的文件。上傳具有上面兩種擴展名的文件的可能性要高於其他類型的ASP.NET擴展,例如.aspx、.asmx、.ashx、.svc和.soap,不過,它們也可以使用相同的技術來接管.NET文件。

下面的web.config文件給出了一個可以接管具有各種擴展名的文件的例子:

當SMB被阻止時,就很難應用該技術了,因為wsdlHelpGenerator元素的href屬性中的文件擴展名至關重要。

2.3. 存儲型XSS

此外,我們也可以設法創建存儲型XSS漏洞。尤其是當其他方法無法奏效時,這一招就派上用場了。

在文獻[1]中,作者為我們介紹了許多通過上傳web.config文件使應用程序易受XSS攻擊的方法。例如,當允許下載某些文件時,可以通過操作mimetypes輕鬆地將其用於XSS攻擊。下面舉例說明如何將一個.txt文件當做.html文件來運行:

在這篇文章中,又發現了兩個ASP.NET處理程序也可用於實現上面的攻擊。

2.3.1. Using StateApplication hanlder

StateApplication處理程序是System.Web.SessionState命名空間內的一個用於緩存的內部類,用戶代碼無法直接調用它,因為使用任意文本替換現有文件的響應可能會被濫用。

下面的web.config文件就是一個使用XSS payload來替換web.config的響應的例子:

要想在緩存中創建一個生存期為525600分鐘(最長時間)的存儲型XSS,需要在上傳web.config文件後發送以下請求:

PUT /testwebconfig/userfiles/web.config HTTP/1.1

Host: victim.com

Http_Timeout: 525600

Content-Length: 25

然後,就可以通過下列方式來獲取相應的內容了:

http://victim.com/testwebconfig/userfiles/web.config

然後,就可以通過下列方式來刪除相應的內容了:

DELETE /testwebconfig/userfiles/web.config HTTP/1.1

Host: victim.com

為了通過同一個名稱來創建多個XSS payload,可以將其他參數添加到URL,具體如下所示:

Web.config/payload1

Or

Web.config\payload1

And

Web.config?payload2

2.3.2. 使用DiscoveryRequestHandler處理程序

System.Web.Services.Discovery命名空間中的DiscoveryRequestHandler類可用於提供XML文件(實際使用的是其中的.disco文件)。它可能會被濫用來從XML響應中運行JavaScript代碼。

如果可以上傳web.config文件的話,那麼也可以上傳含有JavaScript代碼的XML的test.config文件。下面的web.config就是一個這樣的例子,其中test.config文件將用作XML文件:

test.config文件的內容如下所示:

需要注意的是,具有合法的DynamicDiscoveryDocument類型的XML文件不能用於XSS攻擊,因為它將用於搜索當前目錄中現有的Web服務。對於好奇的讀者來說,可以參考下面的例子,這裡的文件內容都是合法的:

3. 防禦方法

第一道防線是使用白名單方法來檢查文件名、擴展名和文件內容。這樣的話,一方面可以過濾掉帶有禁止的擴展名的文件,並確保文件內容的格式符合相關要求。這方面的詳細建議,請參閱OWASP網站[7]上的相關介紹。

另一個經典的建議是,將文件保存在Web目錄之外或資料庫中。當前,一種更加安全的方法是將上傳的文件存儲在雲中,比如在AmazonS3中。對於這種方法來說,必須控制好相關的訪問許可權,此外,還需要確保實現代碼中不會出現其他類型的安全漏洞,如不安全對象引用(IDOR)或路徑操作等。

此外,使用適當的HTTP頭部也可以防止跨站內容劫持攻擊(請參見文獻[8])。

我們也可以通過下面的安全建議來提高基於web.config文件上傳的網路攻擊的難度:

·使用預編譯的應用程序,這樣能夠提高攻擊應用程序的難度

·確保Web應用程序中的現有文件沒有寫入許可權,包括web.config文件,尤其是上傳目錄之外的文件

·監控網站上動態文件的創建,以檢測潛在的攻擊活動

如果您無權訪問代碼、無法修改文件許可權或無法修改應用程序的工作方式,您仍可以通過在應用程序路徑或網站根目錄中使用web.config文件來緩解相關的攻擊活動:

如果可能的話,請確保虛擬目錄中的web.config文件已被禁用。這一點可以通過修改applicationHost.config文件中的allowSubDirConfig屬性來實現,該文件通常位於C:\Windows\system32\inetsrv\config(有關詳細信息,請參閱文獻[9])

不應該被子目錄中的其他web.config文件更改的敏感web.config元素也應該受到妥善保護。這一點可以使用web.config文件中的allowOverride屬性或鎖定功能來完成(有關詳細信息,請參閱文獻[10]和[11])。我們可以將下面的web.config示例文件存放到父目錄中,以鎖定可能被上面介紹的攻擊方法所濫用的某些部分:

4.幕後花絮

這一部分基本上涵蓋了我在研究過程中為找到上述功能所做的各種工作。儘管這可能是這篇文章中最無聊的部分,但我認為它對想繼續這項研究的人來說是有用的。

當web.config位於IIS應用程序的根目錄時,最容易找到運行代碼和命令的方式,因為這時可以直接通過相關文檔來了解web.config的功能,或者參考我以前的研究工作。

然而,當一個web.config文件被上傳到一個子文件夾(這是最常見的情況)時,探索新的利用方法就需要下更多的功夫了。

4.1. 必要條件和相關資源

除了時間之外,我最主要的研究資源就是ASP.NET Framework源代碼、Visual Studio、Sysinternals Process Monitor、dnSpy、Telerik JustDecompile、IIS Web伺服器、Kali Linux以及Google搜索引擎了!

我之所以選擇使用Kali Linux,主要是為了擁有一個簡單的、無需身份驗證的SMB共享,並且具有相應的讀/寫許可權。最終得到的可以支持SMB v3的/etc/samba/smb.conf文件如下所示:

[global]

#workgroup = WORKGROUP

#server string = Samba Server XYZ

#netbios name = someRandomUbuntu

#security = user

map to guest = Bad User

#dns proxy = no

log file = /var/log/samba/%m

log level = 1

server min protocol = SMB3

client min protocol = SMB3

client max protocol = SMB3

[Public]

path = /tmp/smbshare/

writable = yes

guest ok = yes

read only = no

browsable = yes

create mode = 0777

directory mode = 0777

# force user = nobody

4.2. 編譯器選項

濫用編譯器選項時,我們曾經嘗試參數放到一個文件中,然後通過@字元將其傳遞給相應的編譯器(csc.exe、vbc.exe或jsc.exe)但是這無法實現命令注入,因為無法使用它來運行其他命令。

尋找命令執行漏洞時,還可以採取下面的兩種方法,它們比本文中使用的方法要更簡單一些:

·編譯特定文件時發生的代碼執行漏洞

·查找可以依次運行代碼或命令的參數

其中,-analyzer選項對於C#編譯器來說貌似很有希望,但是.NET執行csc.exe文件時會忽略該選項。

4.3. 探索其他的處理程序

正如在本文中看到的那樣,識別可以通過web.config文件處理的所有HTTP處理程序是非常重要的一件事情。為此,可以通過搜索實現IHttpHandler、IHttpHandlerFactory和IHttpHandlerFactory2的類來完成這項任務。

以下是在瀏覽器中輕鬆查看它們的方法(感謝微軟!):

https://referencesource.microsoft.com/#System.Web/IHttpHandler.cs,62c4e10ee7e6cd36,references

https://referencesource.microsoft.com/#System.Web/IHttpHandlerFactory.cs,8437c9ce8bcd1bda,references

https://referencesource.microsoft.com/#System.Web/IHttpHandlerFactory.cs,21cd2fd2bb57b501,references

應該注意,有時還可以從現有的實現來派生新的處理程序。然而,它們的行為通常是完全相同的,很少會出現變化。

4.3.1. Handlers limit in a subfolder

ASP.NET使用文件擴展名來檢測文件的類型,如果無法獲得Web服務所需的正確類型,則需要將新擴展名添加到buildProviders元素中。但是,buildProviders元素只能由應用程序進行設置,否則會顯示以下錯誤:

此外,我們無法在應用程序級別之下定義元素「buildProviders」。

這項保護措施是在.NET Framework中的CompilationSection.cs的PostDeserialize()方法中實現的,而不是在machine.config文件中實現的:

https://referencesource.microsoft.com/#System.Web/Configuration/CompilationSection.cs,904

另外,還有一些方法可以通過預定義的擴展名在IIS上執行命令,但本文中研究的重點是使用允許上傳的那些新的文件類型。

我們可以在ASP.NET配置文件夾中的主web.config文件(其路徑為C:\Windows\Microsoft.NET\Framework64\v4.0.30319\Config\web.config)中看到預定義的buildProviders列表。

4.4. 臨時文件與已編譯好的文件

通常情況下,臨時文件和已編譯好的文件通常會複製到.NET Framework的臨時目錄中,例如:

C:\Windows\Microsoft.NET\Framework64\[version]\Temporary ASP.NET Files\[appname]\[hash]\[hash]

其中某些文件將被立即刪除,對於我來說,監視這些文件的最簡單方法是刪除所有用戶對於該應用程序所用臨時目錄的刪除許可權。這樣的話,如果需要可以輕鬆恢復。

我們可以在那裡創建文件,理論上說,我們可以替換該應用程序的現有文件,以便在伺服器上執行代碼。在實踐中,所有這些文件在其名稱中都會使用隨機值,所以,要想竊取這些文件,需要對其文件名進行相應的分析。我還沒有研究.NET Framework何時會創建新的DLL文件,但從理論上來說,應該可以通過覆蓋現有的DLL文件來接管應用程序任意位置的現有.NET文件。

5. 參考資料

[1] https://soroush.secproject.com/blog/2014/07/upload-a-web-config-file-for-fun-profit/

[2] https://docs.microsoft.com/en-us/iis/get-started/planning-your-iis-architecture/understanding-sites-applications-and-virtual-directories-on-iis

[3] https://soroush.secproject.com/blog/2019/07/iis-application-vs-folder-detection-during-blackbox-testing/

[4] https://soroush.secproject.com/blog/2019/04/exploiting-deserialisation-in-asp-net-via-viewstate/

[5] https://www.nccgroup.trust/uk/our-research/use-of-deserialisation-in-.net-framework-methods-and-classes/

[6] https://docs.microsoft.com/en-us/dotnet/csharp/language-reference/compiler-options/listed-alphabetically

[7] https://www.owasp.org/index.php/Unrestricted_File_Upload

[8] https://github.com/nccgroup/CrossSiteContentHijacking

[9] https://techcommunity.microsoft.com/t5/IIS-Support-Blog/How-to-prevent-web-config-files-to-be-overwritten-by-config/ba-p/297627

[10] https://weblogs.asp.net/jongalloway/10-things-asp-net-developers-should-know-about-web-config-inheritance-and-overrides

[11] https://docs.microsoft.com/en-us/previous-versions/dotnet/netframework-4.0/ms228167(v=vs.100)

喜歡這篇文章嗎?立刻分享出去讓更多人知道吧!


請您繼續閱讀更多來自 嘶吼RoarTalk 的精彩文章:

亞馬遜 S3 存儲桶勒索軟體攻防詳解(上)
Emissary Panda攻擊:針對中東政府的Sharepoint伺服器