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

对请求而言:Listener -> Filter -> Servlet
新建一个 Filter 包,然后这里我创建了一个 XssFilter 类,然后实现了 Filter 接口。(这里导入对应的包)
然后重写方法
package com.example.servlet.Filter;
import javax.servlet.*;
import java.io.IOException;
public class XssFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void destroy() {
Filter.super.destroy();
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
}
然后配置过滤器到index路由到
@WebFilter(filterName = "xss",value = "/index")
public class XssFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter");
}
@Override
public void destroy() {
System.out.println("xss destroy");
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("xss init");
}
}
然后启动网站,发现还没访问 /index 就会初始化 xss init方法

然后访问 /index 触发了 doFilter 方法

现在我们访问 /index?name=<script>alert(1)</script> 就会弹出提示框
然后我们使用 Filter 过滤器进行过滤
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("doFilter");
HttpServletRequest request = (HttpServletRequest) servletRequest;
String name = request.getParameter("name");
if (!name.contains("script")) {
filterChain.doFilter(servletRequest, servletResponse);
}else {
System.out.println("XssFilter found attck!");
}
}
这段代码的意思是 如果在 name 变量里面发现了 script 那么就会输出 XssFilter found attck! 并且不会执行 DoGet 方法
Payload检测,权限访问控制,红队内存马植入,蓝队清理内存马等
内存马参考: https://mp.weixin.qq.com/s/hev4G1FivLtqKjt0VhHKmw

根据图片可以知道,这个监听器在过滤器前面
AdminServlet类在 Servlet 包里面新建一个 AdminServlet 类
@WebServlet(name="admin",value = "/admin")
public class AdminServlet extends HttpServlet {
@Override
public void init() throws ServletException {
System.out.println("AdminServlet init");
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
System.out.println("AdminServlert doGet");
//销毁session
req.getSession().invalidate();
}
@Override
public void destroy() {
}
}
在 Listen 包里面创建一个 SessionListen 类
@WebListener("/admin")
public class SessionListen implements HttpSessionListener {
@Override
public void sessionCreated(HttpSessionEvent se) {
System.out.println("Listen Session created");
}
@Override
public void sessionDestroyed(HttpSessionEvent se) {
System.out.println("Listen Session destroyed");
}
}