本文由红日水清 编写,如有不当,还望斧正。
0x00 CMS简介:
因酷
核心框架—Spring Framework
视图框架—Spring MVC
持久层框架—MyBatis 3
0x01
JDK 1.8.8
Tom
My
IntelliJ
0x02: 系统
1、首先导入
2、在
3、配置Tomcat
4、导入项目时会下载maven下的包,启动时会读取配置文件,所以刚刚导入项目和运行Tomcat时都会有一些慢
0x03: 前置知识:
1、maven结构:
2、Mybatis:
Mybatis 是作为一款半
但是Mybatis不意味着一定的安全,它总共有两个{ 和 ${id}
#{id} :相当于
${id} :是未经过预编译,仅仅取输出变量的值
3、Spring MVC工作流程:
1.用户发送http请求给前端控制器(DispatcherServlet),前端控制器(DispatcherServlet)接到http请求后查询HandlerMapping,然后选择合适的控制器(Controller)。
2.控制器(Controller)根据不同的业务逻辑调用不同的服务方法/业务对象来获取
3.前端控制器(DispatcherServlet)根据返回的逻辑视图名,在ViewResolver的帮助下,选择相应的视图(View)进行渲染。
4.当View确定后,前端控制器(DispatcherServlet)就把模型数据传给视图(View),以便渲染视图,响应用户的发出的请求。
4、Spring:
充当了
Spring的两大核心
控制反转(IoC)/依赖注入(DI)
面向切面编程(
可以与第三方框架良好整合,降低框架的使用难度,提供对各种优秀框架的支持,如Struts、Hibernate等
降低Java EE
依赖注入特性将组件透明化,降低耦合度
0x04: 源码审计:
这里只是抛砖引玉给大家讲一下java
1、XSS
CourseController.java 这里
@Autowired注解 是自动连接属性传递的时,Spring会将这些传递过来的值或者引用自动分配给那些属性以便我们利用,这里我们可以调用
跟进接口,可以看到定义接口的一些方法,我们可以找到查询课程相关的接口,其中第61行 queryCourseList接口 是根据不同条件查询课程列表
再根据查询相关的接口在定义接口的实现类里查询具体实现的方法,如49行,在 CourseMapper 中进行数据库查询,直接返回一个
这里是 CourseMapper 中对应查询queryCourseList的sql语句
然后直接将内容返回到前台的页面上,其实 ${queryCourse.courseName} 是一个EL表达式,代表queryCourse这个实体类下面courseName的值,就是我们查询课程的内容
2、越权漏洞
漏洞触发点 UserController.java
我们跟进定义的接口,并进入接口的实现类来看看修改用户信息内容中是否有用户权限判断
第91行,接口实现类中并未做任何用户身份合法性的校验,对请求没进行
直接引用
这里直接贴图,抓包修改对应的user.userId
3、SQL注入漏洞
AdminArticleController.java
接口和接口实现类
关键点在这里,我们上面提过Mybatis用${}直接拼接,会产生注入
类似的注入点和其他漏洞还有很多,只要大家细心就会找到的。这里只是提出三个比较有代表性的漏洞举个例子,让大家对SSM框架的审计有一个思路。