Si estás iniciando de la nada y esta guía está entre tus primeros pasos dentro del mundo del hacking, será muy importante que sepas cómo funciona Internet. Debes saber cómo es mapeada la URL que escribes en la barra de direcciones hacia un dominio de Internet, la cual es convertida a una dirección IP. Internet es una multiplicidad de sistemas que están conectados entre sí.
¿Te gustaría enterarte de cuando lanzamos descuentos al Máximo o Nuevos Cursos?
Algunos aceptan ciertos tipos de mensajes y permiten mensajes de otro conjunto limitado de sistemas, cada sistema en Internet recibe una dirección de tal forma que las personas puedan enviarles mensajes. Entonces, queda a discreción de cada sistema determinar qué hacer con el mensaje que reciba y como va a responder.
Para definir la estructura de esos mensajes, se han documentado cómo esos sistemas deben comunicarse. Para ello han creado los RFC (Request for Comments – Solicitudes de Comentarios) Por ejemplo, HTTP define el protocolo que seguirá tu navegador para comunicarse con un Servidor web.
Estructura de mensajes
Es debido a que tu navegador y el Servidor web han acordado como implementar el mismo protocolo, y de esta forma ellos estarán en la disponibilidad de comunicarse entre sí. Cuando escribes https://achirou.com en la barra de dirección de tu navegador y das Enter, los siguientes pasos describen lo que sucede de manera entendible:
• Tu navegador extrae el nombre de dominio de la URL, www.achirou.com
• Tu equipo envía una solicitud DNS a los equipos que tiene configurados como Servidores DNS. El Servidor DNS ayuda a convertir de un nombre de dominio a una dirección IP, para este caso, lo convierte a la dirección 191.96.144.80. Consejo: Puedes usar el comando dig A www.achirou.com desde tu terminal de línea de comandos para buscar la dirección IP de un nombre de dominio.
• Tu computadora intenta establecer una conexión TCP con la dirección IP a través del puerto 80, el cual es utilizado por el tráfico de HTTP. Consejo: Puedes establecer una conexión TCP ejecutando el comando nc 191.96.144.80 80 desde tu terminal.
• La conexión ha sido exitosa, tu navegador enviará una solicitud HTTP como esta:
GET / HTTP/1.1
Host: www.achirou.com
Connection: keep-alive
Accept: application/html, */*
Ahora, el navegador esperará una respuesta por parte del Servidor, en esa respuesta se verá algo como esto:
HTTP/1.1 200 OK
Content-Type: text/html
<html>
<head>
<title>achirou.com</title>
</head>
<body>
...
</body>
</html>
Tu navegador analizará y mostrará el HTML, CSS, y JavaScript que fue devuelto. En este caso, la página inicial de Google.com se mostrará en tu pantalla.
Existe un acuerdo de qué forma esos mensajes serán enviados, incluyendo los métodos utilizados y la petición de un Host en su respectivo espacio de petición de la cabecera para todas las solicitudes HTTP/1.1
Los métodos: GET, HEAD, POST, PUT, DELETE, TRACE, CONNECT y OPTIONS.
Método HTTP: GET
Es uno de los métodos HTTP, este realiza una petición a un recurso específico. No permite el envió de datos a excepción si dichos datos se envían como parámetro en la Url que realiza la petición. Esta petición retorna tanto la cabecera como el contenido. Ahora, este método GET puede retornar una respuesta en formato HTML, JSON, XML, Imágenes o JavaScript.
Semánticamente se utiliza para consultar información como una SELECT a la base de datos, se puede filtrar datos empleando los datos enviados por la Url. Por otro lado, violando la semántica; los datos enviados por la Url se pueden usar para otros fines como una inserción, actualización y eliminación de un registro. Si se compara con las sentencias SQL es similar a un SELECT.
Formato de URL sin datos
Formato de URL con datos
www.misitioweb/index.html?nombre=alvaro&apellido=chirou
En este caso se envía los datos de nombre y apellido donde los claves son nombre y apellido y, valores alvaro y chirou respectivamente.
Formato envió datos por Formulario
También se usa el método GET en un formulario como se muestra a continuación:
<form action="www.misitioweb/index.html" method="get"> Nombre: <input type="text" name="nombre"><br> Apellido: <input type="text" name="apellido"><br> <input type="submit" value="Enviar"> </form>
Respuesta HTTP
200 | Ok (Respuesta Positiva) |
400 | Bad Request |
404 | No Found |
Características
Petición con cuerpo | No |
Respuesta válida con cuerpo | Si |
Seguro | Si |
Idempotente | Si |
Cacheable | Si |
Permitido en HTML forms | Si |
Método HTTP: POST
Este puede enviar datos al servidor por medio del cuerpo (body) y nada por la Url como se emplea en el método GET. El tipo de cuerpo de solicitud se define en la cabecera Content-Type. Semánticamente se utiliza para registrar información, similar al INSERT de datos a nivel de base de datos. A pesar de eso se puede forzar este método de petición HTTP para otras acciones como actualización, eliminación de registro, como carga de archivos, etc.
También, se emplea para acciones que no tienen relación con el registro de información se debe considerar que el método POST no es Idempotente, es decir cada petición realiza un cambio diferente en el recurso del servidor web. El POST usa enviando los datos por formularios, formato JSON entre otros. Si se compara con las sentencias SQL es similar a un INSERT.
Formato envió datos por Formulario
Por otro lado, se puede enviar usar el método POST en un formulario como se muestra a continuación:
<form action="www.misitioweb/index.html" method="post"> Nombre: <input type="text" name="nombre"><br> Apellido: <input type="text" name="apellido"><br> <input type="submit" value="Enviar"> </form>
Formato JSON
Url: www.misitioweb/index.html
Cuerpo:[{ “nombre”: “alvaro”, “apellido”: “chirou” }]
Respuesta HTTP
200 | Ok (Respuesta Positiva) |
201 | Creado |
400 | Bad Request |
404 | No Found |
Características
Petición con cuerpo | Si |
Respuesta válida con cuerpo | Si |
Seguro | No |
Idempotente | No |
Cacheable | Solo si incluye nueva información |
Permitido en HTML forms | Si |
Método HTTP: PUT
Es similar al método de petición POST, solo que el método PUT es idempotente; es decir puede ser ejecutado varias veces y tiene el mismo efecto, caso contrario a un POST que cada vez que se ejecuta realiza la agregación de un nuevo objeto, ya que semánticamente es como una inserción de un nuevo registro. Semánticamente el método HTTP PUT se utiliza para la actualización de información existente, es semejante a un UPDATE de datos a nivel de base de datos. Los requests de un PUT usualmente se envían los datos por formularios, formato JSON entre otros. Si se compara con las sentencias SQL es similar a un UPDATE.
Respuesta HTTP
200 | Ok (Respuesta Positiva) |
201 | Creado |
204 | No Responde, Si el servidor no devuelve ningún contenido |
400 | Bad Request |
404 | No Found |
Características
Petición con cuerpo | Si |
Respuesta con cuerpo | No |
Seguro | No |
Idempotente | Si |
Cacheable | No |
Permitido en HTML forms | No |
Método HTTP: DELETE
Este método de petición permite eliminar un recurso específico. También es idempotente; es decir puede ser ejecutado varias veces y tiene el mismo efecto similar al PUT y GET. Semánticamente se utiliza para eliminar de información existente, es semejante a un DELETE de datos a nivel de base de datos.
Respuesta HTTP
200 | Elimina correctamente con body |
202 | La acción fue realizado correctamente, pero no se ha promulgado |
204 | Responde sin body |
Características
Petición con cuerpo | Tal vez |
Respuesta con cuerpo | Tal vez |
Seguro | No |
Idempotente | Si |
Cacheable | No |
Permitido en HTML forms | No |
Método HTTP: PATCH
Este método se emplea para modificaciones parciales de un recurso en particular. Se debe revisar si el servidor es compatible con peticiones PATCH. Para averiguar si el servidor aceptar peticiones PATCH notifica su compatibilidad en el header Allow o Access-Control-Allow-Methods, otra indicación de que estas peticiones están permitidas son el header Accept-Patch. Semánticamente es similar al PUT, pues actualiza una parte de un registro. Es decir realiza una especie de UPDATE a nivel de base de datos.
Respuesta HTTP
200 | Respuesta exitosa con body |
204 | Responde exitosa sin body |
Características
Petición con cuerpo | Si |
Respuesta con cuerpo | Si |
Seguro | No |
Idempotente | No |
Cacheable | No |
Permitido en HTML forms | No |
Método HTTP: HEAD
Este método de petición es similar al método HTTP GET, sin embargo no retorna ningún contenido HTTP Response. Cuando se trabaja con este método de petición no se está interesado en el contenido, solo en el código de HTTP de Respuesta y el encabezado (Headers). Este método se puede emplear en casos particulares.
Por ejemplo, se tiene un sitio web con varios enlaces web y se requiere verificar si hay “enlaces rotos”; entonces se realiza la petición a todos los enlaces correspondientes y verifica el estado de dichos enlaces. Pues no es importante el contenido de los mencionados enlaces sino el comprobar el estado de dichos enlaces. También se puede comprobar si un archivo existe, entre otros casos donde es importante código de Respuesta HTTP y no se requiere ningún contenido (HTML, JSON, XML, Imágenes, JavaScript, etc).
Respuesta HTTP
200 | Ok (Respuesta Positiva) |
400 | Bad Request |
404 | No Found |
Características
Petición con cuerpo | No |
Respuesta con cuerpo | No |
Seguro | Si |
Idempotente | Si |
Cacheable | Si |
Permitido en HTML forms | No |
Método HTTP: OPTIONS
Es uno de los métodos HTTP. Este método se utiliza para comprobar que opciones de comunicación posee el recurso de destino. Es más utilizado con CORS (Cross-Origin Resource Sharing), para revisar si el servidor acepta peticiones de diferentes orígenes.
Características
Petición con cuerpo | No |
Respuesta con cuerpo | Si |
Seguro | Si |
Idempotente | Si |
Cacheable | No |
Permitido en HTML forms | No |
TRACE
refleja de regreso el mensaje de solicitud a quien lo solicitó. Esto le permite al solicitante ver qué es lo que está siendo recibido por el Servidor y utilizar esa información para propósitos de prueba y diagnóstico.
CONNECT
Está reservado para usarlo con un proxy (un proxy básicamente es un Servidor el cual encamina solicitudes a otros Servidores)
Inyección HTML
La inyección HTML (HyperText Markup Language – Lenguaje de Marcado de Hipertexto) es una técnica en la que los atacantes insertan código HTML malicioso en un sitio web para alterar su estructura o contenido. Los ataques de inyección HTML suelen tener como objetivo páginas que permiten la entrada de datos, como formularios de comentarios o cajas de búsqueda.
Este ataque es posible por un sitio que permite que un usuario mal intencionado inyecte marcas HTML dentro de sus páginas web, y esto es porque no maneja apropiadamente las entradas de datos del usuario. Una vulnerabilidad de inyección HTML es causada por recibir etiquetas HTML, típicamente por la vía de un formulario de entrada, cuyo contenido es renderizado de forma literal dentro de la página. Esto es totalmente aparte de inyectar código Javascript, VBscript, etc.
Los datos que se envían durante este tipo de ataque de inyección pueden ser muy diferentes. Pueden ser algunas etiquetas HTML, que solo mostrarán la información enviada. Además, puede ser todo el formulario o la página falsos. Cuando ocurre este ataque, el navegador generalmente interpreta los datos del usuario malicioso como legítimos y los muestra.
Cambiar la apariencia de un sitio web no es el único riesgo que conlleva este tipo de ataque. Es bastante similar al ataque XSS, donde el atacante roba las identidades de otras personas. Por lo tanto, el robo de la identidad de otra persona también puede ocurrir durante este ataque de inyección.
Debido a que HTML es el lenguaje utilizado para definir la estructura de una página web, si un atacante puede inyectar marcas HTML podrá cambiar lo que se mostrará en el navegador. Algunas veces esto puede resultar en un cambio de apariencia total de la página, o en otros casos, la creación de formularios para engañar a los usuarios.
Si pudieras inyectar HTML, y estuvieras habilitado para agregar una etiqueta <form> en esa página para preguntarle a un usuario que reingrese el nombre con que se registra y su contraseña al enviar ese formulario, lo que realmente se estaría haciendo es enviar la información a un atacante. Los ciberdelincuentes explotan vulnerabilidades en la validación de datos para insertar código no autorizado. Aquí hay un ejemplo simple:
<!-- Ejemplo de un campo de entrada vulnerable --><inputtype="text"name="nombre"value="[aquí va el código malicioso]">
Si el sitio web no filtra adecuadamente la entrada del usuario, un atacante podría introducir código malicioso en el campo ‘nombre’, afectando así la estructura de la página.
Ejemplos
Si en una web se está decodificando valores URI que estaban codificados cuando renderizaba el texto. Los caracteres en una URI pueden ser ya sea reservados o no reservados. Los caracteres reservados son los que a veces tienen un significado especial, tal como / y &. Los caracteres no reservados son aquellos que no tienen un significado en especial como las letras.
Cuando un caracter está codificado en la URI, éste es convertido a su valor de byte en ASCII (American Standard Code for Information Interchange —Código Estándar estadounidense para el Intercambio de Información), y está precedido con el signo de porcentaje (%). Entonces, / se convierte en %2F, & se convierte en %26. ASCII es un tipo de codificación que era el más común en Internet hasta que llegó UTF-8, el cual es otro tipo de codificación.
Ejemplo de texto sin codificar
Hola mundo, !"#$%&/()=
Ejemplo de texto codificado
Hola%20mundo%2C%20%21%22%23%24%25%26%2F%28%29%3D
Si el usuario hubiera enviado caracteres codificados por URL el sitio vulnerable podría decodificarlos y renderizar la salida con las letras correspondientes. Ya con esto, un hacker puede haber enviado un formulario HTML con los campos respectivos para solicitar nombre de usuario y contraseña que serán enviados a un sitio malicioso y capturar las credenciales (mientras que las personas asumían que llenaban un formulario de la empresa)
Tipos de inyección HTML
Este ataque de inyección se puede realizar con dos propósitos diferentes:
- Cambiar la apariencia del sitio web mostrado.
- Robar la identidad de otra persona.
Además, este ataque de inyección se puede realizar a través de diferentes partes del sitio web, es decir, campos de entrada de datos y el enlace del sitio web. Sin embargo, los principales tipos son: Inyección de HTML almacenado e Inyección de HTML reflejado
# 1) Inyección de HTML almacenado:
El ataque de inyección almacenada ocurre cuando el código HTML malicioso se guarda en el servidor web y se ejecuta cada vez que el usuario llama a una función adecuada. Sin embargo, en el caso del ataque por inyección reflejado, el código HTML malicioso no se almacena permanentemente en el servidor web. La inyección reflejada ocurre cuando el sitio web responde inmediatamente a la entrada maliciosa.
# 2) Inyección de HTML reflejado:
Esto se puede dividir nuevamente en más tipos:
- GET reflejado
- POST reflejado
- URL reflejada
El ataque de inyección reflejada se puede realizar de manera diferente según los métodos HTTP, es decir, GET y POST. Para saber qué método se utiliza para los elementos adecuados del sitio web, podemos verificar la fuente de la página. Por ejemplo ,un evaluador puede verificar el código fuente del formulario de inicio de sesión y encontrar qué método se está utilizando para ello. Luego, se puede seleccionar el método de inyección HTML apropiado en consecuencia.
Inyección GET reflejada
Ocurre, cuando nuestra entrada se muestra (refleja) en el sitio web. Supongamos que tenemos una página simple con un formulario de búsqueda, que es vulnerable a este ataque. Luego, si escribiéramos cualquier código HTML, aparecerá en nuestro sitio web y, al mismo tiempo, se inyectará en el documento HTML. Por ejemplo, ingresamos texto simple con etiquetas HTML:
Inyección de HTML POST reflejada
Es un poco más difícil. Ocurre cuando se envía un código HTML malicioso en lugar de los parámetros correctos del método POST. Por ejemplo , tenemos un formulario de inicio de sesión, que es vulnerable al ataque HTML. Los datos ingresados en el formulario de inicio de sesión se envían con el método POST. Luego, si escribimos cualquier código HTML en lugar de los parámetros correctos, se enviará con el método POST y se mostrará en el sitio web.
Para realizar un ataque de HTML POST reflejado, se recomienda utilizar un complemento de navegador, que falsificará los datos enviados. Uno de ellos es el complemento de Mozilla Firefox ‘Tamper Data’. El complemento se hace cargo de los datos enviados y permite al usuario cambiarlos. Luego, los datos modificados se envían y se muestran en el sitio web.
Si se muestra un código HTML que se está guardando en alguna parte, el evaluador puede estar seguro de que este ataque de inyección es posible. Entonces se puede probar un código más complicado, por Ejemplo , para mostrar el formulario de inicio de sesión falso. Otra solución es un escáner de inyección HTML. Escanear automáticamente contra este ataque puede ahorrarte mucho tiempo. No hay muchas herramientas para las pruebas de inyección de HTML en comparación con otros ataques.
Detección de Inyección HTML
Al seleccionar una herramienta de escaneo, debemos prestar atención a cómo analiza los resultados y si es lo suficientemente precisa o no. Debe tenerse en cuenta que las pruebas manuales no deben olvidarse. De esta manera podemos estar seguros de qué entradas exactas se prueban y qué resultados exactos estamos obteniendo. Además, de esta manera también es más fácil analizar los resultados.
De mi experiencia recomiendo que para ambas formas de prueba debemos tener un buen conocimiento de este tipo de inyección. De lo contrario, sería difícil seleccionar una herramienta de automatización adecuada y analizar sus resultados. Además, siempre se recomienda no olvidarse de probar manualmente, ya que solo nos hace estar más seguros de la calidad.
Cuando te encuentres evaluando un sitio, revisa cómo maneja los diferentes tipos de entrada, incluyendo texto plano y texto codificado. Verifica que acepten valores codificados por URI y que muestren valores como %2F además de mostrar por pantalla sus valores decodificados, para este caso /. Un magnífico codificador es https://www.urlencoder.org/es/.
La inyección HTML presenta una vulnerabilidad para los sitios y los desarrolladores porque esta puede ser utilizada para desviar a los usuarios a que envíen información sensible o que visiten sitios web maliciosos o mal intencionados. Conocido de otra manera como ataques de phishing. Para descubrir estas vulnerabilidades no siempre se trata de enviar HTML plano sino de explorar como un sitio podría estar renderizando el texto que hayas ingresado, así como los caracteres codificados en la URI.
El contenido engañoso es parecido en que éste se introduce en algún tipo de entrada que es reflejado nuevamente en la página HTML que obtiene la víctima. Los hackers siempre deberían estar examinando la oportunidad de manipular los parámetros de una URL y que estos sean renderizados en el sitio
Cómo Prevenir la Inyección HTML
La principal de este ataque es la falta de atención y desconocimiento del desarrollador. Este tipo de ataque de inyección ocurre cuando la entrada y la salida no se validan correctamente. Por lo tanto, la regla principal para evitar un ataque HTML es la validación de datos adecuada. Cada entrada debe comprobarse si contiene algún código de secuencia de comandos o código HTML. Por lo general, se comprueba si el código contiene algún script especial o corchetes HTML. Hay muchas funciones para comprobar si el código contiene corchetes especiales. La selección de la función de verificación depende del lenguaje de programación que esté utilizando.
Hacer un pentest también es parte de la prevención. Como el ataque de inyección de HTML es muy raro, hay menos literatura para aprender sobre él y menos escáner para seleccionar para las pruebas automáticas. Esta parte de las pruebas de seguridad realmente no debe perderse, ya que nunca se sabe cuándo puede suceder. Tanto el desarrollador como el evaluador deben tener un buen conocimiento de cómo se realiza este ataque. Un buen conocimiento de este proceso de ataque puede ayudar a prevenirlo.
Recomendaciones para Prevenir la Inyección HTML
- Validación de Entrada: Filtra y valida exhaustivamente la entrada del usuario. Utiliza listas blancas para permitir solo ciertos caracteres y evita los caracteres especiales que podrían ser utilizados en un ataque.
- Parámetros de Consulta Seguros: Si estás utilizando parámetros de consulta en URLs, asegúrate de que estos sean seguros. No confíes únicamente en la información proporcionada por el usuario.
- Uso de Parámetros Predefinidos: Cuando sea posible, utiliza parámetros predefinidos en lugar de entrada del usuario. Esto reduce las posibilidades de manipulación maliciosa.
- Codificación de Salida: Al mostrar datos del usuario, utiliza la codificación adecuada para evitar que el navegador interprete el contenido como código. Por ejemplo, en HTML, utiliza htmlspecialchars en PHP.
- Actualizaciones Regulares: Mantén tu software y bibliotecas actualizadas. Los desarrolladores suelen lanzar parches de seguridad que corrigen posibles vulnerabilidades.
- Seguridad en la Capa del Servidor: Implementa firewalls de aplicaciones web (WAF) y soluciones de seguridad en la capa del servidor para detectar y bloquear intentos de inyección.
- Pentesting: Realiza pruebas regulares de penetración para identificar posibles vulnerabilidades. Contratar a profesionales de seguridad para realizar auditorías también es una buena práctica.
Riesgo de una inyeccion HTML
En comparación con los otros posibles ataques, este ataque definitivamente no se considerará tan riesgoso como puede ser Inyección SQL o Ataque de inyección de JavaScript o incluso XSS. No destruirá toda la base de datos ni robará todos los datos de la base de datos. Sin embargo, el propósito principal de este tipo de inyección es cambiar la apariencia del sitio web mostrado con fines maliciosos, mostrando la información o los datos enviados al usuario final. Estos riesgos pueden considerarse menos importantes.
Cambiar la apariencia del sitio web puede costar la reputación de su empresa. Si un usuario malintencionado destruye la apariencia de su sitio web, puede cambiar las opiniones del visitante sobre su empresa. Cabe recordar que otro riesgo que conlleva este ataque al sitio web es el robo de la identidad de otro usuario.
Con HTML Injection, el atacante puede inyectar toda la página, que se mostrará al usuario final. Luego, si el usuario final indicará sus datos de inicio de sesión en la página de inicio de sesión falsa, se enviará al usuario malintencionado. Este caso es, por supuesto, la parte más riesgosa de este ataque.
Para el robo de datos de otros usuarios, este tipo de ataque se selecciona con menos frecuencia, ya que existen muchos otros posibles ataques. Sin embargo, es muy similar al ataque XSS, que roba las cookies del usuario y las identidades de otros usuarios. También hay ataques XSS, que se basan en HTML. Por lo tanto, las pruebas contra ataques XSS y HTML pueden ser muy similares y realizarse juntas.
Conclusión
Como HTML Injection no es tan popular, puede considerarse menos riesgoso que otros ataques. Por lo tanto, a veces se omiten las pruebas contra este tipo de inyección. Es notable que definitivamente hay menos literatura e información sobre la inyección de HTML. Por lo tanto, los evaluadores pueden decidir no realizar este tipo de pruebas. Sin embargo, en este caso, es posible que los riesgos de ataque HTML no se evalúen lo suficiente.
Como hemos analizado en este tutorial, con este tipo de Inyección se puede destruir todo el diseño de su sitio web o incluso se pueden robar los datos de inicio de sesión del usuario. Por lo tanto, es muy recomendable incluir la inyección de HTML en las pruebas de seguridad e invertir buenos conocimientos.
La prevención de la inyección HTML es esencial para salvaguardar la integridad y seguridad de tu sitio web. Adoptar prácticas de desarrollo seguras, validar rigurosamente la entrada del usuario y mantenerse informado sobre las últimas amenazas son pasos críticos en este proceso. Al fortalecer las defensas de tu sitio web, contribuyes a crear un entorno en línea más seguro para todos.
Pentesting Web. Prácticas de un Ethical Hacker Profesional
Dada la importancia del pentesting en la seguridad empresarial, la formación en ciberseguridad y hacking ético se vuelve esencial. Si deseas aprender sobre Pentesting Web puedes tomar nuestro curso: Aprende Pentesting Web, Hacking Ético y Ciberseguridad. Practicas reales y aprender todo sobre Vulnerar entornos Web.
Obtén un perfil completo y altamente demandado por las empresas, mejorando así tu carrera profesional en un sector que busca constantemente profesionales cualificados. ¡Descubre cómo puede impulsar tu futuro en ciberseguridad y hacking ético!