【JavaWeb系统代码审计实战】某RBAC管理系统(一)SpringBoot介

优采云 发布时间: 2022-06-20 15:23

  【JavaWeb系统代码审计实战】某RBAC管理系统(一)SpringBoot介

  前言

  本系列为【炼石计划@Java代码审计】知识星球实战50套开源系统删减版,也就是每一套分享部分内容给大家学习。如果觉得写得还不错,并且想要从实践中学习JavaWeb代码审计的朋友,欢迎了解加入【炼石计划@Java代码审计】知识星球,与500位志同道合的朋友共同学习成长。

  文末获取配套练习环境。

  进入正题

  一、前置知识A、涉及相关技术简介A1、Maven简介

  Maven 是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),反映在配置中,就是一个 pom.xml 文件。是一组标准集合,一个项目的生命周期、一个依赖管理系统,另外还包括定义在项目生命周期阶段的插件(plugin)以及目标(goal)。

  当我们使用 Maven 的使用,通过一个自定义的项目对象模型,pom.xml 来详细描述我们自己的项目。

  简单来说,我们开发一个JavaWeb项目是需要加载很多依赖的,使用Maven可以便于管理这些依赖。

  POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml。该文件用于管理:源代码、配置文件、开发者的信息和角色、问题追踪系统、组织信息、项目授权、项目的url、项目的依赖关系等等。Maven项目中必须包含pom.xml文件。

  需要导入的依赖应该在pom.xml中进行配置与填写。比如导入某些依赖,如下图所示:

  

  project- project 是 pom.xml 中描述符的根。

  modelVersion - modelVersion 指定 pom.xml 符合哪个版本的描述符。maven 2 和 3 只能为 4.0.0。

  parent - maven 支持继承功能。子 POM 可以使用 parent 指定父 POM ,然后继承其配置。

  dependencies - 在dependencise中进行依赖配置

  groupId - 团体、组织的标识符。团体标识的约定是,它以创建这个项目的组织名称的逆向域名(reverse domain name)开头。一般对应着 java 的包结构。

  artifactId - 单独项目的唯一标识符。比如我们的 tomcat、commons 等。不要在 artifactId 中包含点号(.)。

  version - 版本信息。

  1、打开IDEA,点击Create New Porject,选择Maven,如下图所示:

  

  2、默认即可(在真实需求中,可以根据自己的项目,选择不同模板),点击Next,然后点击Finish。一个最基本的Maven项目结构如下图所示:

  配置源加速,自行百度就可以了。

  A2、SpringBoot简介

  SpringBoot是一款基于JAVA的开源框架。目的是为了简化Spring应用搭建和开发流程。是目前比较流行,大中小型企业常用的框架。正因为极大简化了开发流程,才收到绝大开发人员的喜爱。SpringBoot核心原理是自动装配(自动配置),在这之前,开发一个JavaWeb,Spring等项目要进行很多配置,使用了SpringBoot就不用在过多考虑这些方面。并且在SpringBoot中还内置了Tomcat。

  通过经典HelloWorld程序,来看看Springboot项目搭建多么简便。

  1、打开IDEA,选择Create New Project,选择Spring Initializer,右侧勾选Default,如下图所示:

  2、点击Next,Srping Initializr Project Settings配置内容默认就好,我们不做实际项目开发,如下图所示:

  

  3、点击Next,进入依赖项选择页面,我们选择Web -> Spring Web这一个即可,如下图所示:

  

  4、点击Next,填写项目名称和存放地址。练习项目,默认就可以,点击Finish,完成创建。

  5、Maven自动加载完所需依赖后,整体项目结构如下图所示:

  

  @SpringBootApplication注解表示这个类为SpringBoot的主配置类,SpringBoot项目应运行这个类下面的main方法来启动SpringBoot应用。

  6、创建HelloController,创建一个controller包,下面创建一个HelloController,在该controller中编写代码,如下图所示:

  

  7、点击右上方运行,打开浏览器输入:8080/hello,即可看到helloworld,如下图所示:

  

  @Controller注解:标注该类为controller类,可以处理http请求。@Controller一般要配合模版来使用。现在项目大多是前后端分离,后端处理请求,然后返回JSON格式数据即可,这样也就不需要模板了。

  @ResponseBody注解:将该注解写在类的外面,表示这个类所有方法的返回的数据直接给浏览器。@RestController 相当于 @ResponseBody 加上 @Controller

  @RequestMapping注解:配置URL映射,可以作用于某个Controller类上,也可以作用于某Controller类下的具体方法中,说白了就是URL中请求路径会直接映射到具体方法中执行代码逻辑。

  @PathVariable注解:接受请求URL路径中占位符的值,示例代码如下图所示:

  @Controller<br />@ResponseBody<br />@RequestMapping("/hello")<br />public class HelloController {<br />   @RequestMapping("/whoami/{name}/{sex}")<br />   public String hello(@PathVariable("name") String name, @PathVariable("sex") String sex){<br />       return "Hello" + name + sex;<br />   }<br />}

  @RequestParam注解:将请求参数绑定到你控制器的方法参数上(是springmvc中接收普通参数的注解),常用于POST请求处理表单。

  A3、SpringSecurity简介

  Spring 是一个非常流行和成功的java应用开发框架。Spring Security 基于Spring 框架,提供了一套web应用安全性的完整解决方案。

  一般来说,Web 应用的安全性包括两部分:

  用户认证(Authentication)

  用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。

  用户授权(Authorization)

  用户授权指的是验证某个用户是否有权限执行某个操作。在一个系统中,不同用户所具有的权限是不同的。比如对一个文件来说,有的用户只能进行读取,而有的用户可以进行修改。

  一般来说,系统会为不同的用户分配不同的角色,而每个角色则对应一系列的权限。

  对于上面提到的两种应用情景,Spring Security 框架都有很好的支持。

  在用户认证方面,Spring Security 框架支持主流的认证方式,包括 HTTP 基本认证、HTTP 表单验证、HTTP 摘要认证、OpenID 和 LDAP 等。

  在用户授权方面,Spring Security 提供了基于角色的访问控制和访问控制列表(Access Control List,ACL),可以对应用中的领域对象进行细粒度的控制。

  A4、Mybatis简介

  MyBatis 是一款优秀的持久层框架,它支持自定义 SQL、存储过程以及高级映射。MyBatis免除了几乎所有的 JDBC 代码以及设置参数和获取结果集的工作。

  MyBatis可以通过简单的 XML 或注解来配置和映射原始类型、接口和 Java POJO(Plain Old Java Objects,普通老式 Java 对象)为数据库中的记录。

  它内部封装了jdbc,使开发者只需要关注sql语句本身,而不需要花费精力去处理加载驱动、创建连接、创建statement等繁杂的过程。

  官网:

  https://mybatis.org/mybatis-3/zh/index.html

  配置文件常存放在src/main/resources/mapper中,配置文件命名为xxxxMapper.xml

  Mybatis拼接sql有下面两种方式:

  #{}告诉 MyBatis 创建一个预编译语句(PreparedStatement)参数,在 JDBC 中,这样的一个参数在 SQL 中会由一个“?”来标识,并被传递到一个新的预处理语句中。

  ${} 仅仅是纯粹的 string 替换,在动态 SQL 解析阶段将会进行变量替换,类似于直接替换字符串,会导致SQL注入产生。like+#{ }

  A5、Swagger简介

  Swagger 是一款RESTful接口的文档在线自动生成加功能测试的软件。目的是为了减少与其他团队的沟通成本,因此会使用Swagger构建RESTful API文档来描述所有的接口信息。

  

  官方网站:

  https://swagger.io/

  常见Swagger敏感信息泄露的路径:

  /swagger/<br />/api/swagger/<br />/swagger/ui/<br />/api/swagger/ui/<br />/swagger-ui.html/<br />/api/swagger-ui.html/<br />/user/swagger-ui.html/<br />/swagger/ui/<br />/api/swagger/ui/<br />/libs/swaggerui/<br />/api/swaggerui/<br />/swagger-resources/configuration/ui/<br />/swagger-resources/configuration/security/<br />......

  Swagger组件特征固定title:Swagger UI

  A6、Thymeleaf简介

  官方学习文档:

  https://www.thymeleaf.org/<br />https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html

  Thymeleaf是一个流行的模板引擎,该模板引擎采用Java语言开发。模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的html文档。从字面上理解模板引擎,最重要的就是模板二字,这个意思就是做好一个模板后套入对应位置的数据,最终以html的格式展示出来,这就是模板引擎的作用。

  例子:

  <br /> <br />   <br />     Name<br />     Price<br />   <br /> <br /> <br />   <br />     Oranges<br />     0.99<br />   <br /> <br />

  拓展学习,大致了解每个标签作用:

  https://www.w3xue.com/exp/article/20199/54847.html

  A7、SpringBoot Actuator简介

  Actuator主要用于公开有关正在运行的应用程序的运行信息 - 运行状况,指标,信息,转储,env等等。它使用HTTP端点或JMX bean来使我们能够与它进行交互。

  一些常见的执行端点:

  /beans:此端点返回应用程序中配置的所有bean的列表。<br />/env:提供有关Spring Environment属性的信息。<br />/health:显示应用程序运行状况<br />/info:显示应用程序信息,我们可以在Spring环境属性中配置它。<br />/mappings:显示所有 @RequestMapping 路径的列表 。<br />/shutdown:允许我们正常关闭应用程序。<br />/threaddump:提供应用程序的线程转储。<br /><br />完整可执行的端点,详见官网:<br />https://docs.spring.io/spring-boot/docs/current/reference/html/actuator.html#actuator.endpoints

  A8、Druid简介

  Druid是阿里研发的一款数据库连接池,其开发语言为java,druid集合了c3p0、dbcp、proxool等连接池的优点,还加入了日志监控、session监控等数据监控功能,使用Druid能有效的监控DB池连接和SQL的执行情况。

  项目地址:

  https://github.com/alibaba/druid

  B、相关漏洞

  上述常见的组件存在已知的漏洞,具体对应如下(不完全统计):

  漏洞名称

  Spring Security验证绕过漏洞

  Spring Security认证绕过

  Spring Boot框架SPEL表达式注入漏洞

  Spring Security未经授权的访问

  Spring Boot Actuator命令执行漏洞

  Spring Boot Actuator hikari配置不当导致的远程命令执行漏洞

  Spring Boot Actuator jolokia 配置不当导致的XXE漏洞

  Spring Boot Thymeleaf 模板注入

  Spring Boot Tomcat导致的JNDI注入

  Spring Boot eureka xstream deserialization rce

  Spring Boot h2 database query rce

  Spring Boot mysql jdbc deserialization rce

  Spring Boot sql

  Spring Boot whitelabel error page SpEL rce

  Spring Boot 修改环境属性导致的rce

  Spring Boot 提取内存密码

  Spring Boot 获取被星号脱敏的密码的明文 (方法一)

  Spring Boot 路由地址及接口调用详情泄漏

  Spring Boot 配置不当而暴露的路由

  Druid未授权访问

  二、项目安装A、所需环境

  本项目安装基于windows 10操作系统搭建而成。

  1、Java环境部署

  Java版本如下图所示:

  

  JDK下载链接:

  https://www.oracle.com/java/technologies/downloads/#java8-windows

  安装步骤操作简单,只需下一步即可,不过多赘述。

  2、Maven环境部署

  关于Maven环境部署与安装,可参考下面的文章,安装最新版即可。

  https://www.runoob.com/maven/maven-setup.html

  在IDEA中内置了Maven,对于我们来说足够用了。

  Maven加速配置

  配置国内源下载一些依赖组件会非常快,但会有极个别情况,有些组件使用国内源无法下载,则需要再更改配置,大家留有印象就好。

  ①、访问c:\Users\当前用户\.m2目录,当前用户文件夹需要根据当前用户来定,如下图所示:

  

  ②、打开settings.xml文件,复制粘贴以下内容:

  <br /><br /><br /><br />   C:\Users\当前用户\.m2\repository<br /><br /><br /><br /><br /><br />aliyunmaven<br />*<br />阿里云公共仓库<br />https://maven.aliyun.com/repository/public<br /> <br /><br /><br /><br /><br /><br /><br />nexus<br /><br />

  注意代码中的当前用户该位置路径应与你当前用户一致。

  3、Mysql环境部署

  个人偏好于使用phpstudy,它集成了很多常用组件,如apache,mysql等。作为练习,方便至极,一键启动即可使用。

  官方下载链接:

  https://www.xp.cn/

  下载完成后,双击进入软件。进入首页处,选择mysql套件,点击启动即可,如下图所示:

  

  点击左侧数据库,可以对数据库进行密码修改操作。

  4、IDEA

  官方下载地址,可选择使用Ultimate版本。

  https://www.jetbrains.com/zh-cn/idea/download/#section=windows

  B、环境搭建

  安装整体过程首先将数据导入mysql数据库中,然后将项目导入IDEA中,修改配置文件中数据库信息,点击启动即完成环境搭建。

  ①、在phpstudy中启动Mysql

  

  ②、启动cmd命令行,进入mysql数据库,命令:mysql -u root -p,然后键入你的密码。

  

  ③、使用命令创建数据库:create database rbac;。使用命令选择rbac数据库:use rbac;

  

  ④、导入rbac.sql文件,该文件位于RefiningStone-RBAC 项目文件夹内。在导入时务必注意路径中的正斜杠。使用命令source导入数据,如下图所示:

  

  最后全部为Query OK...,无报错,即为全部导入成功。

  ⑤、打开IDEA,点击Open or import,选择项目文件夹下的pom.xml文件,最后选择打开方式为Open as project,如下图所示:

  

  

  也可以右键选择文件夹,点击Open folder as Intellij IDEA project......

  第一次导入项目,Maven会自动下载所需依赖,会花费一些时间。

  ⑥、几个现象表明项目部署成功。pom.xml文件无报错,项目代码已编译为class,Edit Configurations...处显示可以运行。

  ⑦、进入src - main - resources - application.yml,对配置文件进行相关修改,主要修改Mysql数据库连接账号密码,具体可以去phpstudy下数据库处查看。

  

  ⑧、万事具备,点击右上侧启动即可。下侧console控制台中信息无任何报错,即为启动成功,另外需要注意的是启动端口是多少,启动端口可以在application.yml文件中更改port的值。

  

  ⑨、打开浏览器,键入:8088/login.html,访问项目。

  

  至此,环境已搭建完毕,可以开始后面的练习了。

  下期我们对该系统进行代码审计以及漏洞验证。

  环境领取

  欢迎点击下方链接获取配套练习环境。

0 个评论

要回复文章请先登录注册


官方客服QQ群

微信人工客服

QQ人工客服


线