前言
本系列为【炼石计划@Java代码审计】知识星球实战50套开源系统删减版,也就是每一套分享部分内容给大家学习。如果觉得写得还不错,并且想要从实践中学习JavaWeb代码审计的朋友,欢迎了解加入【炼石计划@Java代码审计】知识星球,与500位志同道合的朋友共同学习成长。
文末获取配套练习环境。
进入正题
一、前置知识
A、涉及相关技术简介
A1、Maven简介
Maven 是一个项目管理工具,它包含了一个项目对象模型(Project Object Model),反映在配置中,就是一个 pom.xml 文件。是一组标准集合,一个项目的生命周期、一个依赖管理系统,另外还包括定义在项目生命周期阶段的插件(plugin)以及目标(goal)。
当我们使用 Maven 的使用,通过一个自定义的项目对象模型,pom.xml 来详细描述我们自己的项目。
简单来说,我们开发一个JavaWeb项目是需要加载很多依赖的,使用Maven可以便于管理这些依赖。
-
pom.xml
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
- 版本信息。
-
使用IDEA创建Maven项目
1、打开IDEA,点击Create New Porject
,选择Maven
,如下图所示:
2、默认即可(在真实需求中,可以根据自己的项目,选择不同模板),点击Next,然后点击Finish。一个最基本的Maven项目结构
如下图所示:
配置源加速,自行百度就可以了。
A2、SpringBoot简介
SpringBoot是一款基于JAVA的开源框架。目的是为了简化Spring应用搭建和开发流程。是目前比较流行,大中小型企业常用的框架。正因为极大简化了开发流程,才收到绝大开发人员的喜爱。SpringBoot核心原理是自动装配(自动配置),在这之前,开发一个JavaWeb,Spring等项目要进行很多配置,使用了SpringBoot就不用在过多考虑这些方面。并且在SpringBoot中还内置了Tomcat。
-
SpringBoot之HelloWorld
通过经典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、点击右上方运行,打开浏览器输入http://127.0.0.1:8080/hello
,即可看到helloworld,如下图所示:
@Controller
注解:标注该类为controller类,可以处理http请求。@Controller一般要配合模版来使用。现在项目大多是前后端分离,后端处理请求,然后返回JSON格式数据即可,这样也就不需要模板了。
@ResponseBody
注解:将该注解写在类的外面,表示这个类所有方法的返回的数据直接给浏览器。@RestController 相当于 @ResponseBody 加上 @Controller
@RequestMapping
注解:配置URL映射
,可以作用于某个Controller类上,也可以作用于某Controller类下的具体方法中,说白了就是URL中请求路径会直接映射到具体方法中执行代码逻辑。
@PathVariable
注解:接受请求URL路径中占位符的值,示例代码如下图所示:
@Controller
@ResponseBody
@RequestMapping("/hello")
public class HelloController {
@RequestMapping("/whoami/{name}/{sex}")
public String hello(@PathVariable("name") String name, @PathVariable("sex") String sex){
return "Hello" + name + sex;
}
}
@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/
/api/swagger/
/swagger/ui/
/api/swagger/ui/
/swagger-ui.html/
/api/swagger-ui.html/
/user/swagger-ui.html/
/swagger/ui/
/api/swagger/ui/
/libs/swaggerui/
/api/swaggerui/
/swagger-resources/configuration/ui/
/swagger-resources/configuration/security/
......
Swagger组件特征固定title:Swagger UI
A6、Thymeleaf简介
官方学习文档:
https://www.thymeleaf.org/
https://www.thymeleaf.org/doc/tutorials/3.0/usingthymeleaf.html
Thymeleaf是一个流行的模板引擎,该模板引擎采用Java语言开发。模板引擎(这里特指用于Web开发的模板引擎)是为了使用户界面与业务数据(内容)分离而产生的,它可以生成特定格式的文档,用于网站的模板引擎就会生成一个标准的html文档。从字面上理解模板引擎,最重要的就是模板二字,这个意思就是做好一个模板后套入对应位置的数据,最终以html的格式展示出来,这就是模板引擎的作用。
例子:
<table>
<thead>
<tr>
<th th:text="#{msgs.headers.name}">Name</th>
<th th:text="#{msgs.headers.price}">Price</th>
</tr>
</thead>
<tbody>
<tr th:each="prod : ${allProducts}">
<td th:text="${prod.name}">Oranges</td>
<td th:text="${#numbers.formatDecimal(prod.price,1,2)}">0.99</td>
</tr>
</tbody>
</table>
拓展学习,大致了解每个标签作用:
https://www.w3xue.com/exp/article/20199/54847.html
A7、SpringBoot Actuator简介
Actuator主要用于公开有关正在运行的应用程序的运行信息 - 运行状况,指标,信息,转储,env等等。它使用HTTP端点或JMX bean来使我们能够与它进行交互。
一些常见的执行端点:
/beans:此端点返回应用程序中配置的所有bean的列表。
/env:提供有关Spring Environment属性的信息。
/health:显示应用程序运行状况
/info:显示应用程序信息,我们可以在Spring环境属性中配置它。
/mappings:显示所有 @RequestMapping 路径的列表 。
/shutdown:允许我们正常关闭应用程序。
/threaddump:提供应用程序的线程转储。
完整可执行的端点,详见官网:
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
文件,复制粘贴以下内容:
<?xml version="1.0" encoding="UTF-8"?>
<settings xmlns="http://maven.apache.org/SETTINGS/1.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<pluginGroups></pluginGroups>
<proxies></proxies>
<localRepository>C:Users当前用户.m2repository</localRepository>
<servers>
</servers>
<mirrors>
<mirror>
<id>aliyunmaven</id>
<mirrorOf>*</mirrorOf>
<name>阿里云公共仓库</name>
<url>https://maven.aliyun.com/repository/public</url>
</mirror>
</mirrors>
<profiles>
</profiles>
<activeProfiles>
<activeProfile>nexus</activeProfile>
</activeProfiles>
</settings>
注意代码中的当前用户
该位置路径应与你当前用户一致。
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
的值。
⑨、打开浏览器,键入http://127.0.0.1:8088/login.html
,访问项目。
至此,环境已搭建完毕,可以开始后面的练习了。
下期我们对该系统进行代码审计以及漏洞验证。
环境领取
欢迎点击下方链接获取配套练习环境。
【备注,后台回复关键字前八套环境
即可获取不限速下载链接】
炼石计划@Java代码审计
欢迎点击下方链接了解加入【炼石计划@Java代码审计】知识星球,在这里我们专注Java代码审计技术的提升。现阶段正在进行的为50套JavaWeb系统代码审计实战。赶紧和500位志同道合的朋友卷起来吧!
[加入后请务必查看指定文章使用手册]
炼石计划@PHP代码审计
欢迎点击下方链接了解加入【炼石计划@PHP代码审计】知识星球,在这里我们专注PHP代码审计技术的提升。七大阶段学习,让你最终掌握PHP代码审计。抱团学习取暖,避免走弯路,实现弯道超车。
原文始发于微信公众号(闪石星曜CyberSecurity):【JavaWeb系统代码审计实战】某RBAC管理系统(一)SpringBoot介绍与项目安装
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论