Web Application Penetration Testing Guide
Summary
This White paper shows some of basic techniques and
attacks for web apps, these techniques should be part of
every Penetration Test.
0
Table of contents
1
Introducción
2
Reconnaissance
3
Content Discovery
Cuando hablamos de descubrimiento de contenido no siempre hablamos del
contenido que está a la vista de cualquier usuario, hacemos referencial a contenido
como imágenes, videos, respaldos, ese contenido que no debería estar expuesto a
todo público.
Entre lo más destacado podemos obtener contenido de forma manual, automatizada y a
través de técnicas de OSINT.
Descubrimiento manual
[Link]
El archivo [Link] es un archivo que especifica a los motores de búsqueda qué páginas
pueden y no pueden mostrar en los resultados de su motor o bien pueden restringir el que
un motor de búsqueda rastree por completo el sitio.
La lista de directorios puede servir para que un atacante obtenga rutas a contenido oculto
o restringido, como son archivos de configuración, respaldos, etc.
4
[Link]
[Link] es un archivo que proporciona una lista de todas las rutas y archivos que el
administrador del sitio desea incluir en un motor de búsqueda. A veces, estos pueden
contener áreas del sitio web en las que es un poco más difícil navegar o incluso enumerar
algunas páginas web antiguas que el sitio actual ya no usa pero que aún se encuentran en
función.
OSINT (Google Dorks)
Existen recursos públicos disponibles que ayudan a la recolección de información de un
sitio web. A estos recursos se les llama OSINT. Google es una herramienta de búsqueda
más popular sin embargo existe una técnica llamada “Google Dorking” la cual consiste en
búsquedas avanzadas de recursos, puede por ejemplo buscar cierto texto en un sitio en
específico.
Podemos por ejemplo buscar archivos de configuración expuestos como configuraciones
de base de datos.
Para mayor información, consultar: [Link]
5
Wapalyzer
Wapalyzer es una extensión para navegadores la cual permite identificar las tecnologías
utilizadas por un sitio web, desde lenguajes de programación, librerías, frameworks, de igual
forma permite identificar las versiones utilizadas de estos.
6
Descubrimiento automatizado
Las pruebas automatizadas permiten realizar con mayor rapidez el análisis de
descubrimiento, muchos se basan en listas creadas con nombres de archivos o directorios
más comunes, estas listas contienen miles de registros y la herramienta lanza una petición
HTTP por cada elemento en la lista comprobando el status de respuesta para verificar su
existencia.
Dirb
Gobuster
El propósito de estas herramientas es verificar que se encuentren directorios o archivos con
información sensible o que sea útil para las pruebas de penetración
Ejemplo en el siguiente archivo se encontró la ruta /log el cual contiene información del
sistema.
7
Consultando la url obtenida, la página revela información sensible que facilita al atacante el
reconocimiento y preparar un ataque.
Nmap Script http-enum
Enumera directorios utilizados por aplicaciones y servidores web populares.
8
Detecting WAF
Antes de realizar las pruebas siguientes es importante validar si el sitio al que realizaremos
las pruebas cuenta con seguridad perimetral como un Web Application Firewal (WAF), ya
que esto podría bloquearnos o hacer que nos detecten.
WafW00f
Una de las herramientas más populares para detectar waf es WafW00f, basta con pasar
como parámetro la url y este podrá validar la tecnología y muchas veces hasta el fabricante.
Esto incluso ayudará a que en el caso de existir WAF poder utilizar payloads para hacer
bypass, ejemplo existen las siguientes listas, las cuales contiene algunas pruebas de XSS
para hacer bypass a Imperva, akamai, incapsula, entre otros.
[Link]
9
Vulnerability
Scanning
10
Es la ejecución de pruebas de seguridad automatizadas las cuales validan desde campos
de entrada hasta vulnerabilidades reportadas (CVE)
El objetivo es detectar desde una etapa temprana vulnerabilidades en la aplicación y reducir
el esfuerzo que se realiza cuando se ejecutan pruebas manuales.
OWASP ZAP
La herramienta de escaneo de vulnerabilidades de OWASP, ejecuta pruebas basadas en
el TOP 10 de OWASP, cuenta con 2 tipos de escaneos, automatizados y manual.
Además, cuenta con un proxy para poder interceptar peticiones y respuestas.
ZAP es una de las herramientas más comunes sin embargo existen otras con las que de
igual forma pueden realizarse escaneos:
• Tenable Nessus
• Nikto
• Acunetix
11
Hunting
Vulnerabilities
12
Como pentester hay una serie de vulnerabilidades con las que se debería empezar a
trabajar, haciendo pruebas y tratando de encontrarlas, muchas de ellas son las que se
encuentran en el TOP 10 de OWASP, pero de igual forma podemos basarnos en el TOP
25 de Mitre, según sea el giro de la aplicación se pueden probar ciertas vulnerabilidades.
Evadir autenticación
A continuación, se muestran algunos métodos para evadir la autenticación de un sitio web.
Enumeración de nombres de usuarios
Muchas veces las aplicaciones contienen fallas en los mensajes de respuesta ya que
involuntariamente el programador agrega mensajes como “el nombre de usuario es correcto
pero la contraseña es incorrecta” o al intentar registrar un usuario “El usuario ya existe”,
esto permite obtener nombres de usuarios válidos y armar una lista para poder utilizarla con
otro tipo de ataque como ataques de diccionarios.
Una herramienta que puede ser de utilidad para realizar la enumeración de usuarios en ffuf,
validando el mensaje que devuelve la aplicación al intentar iniciar sesión.
Fuerza bruta
Un ataque de fuerza bruta es un ataque automatizado el cual prueba una lista de
contraseñas contra un usuario o una lista de usuarios.
En este caso con la lista anterior se procede a probar las contraseñas. Para ello de igual
forma se utiliza ffuf sin embargo una de las herramientas más recomendadas para este tipo
de ataques es Hydra.
Con ffuf se pretende obtener el usuario y contraseña que devuelvan un status de respuesta
200.
13
Fallas lógicas
Muchas ocasiones se presentan fallas lógicas en las aplicaciones, esto quiere decir que un
atacante puede modificar el flujo lógico que una aplicación debería seguir para cumplir
exitosamente un proceso, en este caso se enfoca en el proceso de autenticación.
Una falla lógica para romper el inicio de sesión es el “Juggling”, esta vulnerabilidad sucede
cuando se emplea una comparación flexible (== o !=) en lugar de una comparación estricta
(=== o !==) en un área donde el atacante puede controlar una de las variables que se
comparan. Esta vulnerabilidad puede hacer que la aplicación devuelva una respuesta no
intencionada a la declaración verdadera o falsa, y puede dar lugar a graves errores de
autorización y/o autenticación.
Digamos que la aplicación valida el inicio de sesión de la siguiente forma:
Solo se necesitaría obtener un valor true para poder iniciar sesión, siendo que como usuario
se puede controlar la variable password, el ataque sería de la siguiente forma:
El 0 en comparación con la cadena devuelve una respuesta verdadera. A continuación,
algunos métodos de cómo se puede provocar una respuesta verdadera o exitosa.
14
Manipulación de cookies
El realizar un análisis de cookies puede ser de gran ayuda ya que muchas veces el
desarrollador maneja cookies de sesión simples y predecibles, esto permitirá como atacante
construir su valor y obtener acceso.
En el siguiente ejemplo se muestra que la sesión con un valor verdadero o falso y basta
con modificar el valor de la cookie para evadir el proceso de inicio de sesión.
Otras veces puede solo tener un poco más de complejidad como que el valor este
codificado. Este ejemplo esta codificado en base64.
Y su valor en texto claro es {"id":1,"admin":false}
15
Vulnerable Inputs
Una de las actividades que no deben faltar es validar todo tipos de campos de entrada, no
solo los de texto si no también los select, radio y aquellos donde se pueda subir archivos.
Esto nos puede ayudar a provocar errores, modificar la aplicación o dar paso a otro tipo de
vulnerabilidades como inyección (sql, comandos, xss).
Validando Inputs
El modificar el valor de los select o bien del radio es una de las pruebas que muchas
veces se omite y esta nos puede revelar información en errores o permitirnos otro tipo de
ataques de inyección, incluso llegar a sabotear la aplicación.
En el siguiente ejemplo se solicita el género en un select.
Se modifica el valor de hombre ingresando una etiqueta script.
16
Inyección SQL
El punto en el que una aplicación web que usa SQL puede convertirse en inyección SQL
es cuando los datos proporcionados por el usuario se incluyen en la consulta SQL.
A continuación, se presentan algunas técnicas para detectar inyección SQL en sitios web.
InBand
Este tipo de inyección es el más sencillo, se puede validar de diferentes formas y el
resultado se ve reflejado en el mismo sitio, es decir la información expuesta se muestra al
usuario. En los campos de entrada se inserta cualquiera de las siguientes cadenas.
Blind Basado en Tiempo
A diferencia del SQLi InBand en el SQLi Blind se muestra nada o poca información como
para confirmar si nuestras consultas inyectadas fueron, de hecho, exitosas o no, esto se
debe a que los mensajes de error se han deshabilitado, pero la inyección aún funciona a
pesar de todo.
En este caso una consulta correcta se basa en el tiempo que tarda en completarse la
consulta. Este retraso de tiempo se introduce mediante el uso de métodos como
SLEEP(Segundos). El método SLEEP() solo se ejecutará si se agrega una consulta UNION
SELECT exitosa.
Existe una gran variedad de payloads que pueden ejecutarse de acuerdo al gestor de base
de datos y tipo de inyección, los anteriores solo han sido unos ejemplos, si se desean
consultar más se pueden revisar en el siguiente repositorio.
[Link]
17
SQLMap
Si bien realizar la prueba para distintos campos con distintos payloads puede ser pesado,
existen herramientas automatizadas como SQLMap que ejecutan este tipo de pruebas con
mayor velocidad esta herramienta también nos permite extraer información de la base de
datos incluso descifrar usuarios y contraseñas.
Como se muestra en la imagen anterior SQLMap detecta el tipo de inyección existente,
enumera la versión y el tipo de gestor de base de datos, proporciona los payloads con los
que se logró vulnerar y puede extraer información de la base de datos.
18
Inyección noSQL
19
Cross-Site Scripting (XSS)
El Cross-Site Scripting o XSS es un ataque de inyección, en el cual un atacante inyecta
JavaScript malicioso en una aplicación web con la intención de que otros usuarios lo
ejecuten. Hay 2 tipos de XSS más populares los cuales son reflejado y almacenado.
XSS reflejado
Este tipo de XSS sucede cuando datos proporcionados por el usuario en una solicitud HTTP
se incluyen en la fuente de la página web sin ninguna validación, este payload solo se
ejecutará una vez.
Un payload sencillo de prueba es solo mostrar una alerta, ejemplo en el siguiente campo
de texto de búsqueda no se validan los campos de entrada.
El resultado será que el navegador ejecutará el script mostrando la siguiente alerta.
20
XSS almacenado
A diferencia del XSS reflejado, este tipo de XSS se almacena en la base de datos y se
refleja en el navegador cada que se consulta el valor, por lo cual es persistente y se
ejecutara en cada sección del sitio donde se use ese valor.
En este ejemplo se inserta una alerta en el parámetro de mensaje, este se almacena en la
base de datos.
Una vez el usuario consulte la página se ejecuta la alerta.
Aquí se muestra que el navegador está interpretando el script como parte de la estructura
del HTML
21
Uploading vulnerabilities
En una aplicación podemos encontrarnos con inputs para cargar archivos, como atacante
esta es una buena oportunidad parar probar distintas vulnerabilidades e identificar
problemas, desde problemas menores como el mal funcionamiento de la aplicación hasta
la ejecución remota de comandos (RCE) y así hacerse por completo del servidor.
Sobrescribir archivos existentes
Cuando los archivos se cargan en el servidor, se deben realizar una serie de
comprobaciones para asegurarse de que el archivo no sobrescriba nada que ya exista en
el servidor.
En el siguiente ejemplo se muestra un formulario con una imagen de fondo, analizando el
html obtenemos su ruta y nombre.
Se procede a subir una imagen con el mismo nombre
22
El resultado es que la imagen de fondo de sobrescribió con la que subimos.
Ejecución Remota de comandos (RCE)
Sobrescribir imágenes es divertido para el atacante y molesto para el administrador, pero
la ejecución remota de comandos es una vulnerabilidad muy grave, a continuación, se
presenta como a través de subir archivos se puede llegar al servidor.
Se tiene un formulario donde se pueden subir archivos, en este caso la aplicación de prueba
está desarrollada en PHP.
23
Vamos a crear una webshell en php y subir el archivo.
Una vez creada se procede a subir, en este caso haciendo un poco de reconocimiento se
encontró la url /resources en la cual se encuentra la webShell que subimos, damos clic en
ella y nos abrirá el formulario para poder ejecutar comandos.
24
Se ejecutó un comando de consulta al archivo /etc/passwd
Bypass filtros de lado del cliente
Algunos desarrolladores implementan validaciones solo en frontend
25
Magic numbers
26