Struts2 S2-037(CVE-2016-4438)漏洞分析

      Struts2 S2-037(CVE-2016-4438)漏洞分析无评论
Struts2 S2-037(CVE-2016-4438)漏洞分析
阅读: 68

昨天pkav发布了一个关于S2-037(CVE-2016-4438)的漏洞分析(好像是他们提交的?),和S2-033一样也是关于rest插件导致method变量被篡改造成的远程代码执行漏洞,而且不需要开启动态方法调用便可利用。之前因为手边琐碎的事情不断,而且感觉rest插件配置有点麻烦,就没有跟S2-033这个鸡肋。但是没想到居然还有后续,这次是想偷懒也没得躲了╮(╯▽╰)╭,下面就让我们来看看这个漏洞到底是个什么玩意儿~~

0x01 预备知识

关于这个漏洞需要知道一点Struts实现rest的知识,才能更好的理解PoC。这里我们简单介绍一下,主要是访问路径上各个部分的意义。

http://172.16.107.143:8080/Struts2_3_28/resttest/tang3.xml

上面的这条访问中,Struts2_3_28是项目路径,和一般的网站路径没有区别。resttest是Controller名,Controller相当于原生Struts的action,只不过在rest插件中不再需要使用配置文件指定uri和action映射了,可以直接通过uri来直接指定使用哪个Controller执行。比如:在项目中还有一个Tang3Controller类,那么访问中可以直接使用:

http://172.16.107.143:8080/Struts2_3_28/tang3/tang3.xml访问。

在Controller之后的内容就是要传递的参数,末尾的.xxx后缀是要求返回内容的格式,一般有json、xml等。

0x02 漏洞原理

这个漏洞和之前S2-032/033是一个地方,都是在DefaultActionInvocation.java的invokeAction方法中没有对于methodName参数内容进行校验,便直接丢到了getValue方法里面,从而造成Ongl表达式的注入。触发代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
protected String invokeAction(Object action, ActionConfig actionConfig) throws Exception {
    String methodName = proxy.getMethod();
 
    if (LOG.isDebugEnabled()) {
        LOG.debug(“Executing action method = #0”, methodName);
    }
 
    String timerKey = “invokeAction: “ + proxy.getActionName();
    try {
        UtilTimerStack.push(timerKey);
 
        Object methodResult;
        try {
            methodResult = ognlUtil.getValue(methodName + “()”, getStack().getContext(), action);
 

发表评论