嗨,大家好,我是闪石星曜CyberSecurity创始人Power7089。
欢迎大家搜索我的微信公众号:闪石星曜CyberSecurity
本文是【炼石计划@Java代码审计】内部圈子原创课程,现分享给大家学习。
如需转载,请详细注明来源。
欢迎大家搜索并添加我的好友【Power_7089】,备注CSDN,邀请你进入安全交流群。
配套练习环境获取:
百度云链接:
链接:https://pan.baidu.com/s/11rDre4Q32wqn7gMRyEmIyw
提取码:4nee
123云盘(不限速不用登录):
https://www.123pan.com/s/FWzDVv-JxCud
本系统是对https://github.com/witmy/my-springsecurity-plus
进行了小小的改动,也是为了让大家通个一个简单的系统入门Java代码审计。
如果有写的不详细的地方,欢迎一起讨论探索。
一、前置知识
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 应用的安全性包括两部分:
1. 用户认证(Authentication)
用户认证指的是验证某个用户是否为系统中的合法主体,也就是说用户能否访问该系统。用户认证一般要求用户提供用户名和密码。系统通过校验用户名和密码来完成认证过程。
2. 用户授权(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来使我们能够与它进行交互。文章来源:https://www.toymoban.com/news/detail-505350.html
一些常见的执行端点:文章来源地址https://www.toymoban.com/news/detail-505350.html
/beans:此端点返回应用程序中配置的所有bean的列表。
/env:提供有关Spring Environment属性的信息。
/health:显示应用程序运行状况
/info:显示应用程序信息,我们可以在Spring环境属性中配置它。
/mappings:显示所有 @RequestMapping 路径的列表 。
/shutdown:允许我们正常关闭应用程序。
/threaddump:
到了这里,关于一个基于SpringBoot开发的RBAC系统,非常适合新手入门JavaWeb代码审计实战的系统,长文警告,要好好学习。的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!