[시큐어코딩 가이드] 2-1-7. 신뢰되지 않은 URL 주소로 자동접속 연결

신뢰되지 않은 URL 주소로 자동접속 연결

정의

  • 사용자가 입력하는 값을 외부 사이트 주소로 사용해 해당 사이트로 자동 접속하는 서버 프로그램은 피싱 (Phishing) 공격에 노출되는 취약점
  • 공격자는 정상적인 폼 요청을 변조해 사용자가 위험한 URL로 접속할 수 있도록 공격

 

안전한 코딩기법

리다이렉션을 허용하는 모든 URL을 서버 측 화이트리스트로 관리하고 사용자 입력값을 리다이렉션 할 URL이 존재하는지 검증해야 한다.

 

코드예제

안전하지 않은 코드예제로 입력받은 url주소를 검증 없이 redirect 함수의 인자로 사용하고 있습니다. 이러한 경우 사용자가 의도하지 않은 사이트로 접근하도록 하거나 피싱공격에 노출될 수 있습니다.

#신뢰되지 않은 URL 주소로 자동접속 연결(안전X)
def redirect_url_bad(request):
    url = request.GET.get('url')
    return redirect(url)

 

http://127.0.0.1:8000/secure/redirect_url_bad/?url=https://www.tistory.com

 

티스토리 홈페이지가 나타납니다.

 

다음은 안전한 코드예제로 사전에 정의된 안전한 웹사이트에 한하여 리당렉트 할 수 있도록 화이트리스트를 설정한 코드입니다.

#신뢰되지 않은 URL 주소로 자동접속 연결(안전O)
WHITE_LIST_URL = ['http://127.0.0.1:8000/secure/']
def redirect_url_good(request):
    url = request.GET.get('url')
    if url not in WHITE_LIST_URL:
        return render(request, 'error.html', {'msg': '허용하지 않는 주소입니다..'})
    return redirect(url)

 

http://127.0.0.1:8000/secure/redirect_url_bad/?url=https://www.tistory.com

 

http://127.0.0.1:8000/secure/redirect_url_good/?url=https://www.naver.com

네이버 홈페이지가 나타납니다.

 

 

 

입력데이터 검증 및 표현/신뢰되지 않은 URL 주소로 자동접속 연결

[참고문헌] Python 시큐어코딩 가이드(2022) / KISA(한국인터넷진흥원)