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

OWASP Zed Attack Proxy (ZAP) pruebas de seguridad

Cuando eres un desarrollador de sitios web puedes obtener vulnerabilidades de la manera más fácil usando la aplicación OWASP Zed Attack Proxy (ZAP).

13 enero 2020
post main image
https://unsplash.com/@ostshem

Tiempo de alegría o crisis: ejecutando la aplicación OWASP Zed Attack Proxy (ZAP) para comprobar las vulnerabilidades de nuestra aplicación web. Los desarrolladores a menudo saben que hay puntos débiles en su código, pero siempre hay una fecha de entrega. Entonces, ¿por qué no utilizar una herramienta que enumere las más conocidas e importantes? Es la primera vez que uso ZAP, así que si eres un experto es mejor que dejes de leer aquí. En los siguientes enlaces hay información sobre cómo instalar y ejecutar, también cuando se está conectado. En mi Ubuntu 18.04 la instalación del sistema fue muy sencilla, sólo tienes que descargarlo, en la terminal ve al directorio de descarga y escribe:

./zap.sh

No lo ejecuté en mi sitio de producción sino en la misma máquina en la que se ejecuta la versión de desarrollo de mi sitio web. Para ejecutarlo cuando hayas iniciado sesión, ve a "Exploración manual", escribe la URL del sitio web local y haz clic en el botón "Iniciar el explorador". Esto inicia una nueva ventana del navegador con su sitio web con botones ZAP a la izquierda y a la derecha. Inicie la sesión como de costumbre y haga clic en (Spider) Start para iniciar una ejecución. El botón de acceso a mi página web estaba un poco debajo de los botones del lado izquierdo, tuve que cambiar el ancho de la pantalla para reposicionar y acceder al botón.

Alertas reportadas por ZAP

A continuación se presentan algunas alertas que ZAP informó. Todos los textos de los bloques siguientes son de la aplicación ZAP. Sólo muestro unas pocas líneas pero en muchos casos hay mucha más información. "Después de la investigación" significa la mayoría de las veces que yo:

  • Haga clic en la pestaña Alertas
  • Seleccione una línea con el problema
  • Haga clic en la pestaña Solicitud y mire la solicitud
  • Haga clic en la pestaña Respuesta y mire la respuesta

Path Traversal

Reportado por 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.
...

Después de la investigación:

Aunque esto necesita mucha más investigación, parece que el procesador de selección de temas no comprueba si el tema solicitado se encuentra entre los temas disponibles. Fijo. También después de mirar la respuesta más detalladamente, noté que tenía una frase en una entrada del blog que contenía la palabra 'etc'. Esto se destacó en la respuesta. Esto es sobre los ataques a /etc de c:\\Netc. No hay problema.

Absence of Anti-CSRF Tokens

Reportado por 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. 
...

Después de la investigación:

Los formularios de búsqueda utilizaban incorrectamente el método POST. Cambié el método a GET y por supuesto el método llamado Flask sólo acepta el método GET.

Private IP Disclosure

Reportado por 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.
...

Después de la investigación:

El mensaje vino del texto de una entrada de blog donde mencioné esta dirección IP. No hay problema.

Format String Error

Reportado por 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. 
...

Después de la investigación:

La respuesta mostró un error de 500 con el texto: sqlalchemy.exc.DataError: (pymysql.err.DataError) (1406, &quot;Datos demasiado largos para la columna 'request_url' en la fila 1&quot;) En este caso fue el objeto PageRequest SQLAlchemy donde almaceno todas las peticiones entrantes. Esperaba, esperando, que los valores demasiado largos se truncaran automáticamente, ¡pero esta era una suposición errónea! Tal vez esto también pueda ocurrir en otras partes del programa. De todos modos, cambié esto para este objeto obteniendo la longitud de la columna y truncando el valor antes de insertarlo.

Buffer Overflow

Reportado por 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.  
...

Después de la investigación:

De nuevo la respuesta mostró un error de 500 con el texto: sqlalchemy.exc.DataError: (pymysql.err.DataError) (1406, &quot;Datos demasiado largos para la columna 'request_url' en la fila 1&quot;) Y de nuevo era el objeto PageRequest SQLAlchemy donde almaceno todas las peticiones entrantes. La misma solución.

Application Error Disclosure

Reportado por 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.
...

Después de la investigación:

La url fue descubierta por ZAP debido al encabezado de Content-Security-Policy-Report-Only que contiene el (csp) report-uri. La url /run no forma parte de la aplicación visible. Acabo de usar los manejadores de error de la aplicación que llaman a Babel para las traducciones. Cambiado esto añadiendo páginas de error básicas de un solo idioma para la aplicación en la url /run.

X-Content-Type-Options Header Missing

Reportado por 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. 
...

Después de la investigación:

Una imagen inexistente fue devuelta. Añadí security headers, por supuesto excluyendo la cabecera CSP, a la respuesta. También he añadido páginas de error HTTP básicas. El navegador muestra una imagen inexistente. Bien.

Application Error Disclosure

Reportado por 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.
...

Después de la investigación:

Esto sólo ocurre en el modo de desarrollo (local) Flask . En la producción, todos los artículos estáticos son servidos por Nginx. No hay problema... Creo que...

Resumen

Una herramienta como la OWASP Zed Attack Proxy (ZAP) permite incluso a un novato como yo encontrar vulnerabilidades de la manera más fácil. Puedo recomendar esta herramienta a todos los desarrolladores. Y como intenta atacar su sitio en todas las urls disponibles, también es extremadamente útil para encontrar otros problemas como páginas perdidas y violaciones de CSP.

Enlaces / créditos

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

Deje un comentario

Comente de forma anónima o inicie sesión para comentar.

Comentarios

Deje una respuesta.

Responda de forma anónima o inicie sesión para responder.