摘要

Apache官方的struts2产品,最近出了一个远程代码执行漏洞,编号“S2-013”,目前是0DAY,官方没有修补方案出现。

http://struts.apache.org/development/2.x/docs/security-bulletins.html — (公告)

官方安全公告给出了编号和简要介绍

“A vulnerability, present in the includeParams attribute of the URL and Anchor Tag, allows remote command execution”

但是并没有说原理,也没有发布任何补丁。

分析

事实上,这次struts2官方一共发了两个漏洞,还有个叫s2-012,但是这个漏洞,看题目,应该是我之前在《Xcon2012 攻击JAVA WEB》时的已经爆出来了,所以本文只说另一个。

struts2官方的开发傻乎乎的,比如这个漏洞,要么官方就不要发出来,既然发出来了,就应该发补丁,但是官方仅仅发了这段话,对于详细内容,普通用户不开放访问。

Struts2再爆远程代码执行漏洞

从这段话可以大致总结一下几点:

1、未修补的远程代码执行漏洞。

2、includeParams参数在URLTAG中出现了问题。

仅根据这两点,熟悉struts2运行机制和之前漏洞原理的人,都可以轻易分析出具体利用POC。

漏洞触发:

由于官方没有发补丁,所以最新版本的struts2还是有漏洞的,可以下载最新:Apache Struts 2.3.14 GA的示例应用。

经过简单测试,就看到了想要的结果。

根据官方给的信息,问题出在a标签,所以写个jsp页面,内容如下:

<s:a includeParams="all">Click here.</s:a>

这个是struts2标签库的a标签,该标签会在页面上显示当前URL,当includeParams=all时,就会显示具体参数内容。

唯一需要解的迷,就是如何让参数内容作为OGNL表示试执行,但是这个迷未免太好猜了,我随手测试就出结果。

访问url:

http://localhost:8080/blank/error.jsp?aaa=${struts2的常用POC,你懂得}

就可以直接弹计算器,POC代码大家都有的,我只截个图:

Struts2再爆远程代码执行漏洞

几乎没有什么分析过程,就拿到了POC,最终为了研究修补方案,只好被迫研究了漏洞原理。

漏洞原理:

Struts2标签库中的url标签和a标签的includeParams这个属性,代表显示请求访问参数的含义,一旦它的值被赋予ALL或者GET或者POST,就会显示具体请求参数内容。按照正常的需求,把参数urlEncode一下也就够了, 问题在于,struts竟然多做了一步,这丫把参数做了OGNL解析!

代码:

     package org.apache.struts2.views.uti.DefaultUrlHelper这个class的parseQueryString方法。
           public Map<String, Object> parseQueryString(String queryString, boolean forceValueArray) {
        Map<String, Object> queryParams = new LinkedHashMap<String, Object>();
        if (queryString != null) {
            ......
                    if (paramName != null) {
                        paramName = translateAndDecode(paramName);
                        String translatedParamValue = translateAndDecode(paramValue);
              ......
       translateAndDecode会调用
           private String translateVariable(String input) {
        ValueStack valueStack = ServletActionContext.getContext().getValueStack();
        return TextParseUtil.translateVariables(input, valueStack);
           }

最终TextParseUtil.translateVariables会直接调用OGNL解析执行。

漏洞修补:

等官方吧,我反正不急的。或者有好人转发时,请顺便写上方案。

source

一些吐槽:

生生不息 2013-05-22 1楼

前排兜售瓜子矿泉水

求具体利用方法。 2013-05-22 2楼

求具体利用方法。

小布什 2013-05-22 3楼

又要开始不太平了。

angellover08 (1级) 某甲方漏洞挖掘研究员 2013-05-22 4楼

研究下

瀚海元实验室 2013-05-22

@angellover08 兄台你的签名真装b啊

angellover08 (1级) 某甲方漏洞挖掘研究员 2013-05-22

@瀚海元实验室

Drizzle.Risk 2013-05-22 5楼

围观围观….

呵呵 2013-05-22 6楼

鸡肋,呵呵

路人A (1级) 2013-05-22 7楼

老实说利用条件很呵克,需要条件太多了

但丁 2013-05-22 8楼

鸡肋的一逼

没什么用 那样写代码的人太少了

Mystery。 (3级) 久游网Web开发工程师 2013-05-22 9楼

据说上一次 Struts2漏洞的时候,一群小黑客搞了很多网页游戏公司,据说还赚了不少一笔钱。

WDLTH 2013-05-22 10楼

没见过<s:a 这样写的,估计有点鸡肋。

x-Ai (1级) 2013-05-22 11楼

标签,还是比较鸡肋的。

phper 2013-05-22 12楼

有个问题,去年的struts很容易通过特征字符找到相应的漏洞站点,该漏洞如何通过搜索引擎去找捏?

x-Ai (1级) 2013-05-22

@phper 测试结果来看。几乎没有用这个标签的。

黑客 2013-05-23

@x-Ai 也是测试了几十个,没有一个用的。

呵呵 2013-05-23

@phper 基本不会有用这个标签的,所以structs官方才会没出补丁就公布细节

Black-World (1级) 2013-05-23 13楼

实战中很痛苦的寻找 ….

youxigx 2013-05-23 14楼

k8的朋友写了个利用程序:http://qqhack8.blog.163.com/blog/static/114147985201342211837366/

触发条件

1 s2 架构

2 使用了s2的 a标签

3 includeParams=all

留言评论(旧系统):

索尘 @ 2013-05-23 13:51:37

a标签到底有多少人在用?

本站回复:

不清楚……