springMVC Unix 文件参数变更漏洞修复

错误信息如下:

解决方案:

原因:未对用户输入正确执行危险字符清理

未检查用户输入中是否包含"..."(两个点)字符串,比如 url 为 /login?action=.../webapps/RTJEKSWTN26635&type=randomCode

cookie为Cookie: JSESSIONID=.../webapps/RTJEKSWTN26241;

测试返回为200

解决办法:通过建立过滤器方法,增加对所有用户输入信息中是否包含".."(两个点)字符串进行清理过滤。

使用AppScan扫描之后可以通过这样的方式进行指定问题手动测试

使用过滤器过滤参数以及cookie中的.../

web.xml 配置拦截器

XML 复制代码
    <filter>
        <filter-name>InjectFilter</filter-name>
        <filter-class>com.fh.filter.InjectFilter</filter-class>
    </filter>

创建拦截器

java 复制代码
package com.fh.filter;

import com.alibaba.fastjson.JSON;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.http.HttpStatus;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

public class InjectFilter implements Filter {
    private static Logger log = LoggerFactory.getLogger(InjectFilter.class);
    private static final String REG_EXP = "\\.\\./";
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    public void doFilter(ServletRequest request, ServletResponse response,
                         FilterChain filterchain) throws IOException, ServletException {
        //判断是否有注入攻击字符
        HttpServletRequest req = (HttpServletRequest) request;
        boolean flag = injectInput(req, response);
        if (!flag) {
            return;
        } else {
            filterchain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {

    }

    /**
     * 判断request中是否含有注入攻击字符
     *
     * @param request
     * @return
     */
    public boolean injectInput(ServletRequest request, ServletResponse response) throws IOException {
        Enumeration e = request.getParameterNames();
        String attributeName;
        String attributeValues[];
        HttpServletRequest req = (HttpServletRequest) request;
        String cookie = req.getHeader("Cookie");
        if (!isSpecialChar(cookie, response)){
            return false;
        }
        while (e.hasMoreElements()) {
            attributeName = (String) e.nextElement();
            //不对密码信息进行过滤,一般密码中可以包含特殊字符
            if (attributeName.equals("username") || attributeName.equals("password")) {
                continue;
            }
            attributeValues = request.getParameterValues(attributeName);
            for (int i = 0; i < attributeValues.length; i++) {
                if (attributeValues[i] == null || attributeValues[i].equals(""))
                    continue;
                boolean flag = isSpecialChar(attributeValues[i], response);
                if (!flag){
                    return flag;
                }
            }
        }
        return true;
    }

    /**
     * 判断字符串中是否含有注入攻击字符
     */
    private boolean isSpecialChar(String value, ServletResponse servletResponse) throws IOException {
        Pattern pattern = Pattern.compile(REG_EXP);
        if (value == null) {
            return true;
        }
        Matcher matcher = pattern.matcher(value);
        if (matcher.find()) {
            log.info("入参中有非法字符: " + value);
            HttpServletResponse response = (HttpServletResponse) servletResponse;
            Map<String, Object> responseMap = new HashMap<>();
            // 匹配到非法字符,立即返回
            responseMap.put("code", 500);
            responseMap.put("msg", "入参中有非法字符");
            response.setContentType("application/json;charset=UTF-8");
            response.setStatus(HttpStatus.OK.value());
            PrintWriter writer = response.getWriter();
            writer.write(JSON.toJSONString(responseMap));
            writer.flush();
            writer.close();
            return false;
        }
        return true;
    }
}
相关推荐
网络安全Jack1 小时前
校园的网络安全
安全·web安全
Hacker_Oldv1 小时前
网络安全和爬虫的关系
爬虫·安全·web安全
D-river3 小时前
【静态网站渗透测试流程与关键点】
安全·web安全·网络安全
JohnYan4 小时前
工作笔记 - 记一次iNode网络连接故障的排查
网络协议·安全·操作系统
网安-轩逸9 小时前
网络安全防御模型
安全·web安全·php
夏炎正好眠11 小时前
seacmsv9报错注入
安全
Hacker_xingchen14 小时前
网络安全扫描--基础篇
网络·安全·web安全
不爱学习的YY酱17 小时前
使用ZFile打造属于自己的私有云系统结合内网穿透实现安全远程访问
安全
网硕互联的小客服17 小时前
服务器硬件老化导致性能下降的排查与优化
linux·运维·服务器·安全·centos
网安CILLE19 小时前
自学网络安全(黑客技术)2025年 —90天学习计划
linux·网络·安全·web安全·网络安全