本文作者:刘志(JAVA审计实战班1期学员)
作业要求:
1. 下载实战项目源码,搭建项目环境
2. 审计SQL注入漏洞,并将审计流程记录下来。
一、环境搭建
首先将下载的项目搭建起来,通过idea创建一个新项目,并选择我们下载好的cms:
此时会弹出提示窗,我们通过Maven创建项目,选择Maven project:
打开项目可能会发现源码文件加载不出来,这种情况只需要删除源码中的.idea文件夹即可:
删除.idea文件后,重新打开项目,即可加载出源文件,如下图:
2. 配置环境参数
项目加载成功后,我们还需要配置运行环境,使项目运作起来,首先JDK修改为1.8(或1.7)版本:
因为是Maven项目,修改Maven配置,选择我们自己的Maven工具地址:
接下来,还需要配置一下tomcat环境,选择local通过本地调试方式进行搭建:
选择tomcat版本,我本机安装的是8.5.31;注意:如果端口8080和本机其他服务冲突,这里可修改为其他端口运行:
最后添加运行环境,选择inxedu.war即可:
3. 修改数据库配置
运行环境配置完毕后,还需要连接本地数据库,找到project.properties文件,修改jdbc.host为本机(即数据库)ip地址,这里设置为环回口地址;然后将jdbc.username、password修改为数据库的用户名、口令即可。
注意:上图还需要将项目路径(contextpath)修改为tomcat中的url一致,即下图的url:
最后连接本地数据库,可以使用DBeaver或navicat:
连接成功后,导入cms文件包中的sql脚本:
执行后,创建成功我们需要的数据库:
4. 最后,返回idea,通过tomcat运行cms:
5. 项目运行成功,浏览器自动访问首页:
二、代码审计ssm架构
1. 框架判断
在代码审计之前,我们需要先判断一下该cms使用什么框架进行运作,首先查看web.xml文件,可以看到加载了spring核心配置文件applicationContext.xml:
applicationContext.xml配置如下:
同时,web.xml文件还加载了springmvc的配置文件spring-mvc.xml:
spring-mvc.xml配置如下:
查看spring核心配置文件applicationContext.xml,发现通过Spring整合mybatis配置:
找到Mybatis配置文件SqlMapConfig.xml:
因此可以该cms通过ssm框架搭建,即spring+spring mvc+mybatis。确定使用mybatis框架后,可知道mysql语句都写在Mapper.xml文件中,我们只需要一个一个去审计即可。
2. sql注入点一:ArticleMapper.xml
首先找到第一个mapper文件ArticleMapper.xml,找使用${}符引入变量的语句,因为使用${}符,不会对内容进行预编译等处理,可能存在注入,通过该思路可以找到下面这两个语句:
deleteArticleByIds,deleteArticleContentByArticleIds方法可能存在问题。
往上追溯这两个方法存在于接口ArticleDao中,传参为String类型,可能存在注入:
ArticleDao接口对应实现类ArticleDaoImpl:
继续追溯可发现ArticleServiceImpl类调用了这两个方法,且这里没做任何过滤;
全局搜索deleteArticleByIds,可以找到控制器AdminArticleController:
查看控制器信息,确定该接口url为/admin/article/delete,注入点参数为articelId:
全局搜/admin/article/delete,可以找到前端页面article-list.jsp:
路径为http://localhost:8080/inxedu_war/admin/article/article-list:
直接访问会跳到后台登陆界面,因该是做了session校验,我们需要先登陆,才能访问:
查看本地数据库,找到管理员口令:
通过cmd5进行密码破解,密码为111111:
这里我们通过管理员账户admin/111111进行登陆,登陆后跳转至后台首页:
访问http://localhost:8080/inxedu_war/admin/article/article-list,显示404,无法访问:
倒回去看控制器AdminArticleController,article-list被赋值给articleListPage:
可以看到/admin/article/showlist接口调用了articleListPage:
访问/admin/article/showlist,总算找到删除接口:
点击删除,抓包,可以看到是我们想要的接口,注入点为articelld:
输入单引号,顺利报错,此处存在sql注入:
报错页面如下图所示:
ArticleMapper.xml中原本的sql语句为:
由于没有回显,我们通过延时注入进行测试,响应包延迟返回,漏洞存在:
第一个楼的点验证完毕~
3. SQL注入点二:CourseFavoritesMapper.xml
4.再来看一个漏洞点,思路和上面一致,首先打开CourseFavoritesMapper.xml,查找$符,可以发现deleteCourseFavoritesById方法可能存在注入:
该方法存在于CourseFavoritesDaoImpl类中:
CourseFavoritesDaoImpl类在CourseFavoritesServiceImpl类中进行注入,并未发现对参数ids做过滤处理:
继续追溯会发现deleteCourseFavoritesById方法被以下两个控制器调用:
查看AppUserController控制器,找到deleteCourseFavoritesById方法:
以上过程同样未发现过滤,通过控制器确定路由为/webapp/deleteFaveorite,尝试访问:
传递参数id=1:
输入单引号,出现报错,因此可能存在注入:
5. CourseFavoritesMapper.xml文件中原sql语句为:
因此我们这里把圆括号进行闭合,通过时间盲注进行测试,响应包出现延时,漏洞存在:
漏洞二同样验证完毕。
三、总结
扫描下方二维码加入星球学习
加入后邀请你进入内部微信群,内部微信群永久有效!