因为学习java并不是很长时间,也没有做深入的研究。但是在学习之后,发现可以审计出一些简单的javaweb漏洞,所以想这这里和大家分享一下。
0x01审计之初
首先,我拿到了源码之后,大概看了一下这个系统的架构,发现是通过Struts写的。在具体看代码之前,我们先看一下这个会议系统有什么功能,在代码审计的时候,不能一股脑的先跑过去就看代码,我们要学会通过功能去找问题的缺陷。现在以**.**.**.**:8288/Conf/jsp/main/mainAction.do 这个站为测试案例。访问之后发现,只有列出了会议,登录,下载这些功能。其中会议进入需要密码,然后还有登录。但是无法注册用户,所以在这套系统中,我们应该去那种无需登录就可以利用的漏洞,如果要登录才能利用那就显得太鸡肋了。先通过常规的黑盒测试并没有发现漏洞(目前暴露出来的功能),下一步我们来审计源码。
0x02 源码审计
在审计javaweb的时候,我的第一步是去看web.xml这种配置文件,在这里里面配置了url的路由规则,severlet的配置,以及fitler的设置。其中fitler的作用就是某一后缀或者某一目录下的所以文件做一次拦截,一般就是用来验证那些需要登录的功能。
Conf/WEB-INF/web.xml
这里设置了fitler,我们定位到**.**.**.**mon.RequestFilter
这儿只是设置了一下页面编码为utf-8,然后继续下面操作,从这儿可以看出这个这个cms并没有通过fitler来做权限控制,这样就很有可能存在未授权的地方。
继续看web.xml里面的内容
可以看出定义了proxoolAdmin servlet/AxisServlet /services/* 这些url路由,并且包含了/WEB-INF/struts-config.xml配置文件,让在这些url路由中发现
暴露了一些webservices的接口
![java代码审计基础教程之V2会议系统多个漏洞集合/无需登录]()
数据库的一些信息
![java代码审计基础教程之V2会议系统多个漏洞集合/无需登录]()
先看暴露出的webservices接口存在什么问题
定位代码webapps/Conf/WEB-INF/classes/com/v2tech/cms/webservices/DeptWebService.class
其中有个参数为xml,然后通过不同的tradeCode,将xml参数传入其他地方,跟入addDepartment方法
其中xml进入了loadXml函数,这儿可能存在xml实体注入。来测试一下。我这儿使用的是AWVS的webservices工具
![java代码审计基础教程之V2会议系统多个漏洞集合/无需登录]()
直接注入实体发现报错了
![java代码审计基础教程之V2会议系统多个漏洞集合/无需登录]()
我们将特殊字符进行实体html编码一次,因为在xml中是可以解析html编码后的数据,这里利用gopher协议来获取数据。
先在vps上面新建一个ext.dtd内容如下
在vps上面监听你设置的端口
然后在请求包处构造
![java代码审计基础教程之V2会议系统多个漏洞集合/无需登录]()
成功获取数据
![java代码审计基础教程之V2会议系统多个漏洞集合/无需登录]()
其中可以发现这个getWebServiceResult方法在多个地方调用,在被调用的地方都存在xml实体注入
包括
![java代码审计基础教程之V2会议系统多个漏洞集合/无需登录]()
分析完xml实体注入之后,我们继续看代码,我们来看struts-config.xml中的配置(关于struts-config配置可以看http://**.**.**.**/panjun-Donet/articles/1181811.html),所以在这儿我们着重找scope为request,因为我们这样才好利用漏洞。通阅读代码发现这个cms是通过在每个class类中来判断用户是否登录,代码如下
如果没有登录的话,就通过findForward方法到sessioninvalid,也在struts-config.xml中定义的
![java代码审计基础教程之V2会议系统多个漏洞集合/无需登录]()
通过阅读代码发现几处没有存在以上代码的类,这也意味着可以无需登录来利用漏洞
webapps/Conf/WEB-INF/classes/com/v2tech/cms/base/common/struts/DownloadAction.class
通过request.getParameter("path")获取path然后
进行文件读取,然后下载。这是一个任意文件下载
/webapps/Conf/WEB-INF/classes/com/v2tech/cms/bulletin/struts/BulletinAction.class
在这个类中只有systemBulletin方法验证了是否登录,其他的方法都没验证。然后在这个类中又存在多个sql注入。由于这套系统默认是tomcat+mysql这样的架构,其中web路径是不变化的,而且使用mysql的root用户,所以直接可以通过sql注入来getshell。其中details方法,已经在http://**.**.**.**/bugs/wooyun-2010-0143276提交过了
下面我以modify方法为例
通过 request.getParameter获取sysId然后进入bulletinBiz.getSysBulletinTable
然后进入了sql之中。
返回正常
返回为空,确定为五个字段。然后就可以直接写shell了。
构造
成功生成**.**.**.**:8288/test.jsp?cmd=whoami
![java代码审计基础教程之V2会议系统多个漏洞集合/无需登录]()
webapps/Conf/WEB-INF/classes/com/v2tech/cms/user/struts/DeleteDeptAction.class
package com.v2tech.cms.user.struts;
可以删除任意部门,且无需登录
评论