struts2漏洞测试
2013年7月,漏洞Struts2的测试S2-016漏洞被公开时,我还在上一家公司做渗透测试。漏洞那天下午三点多,测试同事扔过来一个URL,漏洞说“你试试这个”,测试我打开一看,漏洞参数里带了个 Struts2的测试漏洞测试,核心就一句话:看它怎么处理OGNL表达式。漏洞OGNL是测试Object-Graph Navigation Language,Struts2用它来绑定参数、漏洞做类型转换。问题出在,很多版本里用户输入的参数名会被直接扔进OGNL解析器执行。你传个 测试的第一步不是上扫描器。我习惯先手工发几个包。构造一个 真正有意思的是S2-045和S2-046。这两个漏洞出在Content-Type头里。你发一个multipart请求,把Content-Type改成 拿到执行权限之后,别急着上冰蝎或者哥斯拉。先 写shell的时候有个坑。Struts2的OGNL沙箱在有些版本里禁用了 测试完记得清理。你写进去的 最后说个真实案例。去年帮一个朋友看他的站,Struts2版本是2.3.15.1,我传了个redirect:前缀,测试服务器直接把http://www.baidu.com的漏洞内容返回了。那一刻我就知道,测试这玩意儿要出大事。漏洞%{ 1+1},它算出来2,那就能干更多事了。?name=%25%7B233*233%7D,如果返回页面里出现54289,说明表达式被执行了。这时候别急着高兴,有些WAF会拦截%{ 这种特征,换成%24%7B或者%23%7B试试。我见过一个站,直接传%{ }被拦,但传%25%7B%7D就过了,因为WAF只解码了一次。%{ #context['com.opensymphony.xwork2.dispatcher.HttpServletResponse'].addHeader('X-Test','1')}.multipart/form-data,如果响应头里出现X-Test: 1,服务器就中招了。这个测试方法比传参数隐蔽得多,很多日志系统只记URL和body,不记Content-Type的异常值。whoami和id看看权限。如果是root,那基本就结束了。如果是www-data,还得想办法提权。我遇到过一台机器,Struts2漏洞能执行命令,但/bin/bash被限制,只能跑/bin/sh。这时候用bash -c或者sh -c绕一下就行。java.lang.Runtime,但可以用java.lang.ProcessBuilder代替。具体payload网上有一堆,但别直接复制。我习惯自己改一下,比如把getRuntime拆成getRunti+me拼接,或者用反射调invoke。这样能绕过一些基于关键词的WAF。.jsp文件、改过的web.xml、甚至只是访问日志里多出来的几条记录,都可能被管理员发现。我一般会删掉上传的shell,然后把access.log里对应的行用sed删掉。别嫌麻烦,有一次我忘了删,第二天客户就打电话来说“服务器上多了个奇怪的文件”。%{ @java.lang.Runtime@getRuntime().exec('id')},返回了uid=0(root)。他当时就懵了,说“我这站刚上线三天”。我问他用的什么框架,他说“随便找了个教程搭的”。所以啊,Struts2漏洞测试这件事,本质上不是技术多难,而是太多人根本不知道自己在用什么。
-
上一篇
-
下一篇
- 最近发表
- 随机阅读
- 搜索
-
- 友情链接
-