- 最近struts2出现漏洞,攻击者可以远程执行代码命令,上传木马文件至服务器,获取服务器控制权限等。
- 修补建议 官方已发布了安全补丁,建议将struts2升级到 2.5 或以上。
1.下载struts2.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
启动日志报错
原来日志如下:
日志文件修改如下: