신뢰되지 않은 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(한국인터넷진흥원)