diff --git a/src/pentesting-web/account-takeover.md b/src/pentesting-web/account-takeover.md index 72550fb0a..134f168e7 100644 --- a/src/pentesting-web/account-takeover.md +++ b/src/pentesting-web/account-takeover.md @@ -4,7 +4,7 @@ ## **認証の問題** -アカウントのメールアドレスを変更しようとし、確認プロセスを**確認する必要があります**。もし**弱い**と判明した場合、メールアドレスを意図した被害者のものに変更し、確認します。 +アカウントのメールアドレスを変更しようとし、確認プロセスを**確認する必要があります**。もし**弱い**と判断された場合、メールアドレスを意図した被害者のものに変更し、その後確認します。 ## **Unicode正規化の問題** @@ -14,10 +14,10 @@ [**このトーク**](https://www.youtube.com/watch?v=CiIyaZ3x49c)で説明されているように、前述の攻撃はサードパーティのアイデンティティプロバイダーを悪用して行うこともできます: -- 被害者に似たメールアドレスを持つサードパーティのアイデンティティでアカウントを作成し、いくつかのUnicode文字を使用します(`vićtim@company.com`)。 +- 被害者に似たメールアドレスを持つサードパーティのアイデンティティでアカウントを作成します(例: `vićtim@company.com`)。 - サードパーティのプロバイダーはメールを確認しないべきです。 -- アイデンティティプロバイダーがメールを確認する場合、ドメイン部分を攻撃することができるかもしれません:`victim@ćompany.com`としてそのドメインを登録し、アイデンティティプロバイダーがドメインのASCIIバージョンを生成し、被害者プラットフォームがドメイン名を正規化することを期待します。 -- このアイデンティティプロバイダーを介して被害者プラットフォームにログインし、Unicode文字を正規化し、被害者アカウントにアクセスできるようにします。 +- もしアイデンティティプロバイダーがメールを確認する場合、ドメイン部分を攻撃することができるかもしれません。例えば: `victim@ćompany.com`としてそのドメインを登録し、アイデンティティプロバイダーがドメインのasciiバージョンを生成することを期待します。 +- このアイデンティティプロバイダーを通じて被害者のプラットフォームにログインし、Unicode文字を正規化して被害者のアカウントにアクセスできるようにします。 詳細については、Unicode正規化に関する文書を参照してください: @@ -29,15 +29,15 @@ unicode-injection/unicode-normalization.md ターゲットシステムが**リセットリンクの再利用を許可する**場合、`gau`、`wayback`、または`scan.io`などのツールを使用して**さらに多くのリセットリンクを見つける**努力をする必要があります。 -## **アカウント乗っ取り前** +## **アカウント乗っ取り前の準備** -1. 被害者のメールアドレスを使用してプラットフォームにサインアップし、パスワードを設定する必要があります(確認を試みる必要がありますが、被害者のメールにアクセスできない場合は不可能になるかもしれません)。 -2. 被害者がOAuthを使用してサインアップし、アカウントを確認するまで待つ必要があります。 +1. 被害者のメールアドレスを使用してプラットフォームにサインアップし、パスワードを設定します(確認を試みる必要がありますが、被害者のメールにアクセスできない場合は不可能かもしれません)。 +2. 被害者がOAuthを使用してサインアップし、アカウントを確認するまで待ちます。 3. 通常のサインアップが確認されることを期待し、被害者のアカウントにアクセスできるようにします。 ## **CORSの誤設定によるアカウント乗っ取り** -ページに**CORSの誤設定**が含まれている場合、ユーザーから**機密情報を盗む**ことができ、**アカウントを乗っ取る**か、同じ目的のために認証情報を変更させることができるかもしれません: +ページに**CORSの誤設定**が含まれている場合、ユーザーから**機密情報を盗む**ことができ、**アカウントを乗っ取る**ことができるか、同じ目的のために認証情報を変更させることができるかもしれません: {{#ref}} cors-bypass.md @@ -61,7 +61,7 @@ xss-cross-site-scripting/ ## **同一オリジン + クッキー** -制限されたXSSやサブドメインの乗っ取りが見つかった場合、クッキーを操作(例えば、固定する)して被害者アカウントを危険にさらすことができるかもしれません: +制限されたXSSやサブドメインの乗っ取りが見つかった場合、クッキーを操作(例えば、固定する)して被害者のアカウントを危険にさらすことができるかもしれません: {{#ref}} hacking-with-cookies/ @@ -75,7 +75,7 @@ reset-password.md ## **レスポンス操作** -認証レスポンスを**単純なブール値に減らすことができる場合、falseをtrueに変更して**アクセスできるか確認してください。 +認証レスポンスを**単純なブール値に減らすことができる場合、falseをtrueに変更して**アクセスできるか確認します。 ## OAuthによるアカウント乗っ取り @@ -103,9 +103,9 @@ oauth-to-account-takeover.md [このレポート](https://dynnyd20.medium.com/one-click-account-take-over-e500929656ea)から: -- 攻撃者が新しいメールアドレスに変更を要求します。 -- 攻撃者がメールの変更を確認するためのリンクを受け取ります。 -- 攻撃者が被害者にリンクを送信し、クリックさせます。 +- 攻撃者が新しいメールアドレスに変更をリクエストします。 +- 攻撃者はメールの変更を確認するためのリンクを受け取ります。 +- 攻撃者は被害者にそのリンクを送信し、クリックさせます。 - 被害者のメールアドレスが攻撃者が示したものに変更されます。 - 攻撃者はパスワードを回復し、アカウントを乗っ取ることができます。 diff --git a/theme/ht_searcher.js b/theme/ht_searcher.js index 52e150d9a..e77213e96 100644 --- a/theme/ht_searcher.js +++ b/theme/ht_searcher.js @@ -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;