Vor kurzem habe ich eine Flask Webanwendung in Python geschrieben. Als ich diese Online stellt, habe ich natürlich einmal Nikto drübergejagt. Da mir prombt wieder die üblichen Verdächtigen entgegen prasselten, wollte ich zur Selbsterinnerung und ggf. zu Eurer Unterstützung die Lösung für dieser Schwachstellen zusammen Schreiben.

Schwachstellen

Welche Schwachstellen begegnen uns denn immer wieder? Während meines Dayjobs stoße ich immer wieder auf diese Meldungen:

nikto -host https://beispiel_webservice.de
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    beispiel_webservice.de
+ Target Port:        443
---------------------------------------------------------------------------
+ SSL Info:        Subject:  /CN=beispiel_webservice.de
                   Altnames: beispiel_webservice.de
                   Ciphers:  TLS_AES_256_GCM_SHA384
                   Issuer:   /C=US/O=Let's Encrypt/CN=R3
+ Start Time:         2021-11-24 11:33:57 (GMT1)
---------------------------------------------------------------------------
+ Server: nginx
+ The anti-clickjacking X-Frame-Options header is not present.
+ The X-XSS-Protection header is not defined. This header can hint to the user agent to protect against some forms of XSS
+ The X-Content-Type-Options header is not set. This could allow the user agent to render the content of the site in a different fashion to the MIME type
+ Allowed HTTP Methods: GET, OPTIONS, HEAD 
+ 7499 requests: 0 error(s) and 4 item(s) reported on remote host
+ End Time:           2021-11-24 11:45:27 (GMT1) (690 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested

Anti-Clickjacking X-Frame-Options

Clickjacking ist wenn der Angreifer verschiedene transparente oder undurchsichtige Ebenen verwendet, um einen Benutzer dazu zu verleiten, auf einen Link zu klicken. Diese Links sind in Seiten eingebettet und verweisen auf andere Seiten... vereinfacht ausgedrückt.
Dieser Fehler lässt sich durch Verwendung des X-Frame-Options Headers verbieten bzw. konfigurieren.
Dazu muss lediglich der Header gesetzt werden:

X-Frame-Options: DENY  #Es wird vollständig verweigert, in einen Frame/iframe geladen zu werden.
X-Frame-Options: SAMEORIGIN #Erlaubt nur, wenn die Seite, die geladen werden soll, den gleichen Ursprung hat.
X-Frame-Options: ALLOW-FROM URL #Es erlaubt einer bestimmten URL, sich selbst in einem Iframe zu laden. Bitte beachten Sie jedoch, dass nicht alle Browser dies unterstützen.

Im nginx wird der Header in der Configfile viaadd_header X-Frame-Options "DENY"; und im Apache via Header set X-Frame-Options: "SAMEORIGIN" hinzugefügt.

X-XSS-Protection header

Der X-XSS Protection Header schützt die Webseite vor potentiellen Cross-Site Scripting. In modernen Browsern ist dieser Header allerdings bereits deprecated und kann zu Clientproblemen führen. Dennoch ist es empfohlen X-XSS-Protection auf 0 zu setzen.

Im nginx wird der Header in der Configfile viaadd_header X-XSS-Protection "0; mode=block"; und im Apache via Header set X-XSS-Protection "0; mode=block" hinzugefügt.

HTTP methods

die unterschiedlichen HTTP Methoden GET, POST, HEAD und so weiter, können ebenfalls genutzt werden um Schabernack und Unfug auf den Webseiten auszuführen. Natürlich lässt sich darüber auch schadhafter Code auf einem Webserver unterbringen.

Deshalb sollte man prüfen, welche Methoden wirklich gebraucht werden und die unnötigen Methoden können darüber verboten werden.

Im nginx würde man hierfür folgenden Code in der Serversection unterbringen

add_header Allow "GET, POST, HEAD" always;
if ( $request_method !~ ^(GET|POST|HEAD)$ ) {
    return 405;
}

Bitte achtet darauf, nur die Methoden zu verbieten, die Ihr nicht anbieten wollt.

X-Content-Type-Option

Der Header X-Content-Type-Option in HTTP-Antworten wird vom Server dazu benutzt, um anzuzeigen, dass MIME-Typen, so wie sie in den Content-Type (en-US)-Headern angegeben sind, nicht geändert und somit befolgt werden sollen. Damit lässt sich MIME type sniffing ausschließen. Oder anders gesagt: es zeigt, dass die Web-Admins wissen, was sie tun.

Im nginx wird der Header in der Configfile viaadd_header X-Content-Type-Options "nosniff"; und im Apache via Header set X-Content-Type-Options "nosniff" hinzugefügt.

Schlusswort

Damit sollte der nächste Scan besser aussehen:

nikto -host https://beispiel_webservice.de
- Nikto v2.1.6
---------------------------------------------------------------------------
+ Target IP:          127.0.0.1
+ Target Hostname:    beispiel_webservice.de
+ Target Port:        443
---------------------------------------------------------------------------
+ SSL Info:        Subject:  /CN=beispiel_webservice.de
                   Altnames: beispiel_webservice.de
                   Ciphers:  TLS_AES_256_GCM_SHA384
                   Issuer:   /C=US/O=Let's Encrypt/CN=R3
+ Start Time:         2021-11-24 12:49:25 (GMT1)
---------------------------------------------------------------------------
+ Server: nginx
+ X-XSS-Protection header has been set to disable XSS Protection. There is unlikely to be a good reason for this.
+ Allowed HTTP Methods: GET 
+ 7499 requests: 0 error(s) and 4 item(s) reported on remote host
+ End Time:           2021-11-24 13:00:53 (GMT1) (688 seconds)
---------------------------------------------------------------------------
+ 1 host(s) tested