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("/")
같이보면 좋은 자료
- OWASP Top 10 2021 Category A1 - 손상된 액세스 제어
- OWASP Top 10 2017 Category A5 - 손상된 액세스 제어
- MITRE, CWE-20 - 부적절한 입력 검증
- MITRE, CWE-601 - 신뢰할 수 없는 사이트로의 URL 리디렉션(‘Open Redirect’)
-
SANS Top 25 - 위험한 리소스 관리
If you like SONARKUBE, don’t forget to give me a star.