Muestra las diferencias entre dos versiones de la página.
Ambos lados, revisión anteriorRevisión previaPróxima revisión | Revisión previa | ||
app:vemp [2024/09/19 15:31] – thejuanvisu | app:vemp [2024/09/26 15:58] (actual) – thejuanvisu | ||
---|---|---|---|
Línea 64: | Línea 64: | ||
En caso de que nada de esto funcione se puede usar el escapado manual. Generalmente hay librerías que pueden hacer esto de forma automatizada. Las reglas de escapado son un poco diferentes en función de la base de datos que se esté utilizando. | En caso de que nada de esto funcione se puede usar el escapado manual. Generalmente hay librerías que pueden hacer esto de forma automatizada. Las reglas de escapado son un poco diferentes en función de la base de datos que se esté utilizando. | ||
+ | |||
+ | |||
+ | ==== Inyección en ficheros de log ==== | ||
+ | |||
+ | Los ficheros de log se usan para tener trazabilidad de los eventos que ocurran en el sistema, almacenan todos los sucesos que ocurren en un sistema. Ocurre cuando se busca falsificar (Log Forgery) los ficheros de log con entradas falsas o inyectar código javascript en el log, de forma que si la persona que visualiza el log usa alguna herramienta de navegador se pueda producir un ataque | ||
+ | |||
+ | Por ejemplo, este código genera una entrada de log en función al usuario: | ||
+ | <code java> | ||
+ | String val = request.fetParameter(" | ||
+ | try{ | ||
+ | int value = integer.parseInt(val); | ||
+ | }catch(NumberFormatException){ | ||
+ | log.info(" | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | El problema es que si el usuario introduce algo como: | ||
+ | < | ||
+ | twenty-one%0a%0aINFO: | ||
+ | </ | ||
+ | Esto permitiría añadir más cosas al log. correspondiendo los %0a a saltos de línea y lo restante a un mensaje de log. Esto se puede paliar con librerías como log4j que permiten gestionar los mensajes de log enviados desde la aplicación. Tiene un fichero (log4j.xml) que indica que mensajes del log se pasan cuando se consulta el log o clasificar estos mensajes en ficheros diferentes en función al tipo de entrada de log. | ||
+ | |||
+ | ==== Inyección en cabeceras HTTP ==== | ||
+ | Se producen cuando se utilizan entradas de usuario incorrectamente escapadas para añadir cabeceras HTTP de forma dinámica e inesperada. Esto puede dar lugar al HTTP Response Spliting. Esta vulnerabilidad puede ser combinada con inyección en javascript. | ||
+ | Si usáramos por ejemplo al siguiente cookie: | ||
+ | <code java> | ||
+ | String author = request.getParametter(AUTHOR_PARAM); | ||
+ | Cookie cookie = new Cookie(" | ||
+ | cookie.setMaxAge() | ||
+ | </ | ||
+ | Si un usuario malintencionada mandara lo siguiente: | ||
+ | < | ||
+ | author=Wiley Hacker\r\nContent-Length: | ||
+ | </ | ||
+ | Produciría saltos de línea que rompen la petición, insertando contenido malicioso. | ||
+ | |||
+ | Para prevenir este tipo de ataque, si tenemos un grupo de autores pequeños, se podría hacer una lista blanca y en caso de no ser posible, se utilizaría escapados. | ||
+ | ==== Inyección en SMPT ==== | ||
+ | |||
+ | SMTP (Simple Mail Transfer Protocol) es un protocolo para el envío de correos electrónicos. Este tipo de ataque se produce cuando a través de entradas de usuario, un atacante introduce cabeceras adicionales. Se pueden prevenir con listas blancas y escapados, al igual que con las demás vulnerabilidades. | ||
+ | |||
+ | ==== Inyección de comandos del sistema operativo ==== | ||
+ | |||
+ | |||
+ | Es una vulnerabilidad que permite la ejecución arbitraria de comandos en el sistema en el que se ejecuta la aplicación. Un ejemplo de comando de inyección sería el siguiente: | ||
+ | < | ||
+ | ping -c 5 127.0.0.1; rm -rf /opt | ||
+ | </ | ||
+ | Esto solo funciona si no se valida de forma adecuada las entradas. | ||
+ | |||
+ | ==== Inyección LDAP ==== | ||
+ | |||
+ | Se parece a la inyección SQL, se utiliza para afectar al active directory. También permite ejecutar consultas a ciegas (Blind LDAP injection) a través de filtros booleanos. Para prevenir este tipo de ataques se recomienda utilizar un framework de escape y una lista blanca. | ||
+ | |||
+ | ==== Inyección XML y XPath ==== | ||
+ | |||
+ | Similar a las otras inyecciones. Si en los datos de una entrada se añaden caracteres reservados en XML, el resultado puede ser una modificación inesperada del documento. Un ejemplo de inyección sería el siguiente: | ||
+ | <code xml> | ||
+ | < | ||
+ | < | ||
+ | < | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | Para prevenir este tipo de ataques se crean escapados con los siguientes caracteres: | ||
+ | * " = " | ||
+ | * ' = ' | ||
+ | * < = < | ||
+ | * > = &rt; | ||
+ | |||
+ | Las reglas de escapado varían en función a donde se va a añadir el contenido. Para validar documentos XML se suelen usar esquemas (DTD), que es un documento de definición donde se indica como debe ser un documento XML. Esto permite limitar cuantas veces se repite una etiqueta y donde van, pero hay que tener cuidado ya que se pueden invalidar demasiados documentos. | ||
+ | |||
+ | ==== Conclusiones de inyección de código (Examen) ==== | ||
+ | * Hay un componente común a todos los ataques por inyección. Se produce inyección de código cuando los datos de usuario no se validan de la forma adecuada. | ||
+ | * Generalmente varía el lenguaje con el que se intercambian mensajes y los caracteres reservados. | ||
+ | * Si el lenguaje da una forma estándar para prevenir un ataque de inyección se recomienda utilizarlo. | ||
+ | * Se deben usar listas blancas de valores válidos, permitiendo solo ciertos tipos de datos como entrada para prevenir la inyección. Por desgracia no pueden ser usadas siempre. | ||
+ | * En caso de no poderse hacer nada, se recomienda el escapado manual, utilizando de ser posible una librería ya existente. | ||
===== Inyección de JavaScript (XSS) ===== | ===== Inyección de JavaScript (XSS) ===== | ||
+ | Es un tipo de inyección tan importante que se ve por separado. Generalmente hay un cliente y una aplicación web que intercambian información. En el intercambio de datos suele ir código en HTML junto a JavaScript. | ||
+ | Las consecuencias de inyección de javascript pueden ser: | ||
+ | * Sustracción de información | ||
+ | * Sustracción de credenciales | ||
+ | * Secuestro de sesión y suplantación de identidad. | ||
+ | |||
+ | En el caso de Reflected XSS el servidor incluye en la respuesta HTTP el código JS que el atacante ha insertado en algún punto de la petición. A veces se pueden realizar estas inyecciones desde la url: | ||
+ | < | ||
+ | |||
+ | Esto sería un ataque de inyección javascript de tipo 1, conocido como Stored XSS. | ||
+ | |||
+ | Si el código insertado se almacena consistentemente en la base de datos, entonces tenemos un ataque de tipo 2. | ||
+ | El contenido que más se suele inyectar son los scripts, pero también se pueden inyectar iframes. | ||
+ | |||
+ | |||
+ | |||
+ | |||
===== Entidades externas en documentos XML (XEE) ===== | ===== Entidades externas en documentos XML (XEE) ===== | ||
===== Deserialización y carga dinámica | ===== Deserialización y carga dinámica |