diff --git a/src/pentesting-web/account-takeover.md b/src/pentesting-web/account-takeover.md index bba6fafae..74a99a476 100644 --- a/src/pentesting-web/account-takeover.md +++ b/src/pentesting-web/account-takeover.md @@ -16,8 +16,8 @@ Bir hesabın e-posta adresinin değiştirilmesi denenmeli ve onay süreci **ince - Kurbanın e-posta adresine benzer bir e-posta ile üçüncü taraf kimlik sağlayıcısında bir hesap oluşturun, bazı unicode karakterleri kullanarak (`vićtim@company.com`). - Üçüncü taraf sağlayıcı e-postayı doğrulamamalıdır. -- Eğer kimlik sağlayıcı e-postayı doğruluyorsa, belki de `victim@ćompany.com` gibi alan kısmına saldırabilir ve o alanı kaydedip kimlik sağlayıcının alanın ascii versiyonunu oluşturmasını umabilirsiniz, kurban platformu alan adını normalize ederken. -- Bu kimlik sağlayıcı aracılığıyla kurban platformuna giriş yapın, bu platform unicode karakterini normalize etmeli ve kurban hesabına erişmenize izin vermelidir. +- Eğer kimlik sağlayıcı e-postayı doğruluyorsa, belki de alan kısmını saldırıya uğratabilirsiniz: `victim@ćompany.com` ve o alanı kaydedip kimlik sağlayıcının alanın ascii versiyonunu oluşturmasını umabilirsiniz, kurban platformu alan adını normalize ederken. +- Bu kimlik sağlayıcı aracılığıyla kurban platformuna giriş yapın, kimlik sağlayıcı unicode karakterini normalize etmeli ve kurban hesabına erişmenize izin vermelidir. Daha fazla ayrıntı için Unicode Normalizasyonu belgesine bakın: @@ -45,7 +45,7 @@ cors-bypass.md ## **CSRF ile Hesap Ele Geçirme** -Sayfa CSRF'ye karşı savunmasızsa, **kullanıcının şifresini**, e-posta adresini veya kimlik doğrulamasını değiştirmesini sağlayabilir ve böylece erişim sağlayabilirsiniz: +Sayfa CSRF'ye karşı savunmasızsa, **kullanıcının şifresini**, e-posta adresini veya kimlik doğrulamasını değiştirmesini sağlayabilir ve ardından buna erişebilirsiniz: {{#ref}} csrf-cross-site-request-forgery.md @@ -67,7 +67,7 @@ Sınırlı bir XSS veya bir alt alan ele geçirme bulursanız, çerezlerle oynam hacking-with-cookies/ {{#endref}} -## **Şifre Sıfırlama Mekanizmasına Saldırma** +## **Şifre Sıfırlama Mekanizmasına Saldırı** {{#ref}} reset-password.md @@ -75,7 +75,7 @@ reset-password.md ## **Yanıt Manipülasyonu** -Eğer kimlik doğrulama yanıtı **basit bir boolean'a indirgenebiliyorsa, false'u true olarak değiştirmeyi deneyin** ve erişim elde edip edemediğinizi görün. +Eğer kimlik doğrulama yanıtı **basit bir boolean'a indirgenebiliyorsa, false'u true olarak değiştirmeyi deneyin** ve herhangi bir erişim elde edip edemediğinizi görün. ## OAuth ile Hesap Ele Geçirme @@ -88,7 +88,7 @@ oauth-to-account-takeover.md 1. Şifre sıfırlama isteği başlatıldıktan sonra Host başlığı değiştirilir. 2. `X-Forwarded-For` proxy başlığı `attacker.com` olarak değiştirilir. 3. Host, Referrer ve Origin başlıkları aynı anda `attacker.com` olarak değiştirilir. -4. Şifre sıfırlama başlatıldıktan sonra, e-postayı yeniden göndermeyi seçerek, yukarıda belirtilen üç yöntem de kullanılır. +4. Şifre sıfırlama başlatıldıktan sonra, e-postayı yeniden göndermeyi seçerken, yukarıda belirtilen üç yöntem de kullanılır. ## Yanıt Manipülasyonu @@ -99,7 +99,7 @@ oauth-to-account-takeover.md Bu manipülasyon teknikleri, JSON'un veri iletimi ve alımı için kullanıldığı senaryolarda etkilidir. -## Mevcut oturumun e-posta adresini değiştirme +## Mevcut Oturumun E-posta Adresini Değiştirme [bu rapordan](https://dynnyd20.medium.com/one-click-account-take-over-e500929656ea): @@ -113,13 +113,13 @@ Bu, [**bu raporda**](https://dynnyd20.medium.com/one-click-account-take-over-e50 ### Hesap Ele Geçirme için E-posta Doğrulamasını Atlatma - Saldırgan attacker@test.com ile giriş yapar ve kaydolduğunda e-postayı doğrular. -- Saldırgan doğrulanan e-postayı victim@test.com olarak değiştirir (e-posta değişikliği için ikinci bir doğrulama yok). +- Saldırgan doğrulanmış e-postayı victim@test.com olarak değiştirir (e-posta değişikliği için ikinci bir doğrulama yoktur). - Artık web sitesi victim@test.com ile giriş yapmaya izin verir ve kurban kullanıcının e-posta doğrulamasını atlatmış oluruz. ### Eski Çerezler -[**bu yazıda**](https://medium.com/@niraj1mahajan/uncovering-the-hidden-vulnerability-how-i-found-an-authentication-bypass-on-shopifys-exchange-cc2729ea31a9) açıklandığı gibi, bir hesaba giriş yapmak, çerezleri kimlik doğrulaması yapılmış bir kullanıcı olarak kaydetmek, çıkış yapmak ve sonra tekrar giriş yapmak mümkündü.\ -Yeni girişle, farklı çerezler oluşturulsa da eski çerezler tekrar çalışmaya başladı. +[**bu yazıda**](https://medium.com/@niraj1mahajan/uncovering-the-hidden-vulnerability-how-i-found-an-authentication-bypass-on-shopifys-exchange-cc2729ea31a9) açıklandığı gibi, bir hesaba giriş yapmak, çerezleri kimlik doğrulaması yapılmış bir kullanıcı olarak kaydetmek, çıkış yapmak ve ardından tekrar giriş yapmak mümkündü.\ +Yeni girişle, farklı çerezler oluşturulmuş olsa da, eski çerezler tekrar çalışmaya başladı. ## Referanslar 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;