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");
}
}