angle-uparrow-clockwisearrow-counterclockwisearrow-down-uparrow-leftatcalendarcard-listchatcheckenvelopefolderhouseinfo-circlepencilpeoplepersonperson-fillperson-plusphoneplusquestion-circlesearchtagtrashx

Flask site penetration tests: security headers en de session cookie

Penetration testing is een eenvoudige manier om te controleren of uw site kwetsbaar is voor kwaadaardige aanvallen.

27 december 2019
post main image
https://unsplash.com/@cathrynlavery

U heeft een Flask webapplicatie gemaakt, deze draait prima en maakt gebruik van https. Maar is het veilig genoeg? Heeft u alles gedaan om uw bezoekers te beschermen, heeft u alles gedaan om kwaadaardige aanvallen te voorkomen?

Een goede manier om verder te gaan is om pentest uw site. Penetration testing tools, of pentesttools, kunnen zwakke punten in de beveiliging identificeren. Ze identificeren kwetsbaarheden in de webapplicatie die een veiligheidsinbreuk kunnen veroorzaken.

Wikipedia: De National Cyber Security Center, beschrijft het testen van de penetratie als volgt: "Een methode om zekerheid te krijgen over de veiligheid van een IT-systeem door te proberen de veiligheid van dat systeem geheel of gedeeltelijk te doorbreken, met behulp van dezelfde instrumenten en technieken als een tegenstander.

De meeste pentest -gereedschappen moeten worden geïnstalleerd en natuurlijk niet op uw lokale machine, maar ergens op het internet, zodat u uw productielocatie kunt testen zonder firewalls, NAT te hoeven doorlopen. Op een dag zal ik deze tools meer in detail bekijken, maar voorlopig wilde ik alleen maar een indicatie hebben van mogelijke kwetsbaarheden.

Ik heb een online test van Pentest-Tools.com gebruikt, zie onderstaande link, je krijgt twee gratis tests. Selecteer de Website Vulnerability Scanner, voer de url van uw site in en wacht op de resultaten. Natuurlijk is dit slechts een zeer eenvoudige test, maar het liet me in ieder geval zien dat mijn site security headers miste en dat de session cookie niet veilig was. Ik heb ook Dareboost gebruikt, zie onderstaande link, hun Website Speed Test and Website Analysis test gaf me een mooi Quality and Performance rapport.

Het toevoegen van ontbrekende security headers

Het is zeer eenvoudig om de ontbrekende security headers toe te voegen aan uw Flask site. Eerst heb ik een functie om de extra headers toe te voegen, ik gebruik de vlag include_security_headers voor sites die daadwerkelijk op het internet staan.

from werkzeug.http import http_date

import  datetime


def prepare_response_extra_headers(include_security_headers):

    response_extra_headers = {
        # always
        'Cache-Control': 'no-cache, no-store, must-revalidate',
        'Pragma': 'no-cache',
        'Expires': '0',
        'Last-Modified': http_date(datetime.datetime.now()),
    }
    if include_security_headers:
        response_security_headers = {
            # X-Frame-Options: page can only be shown in an iframe of the same site
            'X-Frame-Options': 'SAMEORIGIN',
            # ensure all app communication is sent over HTTPS
            'Strict-Transport-Security': 'max-age=63072000; includeSubdomains',
            # instructs the browser not to override the response content type
            'X-Content-Type-Options': 'nosniff',
            # enable browser cross-site scripting (XSS) filter
            'X-XSS-Protection': '1; mode=block',
        }
        response_extra_headers.update(response_security_headers)

    return response_extra_headers

Dan, in create_app() voeg ik de extra headers toe aan het antwoord in after_request:

    ...
    include_security_headers = config_name in ['staging', 'production']
    ...
    # prepare extra response headers, see after_request
    response_extra_headers = prepare_response_extra_headers(include_security_headers)
    ...
    @app.after_request
    def after_request(response):
        # after_request is not called for 500 error

        response.headers.extend(response_extra_headers)
        return response

Merk op dat we gebruik maken van extend in plaats van update, zie de Werkzeug datastructuren informatie.

De session cookie beveiligen

Over de session cookie, mijn site gebruikt https, http verzoeken worden doorgestuurd naar https, dus wat is het probleem? Het probleem is dat de cookie op het eerste (!) verzoek niet van uw browser hoeft te komen. U kunt de HTTP Strict Transport Security (HSTS) header instellen en https afdwingen, maar dit lost het probleem niet op omdat niet alle browsers deze header ondersteunen.

De enige manier waarop u uw session cookie kunt beveiligen is door het cookie-beveiligingskenmerk toe te voegen. Ik weet nog steeds niet zeker of dit alles oplost, maar het is geen moeite om het uit te voeren. In Flask doen we dat gewoon:

    SESSION_COOKIE_SECURE = True

Als u Flask-Login gebruikt en de 'onthoud mij' functionaliteit, voeg dan ook toe:

    REMEMBER_COOKIE_SECURE = True
    REMEMBER_COOKIE_HTTPONLY = True

Een ander (onoplosbaar) veiligheidsprobleem: wachtwoorden in het geheugen

Er is nog een ander beveiligingsprobleem wanneer u een site op een VPS (Virtual Private Server) draait. Wachtwoorden worden via https verstuurd, maar worden gedecodeerd op de server. Vervolgens worden ze met behulp van goede praktijken gecodeerd en opgeslagen in de database.

Zelfs als de server is gepatcht om kwetsbaarheden zoals Zombieload te elimineren, kan een persoon die toegang heeft tot de server het geheugen van de server controleren en de onversleutelde wachtwoorden zien. U kunt het wachtwoord op de client versleutelen met behulp van javascript, maar dan kan de aanvaller nog steeds deze versleutelde waarde gebruiken om in te loggen. Het minimum dat u kunt doen is een betrouwbare VPS-aanbieder krijgen.

Samenvatting

Zonder penetratietesten hoop je gewoon op het beste. Penetration testing is een zeer goede manier om de kwetsbaarheden van uw site te controleren. Het is niet erg moeilijk maar kost wat / veel tijd. Vergeet niet dat het runnen van een site op een VPS nooit volledig veilig is.

Links / credits

40 Best Penetration Testing (Pen Testing) Tools in 2020
https://www.guru99.com/top-5-penetration-testing-tools.html

Cookie Security for Flask Applications
https://blog.miguelgrinberg.com/post/cookie-security-for-flask-applications

Dareboost
https://www.dareboost.com/en

Data Structures
https://werkzeug.palletsprojects.com/en/0.15.x/datastructures/

HTTP Security Headers Analysis of Top One Million Websites
https://ccdcoe.org/uploads/2018/10/Art-18-HTTP-Security-Headers-Analysis-of-Top-One-Million-Websites.pdf

Mozilla Observatory
https://observatory.mozilla.org/

Penetration test
https://en.wikipedia.org/wiki/Penetration_test

Pentest-Tools.com
https://pentest-tools.com

Secure your Cookies (Secure and HttpOnly flags)
https://blog.dareboost.com/en/2019/03/secure-cookies-secure-httponly-flags/

Securing Cookies with HttpOnly and secure Flags
https://resources.infosecinstitute.com/securing-cookies-httponly-secure-flags/

Security Headers
https://securityheaders.com/

ZombieLoad attack lets hackers steal data from Intel chips
https://www.theverge.com/2019/5/14/18623708/zombieload-attack-intel-processors-speculative-execution

Laat een reactie achter

Reageer anoniem of log in om commentaar te geven.

Opmerkingen

Laat een antwoord achter

Antwoord anoniem of log in om te antwoorden.