我爱普洱茶 发表于 2024-9-20 17:13:54

【第33课】安全开发-JavaEE应用&SQL预编译&Filter过滤器&Listener监听器&访

免责声明
本文发布的工具和脚本,仅用作测试和学习研究,禁止用于商业用途,不能保证其合法性,准确性,完整性和有效性,请根据情况自行判断。
如果任何单元或个人认为该项目的脚本可能涉嫌侵犯其权利,则应实时通知并提供身份证明,全部权证明,我们将在收到认证文件后删除相关内容。
文中所涉及的技能、思绪及工具等相关知识仅供安全为目的的学习利用,任何人不得将其应用于非法用途及盈利等目的,间接利用文章中的任何工具、思绪及技能,我方对于由此引起的法律后果概不负责。
Java知识点

功能:数据库操作,文件操作,序列化数据,身份验证,框架开发,第三方库使用等.

框架库:MyBatis,SpringMVC,SpringBoot,Shiro,Log4j,FastJson等

技术:Servlet,Listen,Filter,Interceptor,JWT,AOP,待补充

安全:SQL注入,RCE执行,反序列化,脆弱验证,未授权访问,待补充

安全:原生开发安全,第三方框架安全,第三方库安全等,待补充
JavaEE-预编译-SQL

   预编译SQL语句并执行 , 预防SQL注入题目
String safesql="select * from news where id=?";
PreparedStatement preparedStatement=connection.prepareStatement();
preparedStatement.setString(1,s);
ResultSet resultSet=preparedStatement.executeQuery();
    提前编译好执行逻辑,你注入的语句不会改变原有逻辑!
https://i-blog.csdnimg.cn/blog_migrate/36cee0340eb6a623f77b13c79656a120.png

[*]预编译写法: safesql 是一个预编译的 SQL 查询语句,其中 ? 是一个占位符,体现将在执行时动态替换。
[*]利用 PreparedStatement: PreparedStatement 是 Statement 的子接口,用于执行预编译的 SQL 语句。通过调用 connection.prepareStatement(safesql) 创建一个 PreparedStatement 对象。
[*]设置参数: 利用 setXXX 方法设置占位符的值。在这里,利用 setString(1, s) 将字符串 **s 的值设置到第一个占位符上及sql语句中的==?==。**这种方式防止了 SQL 注入攻击,由于参数值是通过预编译的方式传递的,而不是通过直接拼接字符串。
[*]执行查询: 调用 executeQuery() 执行查询,得到 ResultSet 对象。
[*]处理效果集: 根据业务需要,处理查询效果集的数据。
[*]打印终极的预编译 SQL 语句(用于调试): System.out.println(safesql); 这行代码用于在控制台打印终极生成的预编译 SQL 语句。这对于调试时检查生成的 SQL 语句是否精确是有帮助的。
// 预编译写法
String safesql = "SELECT * FROM news WHERE id=?";

// 使用PreparedStatement
try (PreparedStatement preparedStatement = connection.prepareStatement(safesql)) {
    // 设置参数,防止SQL注入攻击
    preparedStatement.setString(1, s);

    // 执行查询
    ResultSet resultSet = preparedStatement.executeQuery();

    // 处理结果集...

    // 打印最终的预编译 SQL 语句(用于调试)
    System.out.println(safesql);
} catch (SQLException e) {
    e.printStackTrace();
}

利用不安全写法,可以举行sql注入,select * from news where id=1: 这是一个正常的SQL查询,目的是从名为"news"的表中选择ID为1的记载。

[*]union: 这是SQL的关键字,用于归并两个查询的效果集。
[*]select 1,2,3,version(),user(),database(): 这是一个注入的查询,它返回了一些固定的值(1、2、3)以及数据库的版本信息(version())、当前用户(user())和当前数据库(database())的信息。
通过将这两个查询归并,攻击者试图将恶意的查询注入到正常的查询中,从而获取数据库的敏感信息。这种范例的攻击被称为连合查询注入。
https://i-blog.csdnimg.cn/blog_migrate/d3e57e5a6b2fc727d767fef05a5d5b37.png
利用预编译写法,固定sql语句的逻辑,防止举行sql注入
https://i-blog.csdnimg.cn/blog_migrate/c2186c0899e7e0d6f76da2e1e38b304c.png


JavaEE-过滤器-Filter

   Filter被称为过滤器,过滤器现实上就是对Web资源举行拦截,做一些处理后再交给下一个过滤器或Servlet处理,通常都是用来拦截request举行处理的,也可以对返回的 response举行拦截处理。开发人员利用filter技能,可以实现对全部Web资源的管理,比方实现权限访问控制、过滤敏感词汇、压缩响应信息等一些高级功能。
https://i-blog.csdnimg.cn/blog_migrate/1815b77f8fd971e74ae897717b0f5adb.png

1、创建过滤器
2、过滤器内置方法
init  doFilter destroy
3、过滤器触发流程
@WebFilter("/xss")
<filter>
    <filter-name>xssFilter</filter-name>
    <filter-class>com.example.filter.xssFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>xssFilter</filter-name>
    <url-pattern>/xss</url-pattern>
</filter-mapping>
4、过滤器安全场景
Payload检测,权限访问控制,红队内存马植入,蓝队清理内存马等
内存马参考:https://mp.weixin.qq.com/s/hev4G1FivLtqKjt0VhHKmw
    1、创建新的项目


[*]创建新的项目FilterDemo1
[*]在对应的包名上,创建分类包filter与servlet
[*]在servlet下创建TestServlet ,并举行检测
[*]启动服务器,实验举行Xss攻击,发现可以
https://i-blog.csdnimg.cn/blog_migrate/673ec9fc9cec621ef5c65d843709f81b.png
https://i-blog.csdnimg.cn/blog_migrate/d01010bfea9f79d1b1785208468d6aef.png
https://i-blog.csdnimg.cn/blog_migrate/9253a50063f89059d8d78cb22af84b3c.png
2、创建过滤器
在对应的filter下创建XssFilter,并实现Filter 接口中的全部方法
3、过滤器内置方法
init(FilterConfig filterConfig):


[*]该方法在过滤器被初始化时调用,只会执行一次。
[*]用于执行一些初始化操作,比方获取配置信息等。
doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain):


[*]这是过滤器的主要方法,在每次请求被过滤时都会调用。
[*]doFilter 方法中的 filterChain.doFilter(request, response) 体现继续执行过滤器链,如果没有更多的过滤器,终极将调用目标资源(比方 Servlet 或 JSP)。
[*]如果在 doFilter 中不调用 filterChain.doFilter,则请求将被拦截,不会继续传递。
destroy():


[*]该方法在过滤器被销毁时调用,只会执行一次。
[*]用于执行一些清理工作,释放资源等。
package com.example.filterdemo1.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter("/test")
public class XssFilter implements Filter {
    @Override
    //中间件启动后就自动运行
    public void init(FilterConfig filterConfig) throws ServletException {
      System.out.println("xss开启过滤");
    }

    @Override
    //中间件关闭后就自动运行
    public void destroy() {
      System.out.println("xss销毁过滤");
    }

    @Override
    //doFilter 访问路由触发的方法
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      System.out.println("xss正在过滤");
      //过滤代码就应该在放行前
      //如果符合就放行,不符合就过滤(拦截)
      //XSS过滤 接受参数值 如果有攻击payload 就进行拦截
      // 接受参数值 如果没有攻击payload 就进行放行
      HttpServletRequest request= (HttpServletRequest) servletRequest;
      String code = request.getParameter("code");
      if(!code.contains("<script>")){ //没有攻击payload
            //放行
            filterChain.doFilter(servletRequest,servletResponse);
      }else{
            System.out.println("存在XSS攻击");
            //继续拦截
      }

    }
}

4、过滤器触发流程

@WebFilter("/test")
<filter>
<filter-name>xssFilter</filter-name>
<filter-class>com.example.filter.xssFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>xssFilter</filter-name>
<url-pattern>/test</url-pattern>
</filter-mapping>5、利用过滤器简朴素现:cookie身份验证
在servlet下创建AdminServlet,

@WebServlet("/admin")
public class AdminServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      System.out.println("欢迎进入管理员页面");
    }
}在filter下创建AdminFileter,先不参加判断获取到欣赏器本身的cookie值
https://i-blog.csdnimg.cn/blog_migrate/a66b386ae0afe320c6e03a8bea727532.png
https://i-blog.csdnimg.cn/blog_migrate/9ff62917b424cbc2ecfb499137fd8518.png


[*]检查请求中是否包罗名为 “user” 且值为 “admin” 的Cookie。如果符合条件,则放行请求;否则,输出 “非管理员访问”。
[*]相应进入管理员页面,必须先在欣赏器中添加对应判断的cookie值
[*]如果对应不上则是非管理员访问,不予通过
package com.example.filterdemo1.filter;


import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter("/admin")
public class AdminFileter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
      System.out.println("admin身份检测开启");
    }

    @Override
    public void destroy() {
      System.out.println("admin身份检测销毁");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {

      System.out.println("admin身份检测进行");
      //检测Cookie过滤
      HttpServletRequest request= (HttpServletRequest) servletRequest;
      Cookie[] cookies=request.getCookies();
      //对Cookie进行遍历获取
      for(Cookie c:cookies){
            String cName = c.getName();//获取cookie名
            String cValue = c.getValue();//获取cookie值
            System.out.println(cName);
            System.out.println(cValue);
            if(cName.contains("user") && cValue.contains("admin")){
                // filterChain 是一个 FilterChain 对象,代表过滤器链。
                // doFilter() 方法用于将请求和响应对象传递给过滤器链中的下一个过滤器或目标资源。
                // 即当前过滤通过
                filterChain.doFilter(servletRequest,servletResponse);
            }else {
                System.out.println("非管理员访问");
            }
      }

    }
}

https://i-blog.csdnimg.cn/blog_migrate/125cccbb6f44c28bba0ec34479891d2b.png
    XSS过滤
package com.example.filterdemo1.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

@WebFilter("/test")
public class XssFilter implements Filter {
    @Override
    //中间件启动后就自动运行
    public void init(FilterConfig filterConfig) throws ServletException {
      System.out.println("xss开启过滤");
    }

    @Override
    //中间件关闭后就自动运行
    public void destroy() {
      System.out.println("xss销毁过滤");
    }

    @Override
    //doFilter 访问路由触发的方法
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
      System.out.println("xss正在过滤");
      //过滤代码就应该在放行前
      //如果符合就放行,不符合就过滤(拦截)
      //XSS过滤 接受参数值 如果有攻击payload 就进行拦截
      // 接受参数值 如果没有攻击payload 就进行放行
      HttpServletRequest request= (HttpServletRequest) servletRequest;
      String code = request.getParameter("code");
      if(!code.contains("<script>")){ //没有攻击payload
            //放行
            filterChain.doFilter(servletRequest,servletResponse);
      }else{
            System.out.println("存在XSS攻击");
            //继续拦截
      }

    }
}

开启过滤后,发现成功拦截Xss攻击
https://i-blog.csdnimg.cn/blog_migrate/480e3b125f66a61b61f387682b77cb0a.png
内存马参考:深入浅出内存马(一)


JavaEE-监听器-Listen

   https://i-blog.csdnimg.cn/blog_migrate/bf2f1c2db29c7c9efe384b8a8931537c.png
参考:https :// blog . csdn . net / qq_52797170 / article / details / 124023760
-监听ServletContext、HttpSession、ServletRequest等域对象创建和销毁事故
-监听域对象的属性发生修改的事故
-监听在事故发生前、发生后做一些必要的处理
1、创建监听器
2、监听器内置方法
3、监听器触发流程
@WebListener
<listener>
.......
</listener>
4、监听器安全场景
代码审计中分析执行逻辑触发操作,红队内存马植入,蓝队清理内存马等
    创建新的项目

[*]创建新的项目ListenDemo1
[*]在对应的包名上,创建分类包listenerr与servlet
[*]在servlet下创建CSession DSession,并举行检测
[*]DSession一个简朴的Servlet,对应一个/ds的URL映射。在收到GET请求时,它会销毁当前请求的HttpSession
https://i-blog.csdnimg.cn/blog_migrate/d2bbb8bf4ed1f9b4c8c27ec7a556c12a.png
listener/ListenSession
package com.example.listendemo1.listener;

import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionEvent;
import javax.servlet.http.HttpSessionListener;

@WebListener
public class ListenSession implements HttpSessionListener {

    @Override
    public void sessionCreated(HttpSessionEvent se) {
      //监听检测有Session创建就会执行这里
      System.out.println("监听器监听到了session创建");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
      //监听检测有Session销毁就会执行这里
      System.out.println("监听器监听到了session销毁");
    }
}

这段代码界说了一个实现 HttpSessionListener 接口的监听器类 ListenSession,用于监听HttpSession的创建和销毁事故。
对于HttpSessionListener:


[*]当一个新的HttpSession被创建时,sessionCreated方法将被调用。
[*]当一个HttpSession被销毁时,sessionDestroyed方法将被调用。
Servlet/CSession
package com.example.listendemo1.Servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;

@WebServlet("/cs")
public class CSession extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      System.out.println("Servlet里面创建Session");
      //创建Session
      req.getSession();
    }
}

Servlet/DSession
package com.example.listendemo1.Servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;


@WebServlet("/ds")
public class DSession extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
      System.out.println("Servlet里面销毁Session");
      //销毁Session
      req.getSession().invalidate();
    }
}

监听器的触发流程:
在 web.xml 中增长如下内容放置在 web-app 标签内

@WebListener
<listener>
.......
</listener>
[*]注册监听器:在Web应用中,你需要将监听器注册到相应的组件上。比方,在web.xml文件中配置监听器,大概利用注解(如@WebListener)标记监听器类。
[*]事故发生:当与监听器关联的特定事故在Web应用中发生时,监听器会被触发。
[*]调用监听器方法:监听器类中实现的相应方法(如sessionCreated、sessionDestroyed等)将被调用。这些方法包罗与事故相关的信息,允许监听器执行特定的逻辑。
[*]执行自界说逻辑:在监听器方法中,你可以编写自界说的逻辑以响应事故。这可能包括记载日志、修改数据、发送通知等。


思维导图

https://i-blog.csdnimg.cn/blog_migrate/2bc47fd8568ef72998e1ac91a6013224.png

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
页: [1]
查看完整版本: 【第33课】安全开发-JavaEE应用&SQL预编译&Filter过滤器&Listener监听器&访