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 zh
This commit is contained in:
parent
bb07334554
commit
05048c4490
@ -4,7 +4,7 @@
|
||||
|
||||
## **授权问题**
|
||||
|
||||
应尝试更改账户的电子邮件,并且必须检查确认过程。如果发现确认过程**薄弱**,则应将电子邮件更改为目标受害者的电子邮件并进行确认。
|
||||
应尝试更改账户的电子邮件,并且必须检查确认过程。如果发现确认过程较弱,则应将电子邮件更改为目标受害者的电子邮件并进行确认。
|
||||
|
||||
## **Unicode规范化问题**
|
||||
|
||||
@ -12,12 +12,12 @@
|
||||
2. 应使用Unicode创建一个账户\
|
||||
例如:`vićtim@gmail.com`
|
||||
|
||||
如[**此演讲**](https://www.youtube.com/watch?v=CiIyaZ3x49c)所述,之前的攻击也可以通过滥用第三方身份提供者来实现:
|
||||
正如在[**这个演讲**](https://www.youtube.com/watch?v=CiIyaZ3x49c)中所解释的,之前的攻击也可以通过滥用第三方身份提供者来实现:
|
||||
|
||||
- 在第三方身份提供者中创建一个与受害者相似的电子邮件账户,使用某些Unicode字符(`vićtim@company.com`)。
|
||||
- 第三方提供者不应验证电子邮件
|
||||
- 如果身份提供者验证电子邮件,您可以尝试攻击域名部分,例如:`victim@ćompany.com`,并注册该域名,希望身份提供者生成域名的ascii版本,而受害者平台规范化域名。
|
||||
- 通过此身份提供者在受害者平台登录,受害者平台应规范化Unicode字符并允许您访问受害者账户。
|
||||
- 第三方提供者不应验证电子邮件。
|
||||
- 如果身份提供者验证了电子邮件,您可以尝试攻击域名部分,例如:`victim@ćompany.com`,并注册该域名,希望身份提供者生成域名的ascii版本,而受害者平台规范化域名。
|
||||
- 通过此身份提供者登录受害者平台,受害者平台应规范化Unicode字符并允许您访问受害者账户。
|
||||
|
||||
有关更多详细信息,请参阅关于Unicode规范化的文档:
|
||||
|
||||
@ -27,11 +27,11 @@ unicode-injection/unicode-normalization.md
|
||||
|
||||
## **重用重置令牌**
|
||||
|
||||
如果目标系统允许**重置链接被重用**,应努力使用`gau`、`wayback`或`scan.io`等工具**查找更多重置链接**。
|
||||
如果目标系统允许**重置链接被重用**,应努力**寻找更多重置链接**,使用工具如`gau`、`wayback`或`scan.io`。
|
||||
|
||||
## **预账户接管**
|
||||
|
||||
1. 应使用受害者的电子邮件在平台上注册,并设置密码(应尝试确认,尽管缺乏对受害者电子邮件的访问可能使其不可能)。
|
||||
1. 应使用受害者的电子邮件在平台上注册,并设置密码(应尝试确认,尽管缺乏对受害者电子邮件的访问可能使这变得不可能)。
|
||||
2. 应等待受害者使用OAuth注册并确认账户。
|
||||
3. 希望常规注册将被确认,从而允许访问受害者的账户。
|
||||
|
||||
@ -95,7 +95,7 @@ oauth-to-account-takeover.md
|
||||
1. **代码操控**:将状态代码更改为`200 OK`。
|
||||
2. **代码和主体操控**:
|
||||
- 将状态代码更改为`200 OK`。
|
||||
- 将响应主体修改为`{"success":true}`或空对象`{}`。
|
||||
- 将响应主体修改为`{"success":true}`或一个空对象`{}`。
|
||||
|
||||
这些操控技术在使用JSON进行数据传输和接收的场景中有效。
|
||||
|
||||
@ -103,22 +103,22 @@ oauth-to-account-takeover.md
|
||||
|
||||
来自[此报告](https://dynnyd20.medium.com/one-click-account-take-over-e500929656ea):
|
||||
|
||||
- 攻击者请求将其电子邮件更改为新电子邮件
|
||||
- 攻击者收到确认更改电子邮件的链接
|
||||
- 攻击者将链接发送给受害者以便其点击
|
||||
- 受害者的电子邮件被更改为攻击者指示的电子邮件
|
||||
- 攻击者可以恢复密码并接管账户
|
||||
- 攻击者请求将其电子邮件更改为新的电子邮件。
|
||||
- 攻击者收到确认更改电子邮件的链接。
|
||||
- 攻击者将链接发送给受害者以便其点击。
|
||||
- 受害者的电子邮件被更改为攻击者指示的电子邮件。
|
||||
- 攻击者可以恢复密码并接管账户。
|
||||
|
||||
这也发生在[**此报告**](https://dynnyd20.medium.com/one-click-account-take-over-e500929656ea)中。
|
||||
|
||||
### 绕过电子邮件验证以进行账户接管
|
||||
- 攻击者使用attacker@test.com登录并在注册时验证电子邮件。
|
||||
- 攻击者将已验证的电子邮件更改为victim@test.com(更改电子邮件时没有二次验证)
|
||||
- 攻击者将已验证的电子邮件更改为victim@test.com(更改电子邮件时没有二次验证)。
|
||||
- 现在网站允许victim@test.com登录,我们已绕过受害者用户的电子邮件验证。
|
||||
|
||||
### 旧Cookies
|
||||
|
||||
如[**在此帖子中**](https://medium.com/@niraj1mahajan/uncovering-the-hidden-vulnerability-how-i-found-an-authentication-bypass-on-shopifys-exchange-cc2729ea31a9)所述,可以登录到一个账户,保存cookies作为已验证用户,注销,然后再次登录。\
|
||||
正如[**在这篇文章中**](https://medium.com/@niraj1mahajan/uncovering-the-hidden-vulnerability-how-i-found-an-authentication-bypass-on-shopifys-exchange-cc2729ea31a9)所解释的,可以登录到一个账户,保存cookies作为已验证用户,注销,然后再次登录。\
|
||||
在新的登录中,尽管可能生成不同的cookies,但旧的cookies又开始工作。
|
||||
|
||||
## 参考文献
|
||||
|
@ -471,16 +471,66 @@ window.search = window.search || {};
|
||||
showResults(true);
|
||||
}
|
||||
|
||||
var branch = lang === "en" ? "master" : lang
|
||||
fetch(`https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.json`)
|
||||
.then(response => response.json())
|
||||
.then(json => init(json))
|
||||
.catch(error => { // Try to load searchindex.js if fetch failed
|
||||
var script = document.createElement('script');
|
||||
script.src = `https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/refs/heads/${branch}/searchindex.js`;
|
||||
script.onload = () => init(window.search);
|
||||
document.head.appendChild(script);
|
||||
});
|
||||
(async function loadSearchIndex(lang = window.lang || 'en') {
|
||||
/* ───────── paths ───────── */
|
||||
const branch = lang === 'en' ? 'master' : lang;
|
||||
const baseRemote = `https://raw.githubusercontent.com/HackTricks-wiki/hacktricks/${branch}`;
|
||||
const remoteJson = `${baseRemote}/searchindex.json`;
|
||||
const remoteJs = `${baseRemote}/searchindex.js`;
|
||||
const localJson = './searchindex.json';
|
||||
const localJs = './searchindex.js';
|
||||
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
|
||||
search.hasFocus = hasFocus;
|
||||
|
Loading…
x
Reference in New Issue
Block a user