mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
Translated ['src/pentesting-web/account-takeover.md'] to ko
This commit is contained in:
parent
df7edfdc2a
commit
4b36dea5e9
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
## **권한 문제**
|
## **권한 문제**
|
||||||
|
|
||||||
계정의 이메일을 변경하려고 시도해야 하며, 확인 과정은 **검토되어야 합니다**. 만약 **약한** 것으로 발견되면, 이메일을 의도된 피해자의 이메일로 변경한 후 확인해야 합니다.
|
계정의 이메일을 변경하려고 시도해야 하며, 확인 프로세스는 **검토되어야 합니다**. 만약 **약한** 것으로 발견되면, 이메일을 의도된 피해자의 이메일로 변경하고 확인해야 합니다.
|
||||||
|
|
||||||
## **유니코드 정규화 문제**
|
## **유니코드 정규화 문제**
|
||||||
|
|
||||||
@ -12,12 +12,12 @@
|
|||||||
2. 유니코드를 사용하여 계정을 생성해야 합니다\
|
2. 유니코드를 사용하여 계정을 생성해야 합니다\
|
||||||
예: `vićtim@gmail.com`
|
예: `vićtim@gmail.com`
|
||||||
|
|
||||||
[**이 강의**](https://www.youtube.com/watch?v=CiIyaZ3x49c)에서 설명된 바와 같이, 이전 공격은 제3자 신원 제공자를 악용하여 수행될 수 있습니다:
|
[**이 강연**](https://www.youtube.com/watch?v=CiIyaZ3x49c)에서 설명된 바와 같이, 이전 공격은 제3자 신원 제공자를 악용하여 수행될 수 있습니다:
|
||||||
|
|
||||||
- 피해자와 유사한 이메일을 가진 제3자 신원에서 계정을 생성합니다 (예: `vićtim@company.com`).
|
- 피해자와 유사한 이메일을 가진 제3자 신원에서 계정을 생성합니다 (`vićtim@company.com`).
|
||||||
- 제3자 제공자가 이메일을 확인하지 않아야 합니다.
|
- 제3자 제공자가 이메일을 확인하지 않아야 합니다.
|
||||||
- 만약 신원 제공자가 이메일을 확인한다면, 도메인 부분을 공격할 수 있습니다: `victim@ćompany.com`과 같은 도메인을 등록하고, 신원 제공자가 도메인의 아스키 버전을 생성할 것이라고 기대합니다. 피해자 플랫폼은 도메인 이름을 정규화합니다.
|
- 만약 신원 제공자가 이메일을 확인한다면, 도메인 부분을 공격할 수 있습니다: `victim@ćompany.com`으로 도메인을 등록하고, 신원 제공자가 도메인의 아스키 버전을 생성할 것이라고 기대합니다.
|
||||||
- 이 신원 제공자를 통해 피해자 플랫폼에 로그인하면, 유니코드 문자가 정규화되어 피해자 계정에 접근할 수 있습니다.
|
- 피해자 플랫폼에서 이 신원 제공자를 통해 로그인하여 유니코드 문자를 정규화하고 피해자 계정에 접근할 수 있습니다.
|
||||||
|
|
||||||
자세한 내용은 유니코드 정규화 문서를 참조하십시오:
|
자세한 내용은 유니코드 정규화 문서를 참조하십시오:
|
||||||
|
|
||||||
@ -31,7 +31,7 @@ unicode-injection/unicode-normalization.md
|
|||||||
|
|
||||||
## **계정 탈취 전 단계**
|
## **계정 탈취 전 단계**
|
||||||
|
|
||||||
1. 피해자의 이메일을 사용하여 플랫폼에 가입하고 비밀번호를 설정해야 합니다 (확인 시도를 해야 하지만, 피해자의 이메일에 접근할 수 없으면 불가능할 수 있습니다).
|
1. 피해자의 이메일을 사용하여 플랫폼에 가입하고 비밀번호를 설정해야 합니다 (확인을 시도해야 하지만, 피해자의 이메일에 접근할 수 없으면 불가능할 수 있습니다).
|
||||||
2. 피해자가 OAuth를 사용하여 가입하고 계정을 확인할 때까지 기다려야 합니다.
|
2. 피해자가 OAuth를 사용하여 가입하고 계정을 확인할 때까지 기다려야 합니다.
|
||||||
3. 일반 가입이 확인되기를 바라며, 피해자의 계정에 접근할 수 있습니다.
|
3. 일반 가입이 확인되기를 바라며, 피해자의 계정에 접근할 수 있습니다.
|
||||||
|
|
||||||
@ -53,7 +53,7 @@ csrf-cross-site-request-forgery.md
|
|||||||
|
|
||||||
## **XSS를 통한 계정 탈취**
|
## **XSS를 통한 계정 탈취**
|
||||||
|
|
||||||
애플리케이션에서 XSS를 발견하면, 쿠키, 로컬 스토리지 또는 웹 페이지의 정보를 훔쳐서 계정을 탈취할 수 있습니다:
|
애플리케이션에서 XSS를 발견하면, 쿠키, 로컬 스토리지 또는 웹 페이지의 정보를 훔쳐 계정을 탈취할 수 있습니다:
|
||||||
|
|
||||||
{{#ref}}
|
{{#ref}}
|
||||||
xss-cross-site-scripting/
|
xss-cross-site-scripting/
|
||||||
@ -75,7 +75,7 @@ reset-password.md
|
|||||||
|
|
||||||
## **응답 조작**
|
## **응답 조작**
|
||||||
|
|
||||||
인증 응답을 **단순한 불리언으로 줄일 수 있다면, false를 true로 변경해 보십시오**. 접근할 수 있는지 확인하십시오.
|
인증 응답을 **단순한 불리언으로 줄일 수 있다면, false를 true로 변경해 보십시오** 그리고 접근할 수 있는지 확인하십시오.
|
||||||
|
|
||||||
## OAuth를 통한 계정 탈취
|
## OAuth를 통한 계정 탈취
|
||||||
|
|
||||||
@ -114,12 +114,12 @@ oauth-to-account-takeover.md
|
|||||||
### 계정 탈취를 위한 이메일 확인 우회
|
### 계정 탈취를 위한 이메일 확인 우회
|
||||||
- 공격자가 attacker@test.com으로 로그인하고 가입 시 이메일을 확인합니다.
|
- 공격자가 attacker@test.com으로 로그인하고 가입 시 이메일을 확인합니다.
|
||||||
- 공격자가 확인된 이메일을 victim@test.com으로 변경합니다 (이메일 변경에 대한 추가 확인 없음).
|
- 공격자가 확인된 이메일을 victim@test.com으로 변경합니다 (이메일 변경에 대한 추가 확인 없음).
|
||||||
- 이제 웹사이트는 victim@test.com으로 로그인할 수 있도록 허용하며, 피해자 사용자의 이메일 확인을 우회했습니다.
|
- 이제 웹사이트가 victim@test.com으로 로그인할 수 있도록 허용하며, 피해자 사용자의 이메일 확인을 우회했습니다.
|
||||||
|
|
||||||
### 오래된 쿠키
|
### 오래된 쿠키
|
||||||
|
|
||||||
[**이 게시물**](https://medium.com/@niraj1mahajan/uncovering-the-hidden-vulnerability-how-i-found-an-authentication-bypass-on-shopifys-exchange-cc2729ea31a9)에서 설명된 바와 같이, 계정에 로그인하고 인증된 사용자로서 쿠키를 저장한 후 로그아웃하고 다시 로그인할 수 있었습니다.\
|
[**이 게시물**](https://medium.com/@niraj1mahajan/uncovering-the-hidden-vulnerability-how-i-found-an-authentication-bypass-on-shopifys-exchange-cc2729ea31a9)에서 설명된 바와 같이, 계정에 로그인하고 인증된 사용자로서 쿠키를 저장한 후 로그아웃하고 다시 로그인할 수 있었습니다.\
|
||||||
새로운 로그인으로 인해 다른 쿠키가 생성되더라도, 이전 쿠키가 다시 작동하게 되었습니다.
|
새로운 로그인으로 인해 다른 쿠키가 생성되더라도 이전 쿠키가 다시 작동하게 되었습니다.
|
||||||
|
|
||||||
## 참고 문헌
|
## 참고 문헌
|
||||||
|
|
||||||
|
@ -471,16 +471,66 @@ window.search = window.search || {};
|
|||||||
showResults(true);
|
showResults(true);
|
||||||
}
|
}
|
||||||
|
|
||||||
var branch = lang === "en" ? "master" : lang
|
(async function loadSearchIndex(lang = window.lang || 'en') {
|
||||||
fetch(`https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.json`)
|
/* ───────── paths ───────── */
|
||||||
.then(response => response.json())
|
const branch = lang === 'en' ? 'master' : lang;
|
||||||
.then(json => init(json))
|
const baseRemote = `https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/${branch}`;
|
||||||
.catch(error => { // Try to load searchindex.js if fetch failed
|
const remoteJson = `${baseRemote}/searchindex.json`;
|
||||||
var script = document.createElement('script');
|
const remoteJs = `${baseRemote}/searchindex.js`;
|
||||||
script.src = `https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.js`;
|
const localJson = './searchindex.json';
|
||||||
script.onload = () => init(window.search);
|
const localJs = './searchindex.js';
|
||||||
document.head.appendChild(script);
|
const TIMEOUT_MS = 5_000;
|
||||||
});
|
|
||||||
|
/* ───────── helpers ───────── */
|
||||||
|
const fetchWithTimeout = (url, opt = {}) =>
|
||||||
|
Promise.race([
|
||||||
|
fetch(url, opt),
|
||||||
|
new Promise((_, r) => setTimeout(() => r(new Error('timeout')), TIMEOUT_MS))
|
||||||
|
]);
|
||||||
|
|
||||||
|
const loadScript = src =>
|
||||||
|
new Promise((resolve, reject) => {
|
||||||
|
const s = document.createElement('script');
|
||||||
|
s.src = src;
|
||||||
|
s.onload = resolve;
|
||||||
|
s.onerror = reject;
|
||||||
|
document.head.appendChild(s);
|
||||||
|
});
|
||||||
|
|
||||||
|
/* ───────── 1. remote JSON ───────── */
|
||||||
|
try {
|
||||||
|
const r = await fetchWithTimeout(remoteJson);
|
||||||
|
if (!r.ok) throw new Error(r.status);
|
||||||
|
return init(await r.json());
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('Remote JSON failed →', e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ───────── 2. remote JS ───────── */
|
||||||
|
try {
|
||||||
|
await loadScript(remoteJs);
|
||||||
|
return init(window.search);
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('Remote JS failed →', e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ───────── 3. local JSON ───────── */
|
||||||
|
try {
|
||||||
|
const r = await fetch(localJson);
|
||||||
|
if (!r.ok) throw new Error(r.status);
|
||||||
|
return init(await r.json());
|
||||||
|
} catch (e) {
|
||||||
|
console.warn('Local JSON failed →', e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* ───────── 4. local JS ───────── */
|
||||||
|
try {
|
||||||
|
await loadScript(localJs);
|
||||||
|
return init(window.search);
|
||||||
|
} catch (e) {
|
||||||
|
console.error('Local JS failed →', e);
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
|
||||||
// Exported functions
|
// Exported functions
|
||||||
search.hasFocus = hasFocus;
|
search.hasFocus = hasFocus;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user