angle-up arrow-clockwise arrow-counterclockwise arrow-down-up arrow-left at calendar card-list chat check envelope folder house info-circle pencil people person person-plus phone plus question-circle search tag trash x

OWASP Zed Attack Proxy (ZAP) test de sécurité

13 janvier 2020 à côté de Peter
Dans Security

Lorsque vous êtes un développeur de sites web, vous pouvez obtenir des vulnérabilités de la manière la plus simple en utilisant l'application OWASP Zed Attack Proxy (ZAP).

post main image
https://unsplash.com/@ostshem

C'est l'heure de la joie ou de la crise : exécuter l'application OWASP Zed Attack Proxy (ZAP) pour vérifier les vulnérabilités de notre application web. Les développeurs savent souvent qu'il y a des points faibles dans leur code, mais il y a toujours une date de livraison. Alors pourquoi ne pas utiliser un outil qui répertorie les plus connus et les plus importants ? C'est la première fois que j'utilise ZAP, donc si vous êtes un expert, vous feriez mieux d'arrêter de lire ici. Dans les liens ci-dessous, vous trouverez des informations sur l'installation et l'exécution, même si vous êtes connecté. Sur mon système Ubuntu 18.04 l'installation a été un jeu d'enfant, il suffit de télécharger, dans le terminal allez dans le répertoire de téléchargement et tapez

./zap.sh

Je ne l'ai pas exécuté sur mon site de production mais sur la même machine où tourne la version de développement de mon site web. Pour l'exécuter une fois connecté, vous devez aller dans " Manual Explore ", saisir l'URL du site Web local, puis cliquer sur le bouton " Launch Browser ". Ceci démarre une nouvelle fenêtre de navigateur avec votre site web avec des boutons ZAP sur le côté gauche et le côté droit. Connectez-vous comme d'habitude et cliquez sur (Spider) Start pour lancer une exécution. Le bouton de connexion de mon site était un peu en dessous des boutons de gauche, j'ai dû changer la largeur de l'écran pour le repositionner et accéder au bouton.

Alertes signalées par le ZAP

Vous trouverez ci-dessous quelques alertes que le ZAP a signalées. Tous les textes des blocs ci-dessous proviennent de l'application ZAP. Je ne montre que quelques lignes mais dans de nombreux cas, il y a beaucoup plus d'informations. "Après enquête" signifie la plupart du temps que je :

  • Cliquez sur l'onglet Alertes
  • Sélectionnez une ligne avec le problème
  • Cliquez sur l'onglet Demande et regardez la demande
  • Cliquez sur l'onglet Réponse et regardez la réponse

Path Traversal

Rapporté par le ZAP :

Alert priority: High
Path Traversal
Evidence: etc
Description: 
The  Path Traversal  attack technique allows an attacker access to files, directories, and commands that potentially reside outside the web document root directory. 
An attacker may manipulate a URL in such a way that the web site will execute or reveal the contents of arbitrary files anywhere on the web server. 
Any device that exposes an HTTP-based interface is potentially vulnerable to  Path Traversal.
...

Après enquête :

Bien que cela nécessite beaucoup plus de recherches, il est apparu que le processeur du sélecteur de thèmes ne vérifiait pas si le thème demandé se trouvait dans les thèmes disponibles. Fixe. En outre, après avoir examiné les réponses plus en détail, j'ai remarqué que j'avais une phrase dans un billet de blog contenant le mot " etc ". Cela a été souligné dans la réponse. C'est à propos des attaques sur /etc de c:\etc. Pas de problème.

Absence of Anti-CSRF Tokens

Rapporté par le ZAP :

Alert priority: Low
Absence of Anti-CSRF Tokens
Evidence: <form name="search" action="/en/blog/posts/search" method="post">
Description: No Anti-CSRF tokens were found in a  HTML  submission form.
A cross-site request forgery is an attack that involves forcing a victim to send an HTTP request to a target destination without their knowledge or intent in order to perform an action as the victim. 
The underlying cause is application functionality using predictable URL/form actions in a repeatable way. 
The nature of the attack is that CSRF exploits the trust that a web site has for a user. 
...

Après enquête :

Les formulaires de recherche n'utilisaient pas correctement la méthode POST. J'ai changé la méthode en GET et bien sûr la méthode Flask n'accepte que la méthode GET.

Private IP Disclosure

Rapporté par le ZAP :

Alert priority: Low
Private IP Disclosure
Evidence: 192.168.0.0
Description: A private IP (such as 10.x.x.x, 172.x.x.x, 192.168.x.x) or an Amazon EC2 private hostname (for example, ip-10-0-56-78) 
has been found in the HTTP response body. This information might be helpful for further attacks targeting internal systems.
...

Après enquête :

Le message provient du texte d'un billet de blog où j'ai mentionné cette adresse IP. Pas de problème.

Format String Error

Rapporté par le ZAP :

Alert priority: Medium
Format String Error
Parameter: lc
Attack: ZAP %1!s%2!s%3!s%4!s%5!s%6!s%7!s%8!s%9!s%10!s%11!s%12!s%13!s%14!s%15!s%16!s%17!s%18!s%19!s%20!s%21!n%22!n%23!n%24!n%25!n%26!n%27!n%28!n%29!n%30!n%31!n%32!n%33!n%34!n%35!n%36!n%37!n%38!n%39!n%40!n
Description: A Format String error occurs when the submitted data of an input string is evaluated as a command by the application. 
...

Après enquête :

La réponse montrait une erreur de 500 avec le texte : sqlalchemy.exc.DataError : (pymysql.err.DataError) (1406, &quot;Données trop longues pour la colonne 'request_url' à la ligne 1&quot ;) Dans ce cas, c'était l'objet PageRequest SQLAlchemy où je stocke toutes les requêtes entrantes. J'espérais, je m'attendais à ce que des valeurs trop longues soient automatiquement tronquées, mais c'était une fausse hypothèse ! Peut-être que cela peut aussi se produire ailleurs dans le programme. J'ai changé cela pour cet objet de toute façon en obtenant la longueur de la colonne et en tronquant la valeur avant de l'insérer.

Buffer Overflow

Rapporté par le ZAP :

Alert priority: Medium
Buffer Overflow
Parameter: lc
Attack: GET http://127.0.0.1:8000/en/auth/register?lc=aofyVsiquNyUZJJWRvcyMtmOKToYwtFlLIjVPAnQbvLMSuvapNZbePEuuZUgyEVHmcDklTcXYhZDCGFNtEFpbiJaafhHTrJobQWgcGKHjrYuDDaYbddfJxoemFoxRtesJrGieOviBIdFHhoYngoGNKaowenBuwavrUdOAfKElNWLoGHVTTsQDUTRgZMYKUTAOQJuNqQqBNkjuuMgAxqCQKvEvSvHviRyXrFRylXFjQuDeRosheUMCjjEFZRLMFpmRcYsjYZKPaALNOBvjLMcYJtoUIxGCKqYBSPwRTilwkaxxPmCekriFLVOkVtpVlSMWvtgHdrnjuAEesIuwfWyByZQjJKblYBXbRBHoHjCJKssKKdynuuGTnGlCMrRQHUnTcgbOPhCoTgIAcyDxBerlYELKJlCiIEbAnkFbtgCqnBKaUsHglhcVcyjqFnXtUEAKoHDSXMHhTJmXFvmYBxvEFITqJQgaWOsHIutVZYDiuRBSMwOXQYlmTenZHXPnchCHTfxtvsqlgZQZYmyNKYXRETmBRKyHKTbgoJGtVFaMCOPkvQAGasEylqdVEutnJiHSIBhovlKfMbPpctsMTsukniTThWTFqLJLS
Description: Buffer overflow errors are characterized by the overwriting of memory spaces of the background web process, which should have never been modified intentionally or unintentionally. Overwriting values of the IP (Instruction Pointer), BP (Base Pointer) and other registers causes exceptions, segmentation faults, and other process errors to occur. Usually these errors end execution of the application in an unexpected way.  
...

Après enquête :

Encore une fois, la réponse a montré une erreur de 500 avec le texte : sqlalchemy.exc.DataError : (pymysql.err.DataError) (1406, &quot;Données trop longues pour la colonne 'request_url' à la ligne 1&quot ;) Et encore une fois c'était l'objet PageRequest SQLAlchemy où je stocke toutes les requêtes entrantes. Même solution.

Application Error Disclosure

Rapporté par le ZAP :

Alert priority: Low
Application Error Disclosure
Url: http://127.0.0.1:8000/run
Evidence: HTTP/1.0 500 INTERNAL SERVER ERROR (KeyError: 'babel' // Werkzeug Debugger)
Description: 
This page contains an error/warning message that may disclose sensitive information like the location of the file that produced the unhandled exception. This information can be used to launch further attacks against the web application. The alert could be a false positive if the error message is found inside a documentation page.
...

Après enquête :

L'url a été découverte par ZAP à cause de l'en-tête Content-Security-Policy-Report-Only contenant le (csp) report-uri. L'url /run ne fait pas partie de l'application visible. Je viens d'utiliser les gestionnaires d'erreurs de l'application qui appellent Babel pour les traductions. Cela a changé en ajoutant des pages d'erreur de base en une seule langue pour l'application sur l'url /run.

X-Content-Type-Options Header Missing

Rapporté par le ZAP :

Alert priority: Low
X-Content-Type-Options Header Missing
Url: http://127.0.0.1:8000/run/raw?__debugger__=yes&cmd=resource&f=console.png
Parameter: X-Content-Type-Options
Description: 
The Anti-MIME-Sniffing header X-Content-Type-Options was not set to 'nosniff'. This allows older versions of Internet Explorer and Chrome to perform MIME-sniffing on the response body, potentially causing the response body to be interpreted and displayed as a content type other than the declared content type. 
...

Après enquête :

Une image inexistante a été retournée. J'ai ajouté security headers, en excluant bien sûr l'en-tête CSP, à la réponse. J'ai également ajouté des pages d'erreur HTTP de base. Le navigateur affiche une image inexistante. Bien.

Application Error Disclosure

Rapporté par le ZAP :

Alert priority: Low
Application Error Disclosure
Url: http://127.0.0.1:8000/admin/static/
Evidence: HTTP/1.0 500 INTERNAL SERVER ERROR
Description: 
This page contains an error/warning message that may disclose sensitive information like the location of the file that produced the unhandled exception. This information can be used to launch further attacks against the web application. The alert could be a false positive if the error message is found inside a documentation page.
...

Après enquête :

Cela ne se produit qu'en mode de développement (local) Flask . En production, tous les postes statiques sont servis par Nginx. Pas de problème... Je pense.

Résumé

Un outil comme le OWASP Zed Attack Proxy (ZAP) permet même à un noob comme moi de trouver des vulnérabilités de la manière la plus simple. Je peux recommander cet outil à tous les développeurs. Et parce qu'il essaie d'attaquer votre site sur toutes les urls disponibles, il est aussi extrêmement utile pour trouver d'autres problèmes comme les pages manquantes et les violations de CSP.

Liens / crédits

Getting Started with ZAP and the OWASP Top 10: Common Questions
https://www.denimgroup.com/resources/blog/2019/09/getting-started-questions/

How can ZAP automatically authenticate via forms?
https://github.com/zaproxy/zaproxy/wiki/FAQformauth

OWASP ZAP for Dummies
https://devonblog.com/security/owasp-zap-for-dummies/

proxy settings for localhost not obeyed unless network.proxy.allow_hijacking_localhost is set
https://bugzilla.mozilla.org/show_bug.cgi?id=1535581

Running Penetration Tests for your Website as a Simple Developer with OWASP ZAP
https://medium.com/volosoft/running-penetration-tests-for-your-website-as-a-simple-developer-with-owasp-zap-493d6a7e182b

The Open Web Application Security Project (OWASP)
https://www.owasp.org

The OWASP Zed Attack Proxy (ZAP)
https://www.owasp.org/index.php/OWASP_Zed_Attack_Proxy_Project

En savoir plus...:
Security testing

Laissez un commentaire

Commentez anonymement ou connectez-vous pour commenter.

Commentaires

Laissez une réponse

Répondez de manière anonyme ou connectez-vous pour répondre.