2017-07-22 72 views
0

HTTPメッセージからパラメータを抽出してリソースURLを取得すると、意図したリソースのセマンティクスを変更する可能性のある注入攻撃に対して脆弱になる可能性があります。ここでは、HTTPパラメータ/パス汚染(HPPP)とサーバー側要求偽造(SSRF)という2つの種類の攻撃が関係します。攻撃者はHTTPリクエストまたはHTTPレスポンスを完全に制御できます。HTTPパラメータ/パス汚染攻撃を修正する方法Spring Rest

HPPP(HTTPパラメータ/パス汚染攻撃)では、リソースのREST要求を準備する(または埋め込みリンクを生成する)ために使用されるリソースURLを構成するパラメータが使用されます。問題は、攻撃者がパスを変更したり、「クエリ文字列」内の予期しないパラメータを追加/上書きしたりする可能性があることです。さらに、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 

異なる値と同じパラメータを追加し、新しい要求を提出します。

質問:

春休憩、春のMVCと春のセキュリティは、HPPP issue.Howを修正するために構築されたサポートにいずれかを提供していない私たちは春のフレームワークの内部で修正できますか?

+1

提供することはできますか? –

+0

私は前に経路汚染の攻撃について聞いたことがありません。あなたは参考文献を持っていますか?パラメータ汚染はサーブレットコンテナレベルで自動的に回避する必要がありますが、依然としてクエリ文字列の一部を消費するアプリケーションの領域をテストすることは賢明です –

答えて

0

数時間を費やした後、私は以下のソリューションを実装しました。あなたがそれを処理するためのより良いアプローチがあれば教えてください。

1)私は、入力パラメータが例外をスローし、その後、私の定義済みリストに存在しない場合は、すべての入力が

3)パラメータ読むためにHandlerInterceptor

2)オーバーライドpreHandleメソッドを実装CustomHandlerを追加しました。

コード:

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

    } 
}