美文网首页
RDF攻击的解决策略

RDF攻击的解决策略

作者: 怕水河马 | 来源:发表于2020-09-24 10:03 被阅读0次

    RDF攻击=Reflected File Download

    攻击者可以将某些输入内容植入到响应中,并且可以控制下载文件的文件名,然后让响应被下载到用户本地,然后用户启动了这些有问题的文件,形成了攻击。并且这些攻击可以在一定范围内传播。
    主要的攻击方式来自于URI中关于以 “;” 间隔的部分参数中。
    最新的攻击是用户将攻击内容放到了参数jsessionId的内容中。
    近期SpringFramework又爆出了新的RDF攻击的漏洞,查看其修复源码。
    SpringFramework在两次攻击中,其处理方式如下:
    1、在url中,屏蔽所有;间隔以后的代码,具体见:

    public class UrlPathHelper {
    
        private String removeSemicolonContentInternal(String requestUri) {
            int semicolonIndex = requestUri.indexOf(';');
            while (semicolonIndex != -1) {
                int slashIndex = requestUri.indexOf('/', semicolonIndex);
                String start = requestUri.substring(0, semicolonIndex);
                requestUri = (slashIndex != -1) ? start + requestUri.substring(slashIndex) : start;
                semicolonIndex = requestUri.indexOf(';', semicolonIndex);
            }
            return requestUri;
        }
    }
        
    

    第二次处理jsessionId的代码如下:

    public abstract class WebUtils {
    
        /**
         * Parse the given string with matrix variables. An example string would look
         * like this {@code "q1=a;q1=b;q2=a,b,c"}. The resulting map would contain
         * keys {@code "q1"} and {@code "q2"} with values {@code ["a","b"]} and
         * {@code ["a","b","c"]} respectively.
         * @param matrixVariables the unparsed matrix variables string
         * @return a map with matrix variable names and values (never {@code null})
         * @since 3.2
         */
        public static MultiValueMap<String, String> parseMatrixVariables(String matrixVariables) {
            MultiValueMap<String, String> result = new LinkedMultiValueMap<>();
            if (!StringUtils.hasText(matrixVariables)) {
                return result;
            }
            StringTokenizer pairs = new StringTokenizer(matrixVariables, ";");
            while (pairs.hasMoreTokens()) {
                String pair = pairs.nextToken();
                int index = pair.indexOf('=');
                if (index != -1) {
                    String name = pair.substring(0, index);
                    if (name.equalsIgnoreCase("jsessionid")) {
                        continue;
                    }
                    String rawValue = pair.substring(index + 1);
                    for (String value : StringUtils.commaDelimitedListToStringArray(rawValue)) {
                        result.add(name, value);
                    }
                }
                else {
                    result.add(pair, "");
                }
            }
            return result;
        }
    }
    

    由代码可知,第一次防护,在整合URI中,屏蔽了每一段"/"之间的";"之后的代码。
    第二次防护则去掉了jsessionId的参数和值。

    因此如果需要解决此类问题,要么可以考虑在接入段进行参数区隔,将参数隔离出容器,不让容器获取异常参数,也可以在响应段将异常对象隔离。均可以达到阻断攻击的效果。

    论文原文

    相关文章

      网友评论

          本文标题:RDF攻击的解决策略

          本文链接:https://www.haomeiwen.com/subject/takzyktx.html