今天这篇文章来自蜗牛学院信息安全讲师清溪山人(笔名),他将分享自己是如何在2小时内,一步步渗透蜗牛学院Boss系统,并获得员工权限的过程。
未来不久,蜗牛学院也将正式开设关于信息安全的技术课程,大家敬请期待吧!
· 正 · 文 · 来 · 啦 ·
对于渗透进WoniuBoss系统拿到其它人权限这一想法的开始仅仅是因为一个赌约,为了赌赢一顿饭。同时也想试试从别人的权限里能看到什么?如何渗透?
刚开始的想法是利用SQL注入进行渗透。SQL注入的前提条件是参数用户可控和参数拼接,所以我先检查了几乎所有连接,想要寻找参数可控的位置。但在检查过程中发现WoniuBoss系统的URL都被重写了,并没有在URL尾部追加参数的习惯。
但这没有太大关系,我利用BurpSuite抓取请求参数,又得到了如下信息:
接着,尝试着在参数后追加SQL注入测试语句,如:or 1=1-- 和 or 1=2 --,测试查询是否能成功,以此方法来寻找SQL的注入点。
测试到的几个点都不能进行SQL注入,当然,这也在我的预想范围内。
系统使用Java语言开发,在SQL过程中使用了PreparedStatement模块化参数,而并非使用的Statement拼接参数,所以能找到的注入点相对来说会少很多。但这并不代表没有注入点,只是要想测试整个系统所有传参数的位置,会是一个不小的工作量。
于是,尝试着换一种思路,想着能不能通过XSS(Cross Site Scripting)记录其它用户操作时的Cookie?
XSS全称跨域脚本攻击,通过浏览器对JS解析的漏洞嵌入恶意JS代码。XSS分为存储型、反射型和DOM型。XSS存储型是利用系统对接收到字符串检查过滤不严格,攻击者通过文本框等形式将恶意JS代码上传至服务器做持久保存,当其它用户访问该信息时执行恶意JS代码。
那么这段JS代码能干什么呢?
可以盗取其它用户的COOKIE信息,比如利用document.cookie读取cookie并发送到指定的站点;
可以用来传播蠕虫,比如分析当前访问的网站结构,读取网站好友列表,主动给用户的每一位站内好友发送一个当前网址的信息等操作。
XSS存储型也是威胁最持久的一种方式。
本次渗透测试的过程首选存储型XSS尝试,找到几个文本输入的地方,尝试使用<script>alert(“test”)</script>检查是否存在注入点。系统中本来也没有几个可以输入的文本框,所以这个测试过程依然以失败告终。
山穷水尽疑无路,柳暗花明又一村,在XSS检测时无意中找到了一个上传点,于是尝试着去检查是否存在上传漏洞,并上传html后缀文件,没想到居然上传成功了。
在此访问该条信息,复制图片URL得到如下信息:
http://www.xxxx.com/...../....../XA/...../WNXA201905022_689.html?t=0.21355057979831504。
访问该页面,于是浏览器中出现了想要的结果:
非常不错的结果,但对于上传来说,有的系统开发人员在上传时允许上传所有的后缀,但是在上传完成后会对上传文件进行检测,发现其中的恶意代码进行处理。
于是第二步试着上传了一个带有JS的HTML到服务器,验证当前系统是否会处理恶意代码,一段非常简单的HTML,仅仅只是为了读取Cookie信息
<html>
<head>
<script>
var c = document.cookie;
alert(c);
</script>
</head>
</html>
上传成功,访问页面得到如下信息:
又是一个非常完美的结果,Cookie信息被打印出来了。
接下来就是获取不同员工的Cookie信息并发送到我指定的地方,然后冒充身份进行操作即可。
但想一想这样做并不太好:
首先这段JS代码并不在任何一个系统页面下,它是通过上传的形式放上去的,虽然URL在主站下具有一定的欺骗性,但也得唆使其它员工去点击;
其次,获取到的Cookie需要这些Cookie是在认证状态,如果发来的Cookie没有得到及时处理很有可能出现过期的Cookie。
于是再换一种思路,既然能上传,那么以JSP做为WEBSHELL上传到服务器执行后门程序不是更好,至于JSP能干嘛?相信学过Java的人都应该清楚,这里不再说它的危害性了。
首先尝试的是直接上传JSP文件,结果非常不理想。
JSP不能上传,HTML能上传,所以大胆猜测当前系统对上传的限制应该使用的黑名单而并非是白名单,于是又随便上传了几个文件,发现大量后缀都能上传甚至一些自定义的后缀,那么这个想法得到了证实。
接着随手输入一个资源地址,让服务器报错,取得Web容器信息,期望从Web容器中得到绕过系统验证的部分。得到如下信息:
Apache Tomcat 8.0.47做为Web容器,于是下载这个版本容器,分析容器的一些配置,查找容器漏洞,这里只找了容器接收的请求后缀有哪些:
<servlet>
<servlet-name>jsp</servlet-name>
<servlet-class>org.apache.jasper.servlet.JspServlet</servlet-class>
<init-param>
<param-name>fork</param-name>
<param-value>false</param-value>
</init-param>
<init-param>
<param-name>xpoweredBy</param-name>
<param-value>false</param-value>
</init-param>
<load-on-startup>3</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>jsp</servlet-name>
<url-pattern>*.jsp</url-pattern>
<url-pattern>*.jspx</url-pattern>
</servlet-mapping>
发现以jsp和jspx后缀都可以请求到org.apache.jasper.servlet.JspServlet,于是尝试使用jspx为后缀进行上传,结果依然是上传失败,考虑到部分服务器会将0x00做为字符串结束符的可能,于是上传时重新抓包并修改上传文件名,如下:
原始请求参数:
修改后的文件名:
Forward提交后发现,生成的文件名是WNXA201905026_662.jpg。于是大胆猜测两个可能:
首先,这个系统在做文件过滤时使用了类似于lastIndexof的方法寻找最后一个.的位置,并将它裁剪成两部分,前部分为文件名,后部分为文件后缀,文件后缀使用黑名单过滤。
其次,文件名被更名成"sl_stuno"参数+下划线+"leave_stuid"的形式替换原始的文件名。
接下来小心求证,多次进行不同的上传,发现规律果然如此。至此,上传的文件在服务器上能被准确定位了。
接下来还是绕过文件后缀验证。已经得到上面的证实,类似截断这种手段已经不可用了,那么也只能在jsp这个文件后缀上做文章了。
猜想有没有什么字符JAVA识别而系统或者服务器不识别的?例如“js p”能被系统识别为“jsp”而JAVA识别依然是“js p”。
根据这个想法,首先尝试使用了“js p”空格的方法和“jsp?id=1”带URL符号的方法,结果发现系统原封不动的保存了文件后缀,而带URL符号的办法系统直接将文件保存为xxxxx_xxx.jsp?id=1。
而在访问时,服务器则会把?号前后分开,并不认为有这么一个jsp的存在。其后又使用大写,大小写混输的方法,以及在文件后缀结尾处加上“\r”或提“\n”那么结果可以想到“jsp\r”“jsp\n”被解释成“jsp”系统直接拒绝了请求。
经过多次测试以后,终于找到了一处漏洞通过上传抓包,将文件后缀改成“js\tp”,通过“\t”这个表示tab的操作,成功绕过文件后缀验证,至此JSP上传至服务器,那么接下来能做什么也就不用再多说了。
对于这次文件上传渗透使其成为可能的原因有两点:
其一是文件后缀过滤时没有使用白名单放行而是使用黑名单过滤;
其二是对关键符号过滤不严格,如果系统以白名单放行或者严格过滤文件后缀甚至检查恶意代码,那么这次利用文件上传的渗透可能将会变得非常小甚至无法做到。
至此,我完成了对WONIUBOSS系统的渗透,同时也也有了一点小感悟:
数字化信息时代带给你我无限优质的体验度,但同时也让我们的隐私无所遁形。医学疾病信息,银行信息,个人资料信息等都有可能正在被有心人获取。正如此次实验一样,当有心人获取到这一漏洞,甚至可以通过WEBSHELL开启后门程序,让整个系统中所有数字信息无处遁形。这对公司来看是一个巨大的经济损失,同时对客户个人来讲也是一大伤害,因为你的信息有可能被出卖。如何更好的保护自己的隐私必然成为了数字化信息时代更为关键的课题。
之后,我也将分享更多关于信息安全类的技术文章给各位。
在WoniuBoss系统被信息安全讲师清溪山人渗透后,蜗牛学院研发部的小哥哥们已第一时间进行了“抢修”,目前系统安全已做了加强处理。
此文案例仅供授权实验。