目录
0x00 前言
很久没有更新 CSDN 博客了,原因是搭建了个人博客网站,但现在决定还是同步到 CSDN
希望和各位大佬一起学习,如果文章内容有错请多多指正,谢谢!
个人博客链接:CH4SER的个人BLOG – Welcome To Ch4ser's Blog
0x01 Servlet&路由&生命周期
参考:JAVAEE的核心-Servlet_javaee servlet-CSDN博客
1、解释
Servlet 是运行在 Web 服务器或应用服务器上的程序,它是作为来自 Web 浏览器或其他 HTTP 客户端的请求和 HTTP 服务器上的数据库或应用程序之间的中间层。
使用 Servlet 可以收集来自网页表单的用户输入,呈现来自数据库或者其他源的记录,还可以动态创建网页。
2、创建和使用 Servlet
- 第一步,创建一个类继承 HttpServlet
- 第二步,在 web.xml 配置 Servlet 路由,或者使用 @WebServlet 配置(后面的 Filter、Listener 对应 @WebFilter、@WebListener)
- 第三步,写入内置方法(init、service、destroy、doGet、doPost ......)
关于 web.xml:
- web.xml 是 web 应用的配置文件,它必须存放在 webapp/WEB-INF/ 目录下面
- 用于对 web 应用下的web资源进行配置,服务器在启动时会读取 web.xml 文件中的内容
关于 url-pattern 匹配模式:
- / 代表当前web应用的根目录
- 精确匹配,例如:/test
- 匹配任意的url,例如:/*
以下是使用 @WebServlet 配置 Servlet 路由的示例:
以下是在 web.xml 中配置 Servlet 路由的示例:
以下是测试 doGet 方法,浏览器 GET 方式请求 http://localhost:8080/demo1/index?name=ch4ser,页面和控制台都会有打印输出。
同理,可以测试 doPut、doDelete 等方法。
3、Servlet 的生命周期
以下是测试 init、service、destroy 方法:
当浏览器 GET 方式请求 http://localhost:8080/demo1/index?name=ch4ser,IDEA 控制台输出:
---------Init---------
---------Servlet Service---------
---------Http Service---------
--------doGET---------
当 Tomcat 服务器关闭时,IDEA 控制台输出:---------Destroy---------
注意上面两个不同的 service 方法:
- service(ServletRequest req, ServletResponse res):这个方法是 Servlet 的父类 GenericServlet 中定义的方法。用于处理通用的请求和响应
- service(HttpServletRequest req, HttpServletResponse resp):这个方法是 Servlet 的子类
HttpServlet
中定义的方法。用于处理 HTTP 请求和响应
所以,如果只需要处理通用的请求和响应,可以使用service(ServletRequest req, ServletResponse res)方法。
而如果需要处理HTTP请求和响应,可以使用service(HttpServletRequest req, HttpServletResponse resp)方法,它提供了更多的HTTP相关的功能和信息。
0x02 JDBC&Mybatis
1、原生态数据库开发:JDBC
参考:JavaEE-JDBC基础 - 简书 (jianshu.com)
JDBC:由 Java 提供,用于访问数据库的统一 API 接口规范。
数据库驱动:由各个数据库厂商提供,用于访问数据库的 jar 包(JDBC的具体实现),遵循 JDBC 接口,以便 Java 程序员使用。
- 下载数据库驱动 jar 包:Maven Repository: Search/Browse/Explore (mvnrepository.com)
- 引用封装 jar包:项目根目录下创建一个 lib 目录,复制导入 lib 后,右键选择添加为库
使用 JDBC 操作数据库:
- 注册数据库驱动
- 建立数据库连接
- 创建 Statement 执行SQL语句
- 输出查询 ResultSet
- 关闭连接,释放资源
以下是一段使用 JDBC 操作数据库的简单代码:
2、持久层框架 Mybatis
MyBatis是一种持久层框架,用于将Java对象映射到关系数据库中的数据。它提供了一种将SQL语句与Java对象进行映射的简单方法,从而减少了开发人员编写和维护传统JDBC代码的工作量。
MyBatis的核心是一个基于XML的配置文件,其中定义了数据库连接信息、SQL语句和结果映射规则。开发人员可以通过编写简单的XML文件来定义SQL语句,并在Java代码中使用MyBatis的API来执行这些SQL语句。
MyBatis提供了丰富的功能,包括动态SQL、批处理、缓存、插件扩展等。它支持多种数据库,包括MySQL、Oracle、SQL Server等。同时,MyBatis还提供了与Spring等常用框架的集成支持,使得在企业应用中使用MyBatis变得更加方便。
总的来说,MyBatis是一种简单易用、功能丰富的Java持久层框架,可以帮助开发人员更轻松地进行数据库访问操作。
0x03 预编译 SQL
1、预编译原理
提前编译好执行逻辑或语义,攻击者所注入的语句并不会改变原有的逻辑或语义,从而预防 SQL 注入。
2、写法示例
3、不安全的写法和预编译写法的对比
//不安全写法
String unsafe_sql = "select * from stu where id="+s;
Statement statement = connection.createStatement();
ResultSet rs = statement.executeQuery(unsafe_sql);
//预编译写法
String safe_sql = "select * from stu where id=?";
PreparedStatement preparedStatement = connection.prepareStatement(safe_sql);
preparedStatement.setString(1,s);
ResultSet rs = preparedStatement.executeQuery();
0x04 Filter 过滤器
1、解释
Filter 被称为过滤器,实质上就是对 Web 资源进行拦截,做一些处理后再交给下一个过滤器或 Servlet 处理。
通常是用来拦截 Request 请求进行拦截处理的,但也可以对返回的 Response 进行拦截处理。
开发人员使用 Filter 技术,可以实现对所有 Web 资源的管理,如实现权限访问控制、过滤敏感词汇、压缩响应信息等。
在讲如何创建和使用 Filter 之前,先来看看完整的请求、响应的过程:
2、Filter 生命周期
下面通过一段 Servlet 和一段 Filter 代码来验证一下 Filter 的生命周期。
这是 Servlet 的代码:
这是 Filter 的代码:
这是 web.xml 的配置:
验证结果:
- 当中间件(项目)启动时,IDEA 控制台输出 "xss过滤开启",也就是 init 方法
- 当中间件(项目)停止时,IDEA 控制台输出 "xss过滤销毁",也就是 destroy 方法
- 当访问 /test 时,IDEA 控制台输出 "xss正在过滤",也就是 doFilter 方法
这里 Filter 是 implements 而不是 extends,以下是二者的区别:
- implements 关键字用于实现接口,继承类需要实现接口中定义的所有方法
- extends 关键字用于继承类,继承类可以使用父类的方法和属性,并可以添加新的方法和属性
但此时访问 /test?code=xxx,发现页面并没有输出 xxx,这是由于我们没有在 doFilter 方法里写上放行的代码,其默认全部禁止。
3、使用 doFilter 实现简单拦截过滤
这里修改 doFilter 方法,实现一个简单的 XSS 攻击拦截过滤:接收参数值,如果没有攻击 payload 就放行,有的话则拦截。
验证结果:
- 访问 /test?code=123,页面正常显示 code=123,也就是 doFilter 方法将其放行
- 访问 /test?code=<script>alert(1)</script>,页面无显示,IDEA 控制台输出 "存在xss攻击",也就是 doFilter 方法将其拦截
4、使用 doFilter 实现简单身份访问控制
以下为 Servlet 的代码,模拟一个管理员界面:
以下为 Filter 的代码,根据 cookie 判断是否为管理员,若是则放行,反之则拦截:
以下是 web.xml 的配置:
验证结果:
- cookie 无 user=admin 时,访问 /admin 被拦截,IDEA 控制台输出 "非法访问,已拦截"
- cookie 有 user=admin 时,正常进入 /admin 页面,IDEA 控制台输出 "欢迎进入管理员界面"
5、Filter 过滤器的安全场景
- Payload检测
- 权限访问控制
- 红队内存马植入,蓝队清理内存马等
内存马参考:深入浅出内存马(一) (qq.com)
0x05 Listener 监听器
1、解释
参考:JavaWeb监听器_javaweb 监听器-CSDN博客
监听器是Servlet规范中定义的一种特殊类,简单来说就是监听操作。
- 用来监听ServletContext、HttpSession和ServletRequest等域对象的创建和销毁事件
- 用来监听域对象的属性发生修改的事件
- 可以在事件发生前、发生后做一些必要的处理
2、使用 Listener 监听 Session 的创建、销毁
创建两个 Servlet:CreateSession、DestroySession
CreateSession 用来创建 Session:
DestroySession 用来销毁 Session:
创建一个 Listener:ListenSession,用来监听 Session 的创建、销毁
注意:配置 Listener 路由时不需要加路径,因为 Listener 不是以访问路径触发的
验证结果:
- 访问 /cs 时,IDEA 控制台输出 "Listener监听到了Session创建",触发 Listener的 sessionCreated 方法
- 访问 /ds 时,IDEA 控制台输出 "Listener监听到了Session销毁",触发 Listener的 sessionDestroyed 方法
3、Listen 监听器的安全场景
- 代码审计中分析执行逻辑触发操作
- 红队内存马植入,蓝队清理内存马等
Listen 在安全方面涉及的比较少,不像 Filter 涉及的比较多,但还是有这种类型的内存马。