HTTP 요청 리디렉션은 위조 공격에 노출되어서는 안됩니다.

 

URL 매개변수, POST 데이터 페이로드 또는 쿠키와 같은 사용자 제공 데이터는 항상 신뢰할 수 없고 오염된 것으로 간주되어야 합니다. 오염된 데이터를 기반으로 HTTP 리디렉션을 수행하는 애플리케이션은 공격자가 사용자를 악성 사이트로 리디렉션하여 로그인 자격 증명을 탈취하는 등의 작업을 수행할 수 있습니다.

이 문제는 다음와 같은 방법으로 완화될 수 있습니다.

  • 허용 목록에 따라 사용자가 제공한 데이터의 유효성을 검사하고 일치하지 않는 입력은 거부합니다.
  • 사용자 제공 데이터를 기반으로 리디렉션을 수행하지 않도록 애플리케이션을 재설계합니다.

규칙을 어긴 코드

Flask

from flask import request, redirect, Response

@app.route('flask_redirect')
def flask_redirect():
    url = request.args["next"]
    return redirect(url)  # 규칙을 어긴 코드

@app.route('set_location_header')
def set_location_header():
    url = request.args["next"]
    response = Response("redirecting...", 302)
    response.headers['Location'] = url  # 규칙을 어긴 코드
    return response

Django

from django.http import HttpResponseRedirect

def http_responser_redirect(request):
    url = request.GET.get("next", "/")
    return HttpResponseRedirect(url)  # 규칙을 어긴 코드

def set_location_header(request):
    url = request.GET.get("next", "/")
    response = HttpResponse(status=302)
    response['Location'] = url  # 규칙을 어긴 코드
    return response

규칙을 준수한 해결책

Flask

from flask import request, redirect, Response, url_for

@app.route('flask_redirect')
def flask_redirect():
    endpoint = request.args["next"]
    return redirect(url_for(endpoint))

Django

from django.http import HttpResponseRedirect
from urllib.parse import urlparse

DOMAINS_WHITELIST = ['www.example.com', 'example.com']

def http_responser_redirect(request):
    url = request.GET.get("next", "/")
    parsed_uri = urlparse(url)
    if parsed_uri.netloc in DOMAINS_WHITELIST:
        return HttpResponseRedirect(url)
    return HttpResponseRedirect("/")

같이보면 좋은 자료

If you like SONARKUBE, don’t forget to give me a star. :star2:

원문으로 바로가기

Star This Project