By 空虚浪子心 http://www.inbreak.net/ @javasecurity http://t.qq.com/javasecurity
摘要
这个漏洞在 2010 年出的,当时由于环境问题,并没有找到稳定利用的 EXP。作者对 spring mvc 框架
不熟悉,很多地方不了解,结果研究了一半,证明了漏洞的部分严重性就放下了,没有弄出 POC 来。
最近同事也想研究下,勾起了研究兴趣,结果运气爆发,解决了当年没有搞定的 N 多问题和错误,这
才终于让服务器上的 CALC 跑起来。
当然,本文不会提供 POC,只是对官方的 POC 分析一下,以及告诉大家怎么写自己想要的 EXP,本文
不会提供黑客工具,只讨论技术。
正文
这个漏洞其实有两种玩法,一种是拒绝服务,一种是远程代码执行,其中还隐藏着一些其他技术内幕。
我们先从拒绝服务讲起,漏洞发布者并没有提到这里可能出现拒绝服务攻击,这是本文作者无意中发
现的。这个发现可以绕过 tomcat 的某段挫代码,下文中会“弱弱的”提到这个挫代码事情。
漏洞发布者的 blog 文:http://blog.o0o.nu/2010/06/cve-2010-1622.html
这篇文档其实对漏洞的介绍,已经非常明确了,基本上翻译过来就可以明了事情的经过,这里按照自
己的语言,讲讲重要的东西。
这是 spring 的漏洞,而这个漏洞的最佳体现,是 spring mvc 框架。经典的应用,经典的代码,最终
却会造成漏洞,这是框架漏洞的经典体现。开发人员如果使用了 spring mvc 框架,必然会这样写代码,
官方也推荐表单绑定对象这种做法,这种做法,却由于框架的环境,导致了漏洞。
漏洞原理
Spring mvc 可以让开发者定义一个 java bean 对象,实现 getter 和 setter 方法,之后绑定到表单中,
以方便开发人员使用。
这段代码,是一个 java bean 对象,叫做 User.
public class User {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
可以把它绑定到一个 Controller
@Controller
public class TestController {
@RequestMapping("/test.htm")
public String execute(User user){
System.out.println(user.getName());
return "success";
}
}
用户就可以直接提交