【问题标题】:How to fix HTTP parameter/path pollution attack Spring Rest如何修复 HTTP 参数/路径污染攻击 Spring Rest
【发布时间】:2023-03-19 09:36:01
【问题描述】:

从 HTTP 消息中提取参数并获取资源 URL 可能容易受到可能改变预期资源语义的注入攻击。这里涉及两类攻击:HTTP 参数/路径污染 (HPPP) 和服务器端请求伪造 (SSRF)。请记住,我们的攻击者可以完全控制 HTTP 请求或 HTTP 响应。

在 HPPP(HTTP 参数/路径污染攻击)中,参数用于组成资源 URL,用于为资源准备 REST 请求(或生成嵌入式链接)。问题是攻击者可能会更改路径或在“查询字符串”中添加/覆盖意外参数。此外,REST 框架可以使用参数(如 _method)来允许指定不同于传入 HTTP 方法的 REST 动词,因此 GET 请求可以被解释为 PUT 操作。攻击者可能会更改 REST 资源 URL 的语义。

查找更多信息here

示例:

例如:如果测试查询字符串中的 search_string 参数,请求 URL 将包含该参数名称和值。

http://example.com/?search_string=kittens 

特定参数可能隐藏在其他几个参数中,但方法是相同的;保留其他参数并附加副本。

http://example.com/?mode=guest&search_string=kittens&num_results=100 

将相同的参数附加不同​​的值

http://example.com/?mode=guest&search_string=kittens&num_results=100&search_string=puppies 

并提交新请求。

问题:

Spring Rest、Spring MVC 和 Spring Security 不提供任何内置支持来修复 HPPP 问题。我们如何修复 Spring 框架内部?

【问题讨论】:

  • 你能提供例子吗?
  • 我以前从未听说过路径污染攻击。你有参考吗?应该在 servlet 容器级别自动避免参数污染,但您仍然明智地测试应用程序中消耗(部分)查询字符串的区域
  • @AndyWilkinson 虽然我认为这已经很老了,但您现在已经听说过,这里有一个参考:owasp.org/index.php/… 基于此,Tomcat 返回第一个匹配项。当它总是那样做时,我看不到利用它的方法。

标签: spring rest spring-boot spring-security


【解决方案1】:

花了几个小时后,我已经实现了以下解决方案,如果您有更好的方法来处理它,请告诉我。

1) 我添加了实现 HandlerInterceptor 的 CustomHandler

2) 重写preHandle方法读取所有输入参数

3) 如果我的预定义列表中不存在输入参数,则抛出异常。

代码:

import java.util.Collections;
import java.util.Enumeration;
import java.util.List;
import java.util.ListIterator;

import javax.naming.AuthenticationException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.commons.codec.binary.Base64;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

@Component
public class RequestInterceptor implements HandlerInterceptor {

    enum parameterChoices {
        inputParam1, inputParam2, inputParam3
    };

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {

        if (request.getParameterNames() != null) {
            Enumeration<String> parametrs = request.getParameterNames();
            List<String> list = Collections.list(parametrs);
            ListIterator<String> litr = list.listIterator();

            while (litr.hasNext()) {

                if (!contains(litr.next())) {
                    throw new RuntimeException("HTTP parameter/path pollution attack Exception");
                }
            }

        }
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
            ModelAndView modelAndView) throws Exception {
        System.out.println("---method executed---");
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
            throws Exception {
        System.out.println("---Request Completed---");
    }

    private boolean contains(String paramValue) {
        System.out.println("contains paramValue=" + paramValue);
        if (paramValue == null || paramValue == "") {
            return false;
        }

        for (parameterChoices type : parameterChoices.values()) {
            if (type.name().equals(paramValue)) {
                return true;
            }
        }

        return false;
    }

}

现在注册:

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

@Configuration
public class AppConfig extends WebMvcConfigurerAdapter {

    @Autowired
    RequestInterceptor requestInterceptor ;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(requestInterceptor );

    }
}

【讨论】:

    猜你喜欢
    • 2016-10-17
    • 1970-01-01
    • 2020-10-05
    • 2021-06-30
    • 1970-01-01
    • 2022-01-24
    • 2013-04-08
    • 2023-02-04
    • 1970-01-01
    相关资源
    最近更新 更多