JAVA代码审计 | 因酷网校在线教育系统

CMS简介:

   因酷开源网校系统是由北京因酷时代科技有限公司以下简称(因酷教育软件)研发并推出的国内首家Java版开源网校源代码建站系统,并免费提供给非商业用途用户使用,是用户体验最好、运营功能最全、性价比最高的在线教育软件。

核心框架—Spring Framework
视图框架—Spring MVC
持久层框架—MyBatis 3

测试环境:

  • JDK 1.8.8
  • Tomcat 7
  • Mysql 5.5
  • maven 3.5.3
  • IntelliJ IDEA 2018.01

系统安装:

下载地址:http://down.admin5.com/jsp/132874.html

1、首先导入源码,修改相关的配置信息,注意要和数据库的信息相对应

2、在pom.xml中把端口号改成8080,这个可根据自己的实际情况去修改,我这里端口设置的是8080,所以端口号改成8080

3、配置Tomcat

4、导入项目时会下载maven下的包,启动时会读取配置文件,所以刚刚导入项目和运行Tomcat时都会有一些慢

前置知识:

1、maven结构:

  • src/main/java:是java的代码目录
  • src/main/resources:是资源目录,放一些配置文件,如properties、spring-mvc.xml等
  • src/main/webapp:是传统项目的WebContent目录

2、Mybatis:

  • Mybatis是作为一款半自动化的持久层框架,因为sql语句都要我们自己手动编写还要注意安全问题,所以Mybatis在一定程度上帮我们避免了这些问题
  • 但是Mybatis不意味着一定的安全,它总共有两个参数#{id}${id}

#{id}:相当于JDBC中的PreparedStatement,预编译处理参数,可以有效的避免注入
${id}:是未经过预编译,仅仅取输出变量的值

3、Spring MVC工作流程:

1.用户发送http请求给前端控制器(DispatcherServlet),前端控制器(DispatcherServlet)接到http请求后查询HandlerMapping,然后选择合适的控制器(Controller)。

2.控制器(Controller)根据不同的业务逻辑调用不同的服务方法/业务对象来获取模型数据(Model),并返回ModelAndView(模型数据和逻辑视图名)给前端控制器(DispatcherServlet)。

3.前端控制器(DispatcherServlet)根据返回的逻辑视图名,在ViewResolver的帮助下,选择相应的视图(View)进行渲染。

4.当View确定后,前端控制器(DispatcherServlet)就把模型数据传给视图(View),以便渲染视图,响应用户的发出的请求。

4、Spring:

充当了管理容器的角色,用来管理Spring MVC和Mybatis工作的,充当程序中的桥梁或者说管理者

Spring的两大核心

控制反转(IoC)/依赖注入(DI)
面向切面编程(AOP)

  • 可以与第三方框架良好整合,降低框架的使用难度,提供对各种优秀框架的支持,如Struts、Hibernate等
  • 降低Java EE API的使用难度,可以通过Spring建议封装
  • 依赖注入特性将组件透明化,降低耦合度

源码审计:

这里只是抛砖引玉给大家讲一下java代码审计的流程,基于SSM框架的一个思路,如果大家有时间可以深入挖掘一下这套程序,一定会有比较多的收获

1、XSS

漏洞发生在搜索课程名称,我们定位到CourseController.java这里

@Autowired注解是自动连接属性传递的时,Spring会将这些传递过来的值或者引用自动分配给那些属性以便我们利用,这里我们可以调用CourseService接口里面的方法
跟进接口,可以看到定义接口的一些方法,我们可以找到查询课程相关的接口,其中第61行queryCourseList接口是根据不同条件查询课程列表

再根据查询相关的接口在定义接口的实现类里查询具体实现的方法,如49行,在CourseMapper中进行数据库查询,直接返回一个list集合


这里是CourseMapper中对应查询queryCourseList的sql语句

然后直接将内容返回到前台的页面上,其实${queryCourse.courseName}是一个EL表达式,代表queryCourse这个实体类下面courseName的值,就是我们查询课程的内容

2、越权漏洞

漏洞触发点UserController.java

我们跟进定义的接口,并进入接口的实现类来看看修改用户信息内容中是否有用户权限判断

第91行,接口实现类中并未做任何用户身份合法性的校验,对请求没进行权限控制

直接引用mapper文件更新信息

这里直接贴图,抓包修改对应的user.userId




3、SQL注入漏洞

AdminArticleController.java删除文章页面,从前台接收articelId参数

接口和接口实现类


关键点在这里,我们上面提过Mybatis用${}直接拼接,会产生注入

类似的注入点和其他漏洞还有很多,只要大家细心就会找到的。这里只是提出三个比较有代表性的漏洞举个例子,让大家对SSM框架的审计有一个思路。