struts2.3.32升级到2.5.30终极版

  1. 最近struts2出现漏洞,攻击者可以远程执行代码命令,上传木马文件至服务器,获取服务器控制权限等。
  2. 修补建议 官方已发布了安全补丁,建议将struts2升级到 2.5 或以上。

1.下载struts2.5.30依赖包

Index of /dist/struts/2.5.30

下载struts-2.5.30-min-lib.zip 这个文件

解压后文件如下:

删除log4j-api-2.12.4.jar文件中的META-INF\versions\9META-INF\versions\9\module-info.class文件,不删启动会报错。

解压后的jar文件拷贝到工程中的3rdLib/struts2目录中.

在WEB-INF/lib和3rdLib/struts2目录中删除旧的jar文件,jar文件如下:

 

 

2.下载log4j2.12.1

struts2.5.30需要apache-log4j-2.12.1版本。

下载地址:

http://archive.apache.org/dist/logging/log4j/2.12.1/apache-log4j-2.12.1-bin.zip

解压后的文件log4j-core-2.12.1.jar拷贝到3rdLib/struts2目录中.

所有替换完的jar包结构如下:

拷入配置文件:log4j2.component.properties

log4j2.component.properties文件考本到src\main\resources目录

文件内容如下:

log4j2.loggerContextFactory=org.apache.logging.log4j.core.impl.Log4jContextFactory

log4j.configurationFile=log4j2.xml

拷入配置文件:log4j2.xml

log4j2.xml文件考本到src\main\resources目录

文件内容如下:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/2002/xmlspec/dtd/2.10/xmlspec.dtd">

<!--日志级别以及优先级排序: OFF > FATAL > ERROR > WARN > INFO > DEBUG > TRACE > ALL -->

<!--Configuration后面的status,这个用于设置log4j2自身内部的信息输出,可以不设置,当设置成trace时,你会看到log4j2内部各种详细输出 -->

<!--monitorInterval:Log4j能够自动检测修改配置 文件和重新配置本身,设置间隔秒数 -->

<configuration status="TRACE" monitorInterval="300">

<!--先定义所有的appender -->

<appenders>

<!--这个输出控制台的配置 -->

<console name="Console" target="SYSTEM_OUT">

<!--输出日志的格式 -->

<PatternLayout

pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />

</console>

<!--文件会打印出所有信息,这个log每次运行程序会自动清空,由append属性决定,这个也挺有用的,适合临时测试用 -->

<File name="log" fileName="=D:/GENDMS_FILE/logs/test.log" append="false">

<PatternLayout

pattern="%d{HH:mm:ss.SSS} %-5level %class{36} %L %M - %msg%xEx%n" />

</File>

<!-- 这个会打印出所有的info及以下级别的信息,每次大小超过size,则这size大小的日志会自动存入按年份-月份建立的文件夹下面并进行压缩,作为存档 -->

<RollingFile name="RollingFileInfo"

fileName="D:/GENDMS_FILE/logs/info.log"

filePattern="D:/GENDMS_FILE/logs/$${date:yyyy-MM}/info-%d{yyyy-MM-dd}-%i.log">

<!--控制台只输出level及以上级别的信息(onMatch),其他的直接拒绝(onMismatch) -->

<ThresholdFilter level="info" onMatch="ACCEPT"

onMismatch="DENY" />

<PatternLayout

pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />

<Policies>

<TimeBasedTriggeringPolicy />

<SizeBasedTriggeringPolicy size="100 MB" />

</Policies>

</RollingFile>

<RollingFile name="RollingFileWarn"

fileName="D:/GENDMS_FILE/logs/warn.log"

filePattern="D:/GENDMS_FILE/logs/$${date:yyyy-MM}/warn-%d{yyyy-MM-dd}-%i.log">

<ThresholdFilter level="warn" onMatch="ACCEPT"

onMismatch="DENY" />

<PatternLayout

pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />

<Policies>

<TimeBasedTriggeringPolicy />

<SizeBasedTriggeringPolicy size="100 MB" />

</Policies>

<!-- DefaultRolloverStrategy属性如不设置,则默认为最多同一文件夹下7个文件,这里设置了20 -->

<DefaultRolloverStrategy max="20" />

</RollingFile>

<RollingFile name="RollingFileError"

fileName="D:/GENDMS_FILE/logs/error.log"

filePattern="D:/GENDMS_FILE/logs/$${date:yyyy-MM}/error-%d{yyyy-MM-dd}-%i.log">

<ThresholdFilter level="error" onMatch="ACCEPT"

onMismatch="DENY" />

<PatternLayout

pattern="[%d{HH:mm:ss:SSS}] [%p] - %l - %m%n" />

<Policies>

<TimeBasedTriggeringPolicy />

<SizeBasedTriggeringPolicy size="100 MB" />

</Policies>

</RollingFile>

</appenders>

<!--然后定义logger,只有定义了logger并引入的appender,appender才会生效 -->

<loggers>

<!--过滤掉spring和mybatis的一些无用的DEBUG信息 -->

<logger name="org.springframework" level="INFO"></logger>

<logger name="org.mybatis" level="INFO"></logger>

<root level="all">

<appender-ref ref="Console" />

<appender-ref ref="RollingFileInfo" />

<!--appender-ref ref="RollingFileWarn" /-->

<appender-ref ref="RollingFileError" />

</root>

</loggers>

</configuration>

日志结构如下:

3.修改struts.xml文件

头部改为:

<!DOCTYPE struts PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 2.5//EN" "http://struts.apache.org/dtds/struts-2.5.dtd">

增加DynamicMethodInvocation配置

<constant name="struts.enable.DynamicMethodInvocation" value="true"/>

修改后如下:

4.修改web.xml文件

  <filter>

        <filter-name>struts2</filter-name>

        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>

    </filter>

修改为

<filter>

     <filter-name>struts2</filter-name>

     <filter-class>org.apache.struts2.dispatcher.filter.StrutsPrepareAndExecuteFilter</filter-class>

  </filter>

去掉ng

 

 

处理启动报错

jar包冲突

 

删除jaxb下的 xercesImpl-2.6.2.jar 解决启动报错

jar包类找不到,把原本来的class字节码复制到新版本

 

解决方案把原来2.3版本的class字节码添加到2.5版本下,如下

 

两个字节码放到 org/apache/struts2/dispatcher

ServletDispatcherResult.class

StrutsResultSupport.class

启动日志报错

原来日志如下: 

 

 日志文件修改如下:

 

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值