mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-23 05:03:35 +00:00
Translated ['pentesting-web/browser-extension-pentesting-methodology/REA
This commit is contained in:
parent
73ca6eb86f
commit
37a6761612
2 changed files with 71 additions and 69 deletions
BIN
.gitbook/assets/image (1235).png
Normal file
BIN
.gitbook/assets/image (1235).png
Normal file
Binary file not shown.
After Width: | Height: | Size: 46 KiB |
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
<details>
|
<details>
|
||||||
|
|
||||||
<summary><strong>Zacznij od zera i stań się ekspertem od hakowania AWS dzięki</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
<summary><strong>Nauka hakowania AWS od zera do bohatera z</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
|
||||||
|
|
||||||
Inne sposoby wsparcia HackTricks:
|
Inne sposoby wsparcia HackTricks:
|
||||||
|
|
||||||
|
@ -30,25 +30,25 @@ Każdy skrypt zawartości ma bezpośredni dostęp do DOM **jednej strony interne
|
||||||
|
|
||||||
### **Rdzeń rozszerzenia**
|
### **Rdzeń rozszerzenia**
|
||||||
|
|
||||||
Rdzeń rozszerzenia zawiera większość uprawnień/dostępu rozszerzenia, ale rdzeń rozszerzenia może współdziałać z zawartością internetową tylko za pomocą [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) i skryptów zawartości. Ponadto rdzeń rozszerzenia nie ma bezpośredniego dostępu do maszyny hosta.
|
Rdzeń rozszerzenia zawiera większość uprawnień/dostępu do rozszerzenia, ale rdzeń rozszerzenia może współdziałać z zawartością internetową tylko za pomocą [XMLHttpRequest](https://developer.mozilla.org/en-US/docs/Web/API/XMLHttpRequest) i skryptów zawartości. Ponadto rdzeń rozszerzenia nie ma bezpośredniego dostępu do maszyny docelowej.
|
||||||
|
|
||||||
### **Binarny natywny**
|
### **Binarny natywny**
|
||||||
|
|
||||||
Rozszerzenie pozwala na binarny plik natywny, który może **uzyskać dostęp do maszyny hosta z pełnymi uprawnieniami użytkownika**. Binarny plik natywny współdziała z rdzeniem rozszerzenia za pomocą standardowego interfejsu programowania aplikacji wtyczek Netscape ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) używanego przez Flash i inne wtyczki przeglądarki.
|
Rozszerzenie pozwala na binarny natywny, który może **uzyskać dostęp do maszyny docelowej z pełnymi uprawnieniami użytkownika**. Binarny natywny współdziała z rdzeniem rozszerzenia za pomocą standardowego interfejsu programowania aplikacji wtyczek Netscape ([NPAPI](https://en.wikipedia.org/wiki/NPAPI)) używanego przez Flash i inne wtyczki przeglądarkowe.
|
||||||
|
|
||||||
### Granice
|
### Granice
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Aby uzyskać pełne uprawnienia użytkownika, atakujący musi przekonać rozszerzenie do przekazania złośliwych danych wejściowych ze skryptu zawartości do rdzenia rozszerzenia oraz z rdzenia rozszerzenia do binarnego pliku natywnego.
|
Aby uzyskać pełne uprawnienia użytkownika, atakujący musi przekonać rozszerzenie do przekazania złośliwych danych wejściowych ze skryptu zawartości do rdzenia rozszerzenia oraz z rdzenia rozszerzenia do binarnego natywnego.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Każdy składnik rozszerzenia jest odseparowany od siebie za pomocą **silnych granic ochronnych**. Każdy składnik działa w **oddzielnym procesie systemu operacyjnego**. Skrypty zawartości i rdzenie rozszerzeń działają w **procesach piaskownicy** niedostępnych dla większości usług systemu operacyjnego.
|
Każdy składnik rozszerzenia jest odseparowany od siebie za pomocą **silnych granic ochronnych**. Każdy składnik działa w **oddzielnym procesie systemu operacyjnego**. Skrypty zawartości i rdzenie rozszerzeń działają w **procesach piaskownicy** niedostępnych dla większości usług systemu operacyjnego.
|
||||||
|
|
||||||
Co więcej, skrypty zawartości oddzielone są od powiązanych stron internetowych poprzez **działanie w oddzielnej stercie JavaScript**. Skrypt zawartości i strona internetowa mają **dostęp do tego samego DOM**, ale **nigdy nie wymieniają wskaźników JavaScript**, co zapobiega wyciekowi funkcjonalności JavaScript.
|
Co więcej, skrypty zawartości oddzielone są od powiązanych stron internetowych poprzez **działanie w oddzielnej stercie JavaScript**. Skrypt zawartości i strona internetowa mają **dostęp do tego samego DOM**, ale **nigdy nie wymieniają ze sobą wskaźników JavaScript**, co zapobiega wyciekowi funkcjonalności JavaScript.
|
||||||
|
|
||||||
## **`manifest.json`**
|
## **`manifest.json`**
|
||||||
|
|
||||||
Rozszerzenie Chrome to po prostu folder ZIP z rozszerzeniem [.crx](https://www.lifewire.com/crx-file-2620391). Rdzeń rozszerzenia to plik **`manifest.json`** znajdujący się w głównym katalogu, który określa układ, uprawnienia i inne opcje konfiguracyjne.
|
Rozszerzenie Chrome to po prostu folder ZIP z rozszerzeniem [.crx](https://www.lifewire.com/crx-file-2620391). Rdzeniem rozszerzenia jest plik **`manifest.json`** znajdujący się w głównym katalogu, który określa układ, uprawnienia i inne opcje konfiguracji.
|
||||||
|
|
||||||
Przykład:
|
Przykład:
|
||||||
```json
|
```json
|
||||||
|
@ -83,7 +83,7 @@ Przykład:
|
||||||
```
|
```
|
||||||
### `content_scripts`
|
### `content_scripts`
|
||||||
|
|
||||||
Skrypty zawartości są **ładowane** za każdym razem, gdy użytkownik **przechodzi do pasującej strony**, w naszym przypadku do dowolnej strony pasującej do wyrażenia **`https://example.com/*`** i nie pasującej do wyrażenia **`*://*/*/business*`**. Wykonują się **jak własne skrypty strony** i mają arbitralny dostęp do [Modelu Obiektowego Dokumentu (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model) strony.
|
Skrypty zawartości są **ładowane** za każdym razem, gdy użytkownik **przechodzi do pasującej strony**, w naszym przypadku do dowolnej strony pasującej do wyrażenia **`https://example.com/*`** i nie pasującej do regexu **`*://*/*/business*`**. Wykonują się **jak własne skrypty strony** i mają arbitralny dostęp do [Modelu Obiektowego Dokumentu (DOM)](https://developer.mozilla.org/en-US/docs/Web/API/Document_Object_Model) strony.
|
||||||
```json
|
```json
|
||||||
"content_scripts": [
|
"content_scripts": [
|
||||||
{
|
{
|
||||||
|
@ -115,24 +115,24 @@ document.body.appendChild(div);
|
||||||
```
|
```
|
||||||
<figure><img src="../../.gitbook/assets/image (20).png" alt=""><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (20).png" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Po kliknięciu tego przycisku skrypt zawartości wysyła wiadomość do stron rozszerzenia za pomocą [**API runtime.sendMessage()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Wynika to z ograniczenia skryptu zawartości w bezpośrednim dostępie do interfejsów API, przy czym `storage` należy do nielicznych wyjątków. Dla funkcji poza tymi wyjątkami, wiadomości są wysyłane do stron rozszerzenia, z którymi skrypty zawartości mogą się komunikować.
|
Wiadomość jest wysyłana do stron rozszerzenia przez skrypt treści po kliknięciu tego przycisku, poprzez wykorzystanie [**API runtime.sendMessage()**](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/sendMessage). Wynika to z ograniczenia skryptu treści w bezpośrednim dostępie do interfejsów API, przy czym `storage` należy do nielicznych wyjątków. Dla funkcji poza tymi wyjątkami, wiadomości są wysyłane do stron rozszerzenia, z którymi skrypty treści mogą komunikować się.
|
||||||
|
|
||||||
{% hint style="warning" %}
|
{% hint style="warning" %}
|
||||||
W zależności od przeglądarki, możliwości skryptu zawartości mogą się nieznacznie różnić. Dla przeglądarek opartych na Chromium, lista możliwości jest dostępna w [dokumentacji Chrome Developers](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), a dla Firefoksa, [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) służy jako główne źródło informacji.\
|
W zależności od przeglądarki, możliwości skryptu treści mogą nieznacznie się różnić. Dla przeglądarek opartych na Chromium, lista możliwości jest dostępna w [dokumentacji deweloperów Chrome'a](https://developer.chrome.com/docs/extensions/mv3/content_scripts/#capabilities), a dla Firefoksa, [MDN](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts#webextension_apis) służy jako główne źródło informacji.\
|
||||||
Warto również zauważyć, że skrypty zawartości mają zdolność do komunikacji z skryptami tła, umożliwiając im wykonywanie działań i przekazywanie odpowiedzi.
|
Warto również zauważyć, że skrypty treści mają zdolność komunikowania się z skryptami tła, umożliwiając im wykonywanie działań i przekazywanie odpowiedzi.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Aby wyświetlić i debugować skrypty zawartości w Chrome, menu narzędzi deweloperskich Chrome można uzyskać, przechodząc do Opcje > Więcej narzędzi > Narzędzia deweloperskie LUB naciskając Ctrl + Shift + I.
|
Aby wyświetlić i debugować skrypty treści w Chrome, menu narzędzi deweloperskich Chrome'a można otworzyć z pozycji Opcje > Więcej narzędzi > Narzędzia deweloperskie LUB poprzez naciśnięcie Ctrl + Shift + I.
|
||||||
|
|
||||||
Po wyświetleniu narzędzi deweloperskich, należy kliknąć zakładkę **Źródło**, a następnie zakładkę **Skrypty zawartości**. Pozwala to na obserwację działających skryptów zawartości z różnych rozszerzeń oraz ustawianie punktów przerwania w celu śledzenia przepływu wykonania.
|
Po wyświetleniu narzędzi deweloperskich, należy kliknąć zakładkę **Źródło**, a następnie zakładkę **Skrypty treści**. Pozwala to na obserwację działających skryptów treści z różnych rozszerzeń oraz ustawianie punktów przerwania w celu śledzenia przepływu wykonania.
|
||||||
|
|
||||||
### Wstrzyknięte skrypty zawartości
|
### Wstrzyknięte skrypty treści
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Zauważ, że **Skrypty zawartości nie są obowiązkowe**, ponieważ istnieje również możliwość **dynamicznego** **wstrzykiwania** skryptów i **programowego wstrzykiwania** ich na strony internetowe za pomocą **`tabs.executeScript`**. Zapewnia to faktycznie większą **kontrolę granularną**.
|
Zauważ, że **Skrypty treści nie są obowiązkowe**, ponieważ istnieje również możliwość **dynamicznego wstrzykiwania** skryptów i **programowego wstrzykiwania** ich na strony internetowe za pomocą **`tabs.executeScript`**. Zapewnia to faktycznie większą **kontrolę granularną**.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Aby programowo wstrzyknąć skrypt zawartości, konieczne jest, aby rozszerzenie miało [uprawnienia hosta](https://developer.chrome.com/docs/extensions/reference/permissions) dla strony, do której mają być wstrzykiwane skrypty. Uprawnienia te można zabezpieczyć poprzez **żądanie ich** w manifeście rozszerzenia lub tymczasowo za pomocą [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
|
Dla programowego wstrzykiwania skryptu treści, rozszerzenie musi mieć [uprawnienia hosta](https://developer.chrome.com/docs/extensions/reference/permissions) dla strony, na którą mają być wstrzykiwane skrypty. Uprawnienia te można zabezpieczyć poprzez **żądanie ich** w manifeście rozszerzenia lub tymczasowo poprzez [**activeTab**](https://developer.chrome.com/docs/extensions/reference/manifest/activeTab).
|
||||||
|
|
||||||
#### Przykładowe rozszerzenie oparte na activeTab
|
#### Przykładowe rozszerzenie oparte na activeTab
|
||||||
|
|
||||||
|
@ -205,9 +205,9 @@ Możliwe wartości to:
|
||||||
|
|
||||||
* **`document_idle`**: Kiedykolwiek to możliwe
|
* **`document_idle`**: Kiedykolwiek to możliwe
|
||||||
* **`document_start`**: Po plikach z `css`, ale przed zbudowaniem jakiegokolwiek innego DOM lub uruchomieniem jakiegokolwiek innego skryptu.
|
* **`document_start`**: Po plikach z `css`, ale przed zbudowaniem jakiegokolwiek innego DOM lub uruchomieniem jakiegokolwiek innego skryptu.
|
||||||
* **`document_end`**: Natychmiast po zakończeniu budowy DOM, ale przed załadowaniem zasobów podrzędnych, takich jak obrazy i ramki.
|
* **`document_end`**: Bezpośrednio po zakończeniu budowy DOM, ale przed załadowaniem zasobów podrzędnych, takich jak obrazy i ramki.
|
||||||
|
|
||||||
#### Przez `manifest.json`
|
#### Za pomocą `manifest.json`
|
||||||
```json
|
```json
|
||||||
{
|
{
|
||||||
"name": "My extension",
|
"name": "My extension",
|
||||||
|
@ -234,16 +234,16 @@ js : [ "contentScript.js" ],
|
||||||
```
|
```
|
||||||
### `tło`
|
### `tło`
|
||||||
|
|
||||||
Wiadomości wysyłane przez skrypty zawartości są odbierane przez **stronę tła**, która pełni centralną rolę w koordynowaniu komponentów rozszerzenia. Strona tła utrzymuje się przez cały okres istnienia rozszerzenia, działa dyskretnie bez bezpośredniej interakcji użytkownika. Posiada własny Model Obiektowy Dokumentu (DOM), umożliwiający kompleksowe interakcje i zarządzanie stanem.
|
Wiadomości wysłane przez skrypty treści są odbierane przez **stronę tła**, która pełni centralną rolę w koordynowaniu komponentów rozszerzenia. Warto zauważyć, że strona tła pozostaje aktywna przez cały czas działania rozszerzenia, działa dyskretnie bez bezpośredniej interakcji użytkownika. Posiada własny Model Obiektowy Dokumentu (DOM), umożliwiający złożone interakcje i zarządzanie stanem.
|
||||||
|
|
||||||
**Kluczowe punkty**:
|
**Kluczowe punkty**:
|
||||||
|
|
||||||
* **Rola Strony Tła:** Działa jako centrum nerwowe rozszerzenia, zapewniając komunikację i koordynację między różnymi częściami rozszerzenia.
|
* **Rola Strony Tła:** Działa jako centrum nerwowe rozszerzenia, zapewniając komunikację i koordynację między różnymi częściami rozszerzenia.
|
||||||
* **Trwałość:** Jest to zawsze obecna jednostka, niewidoczna dla użytkownika, ale integralna dla funkcjonalności rozszerzenia.
|
* **Trwałość:** Jest to obecna zawsze jednostka, niewidoczna dla użytkownika, ale integralna dla funkcjonalności rozszerzenia.
|
||||||
* **Automatyczne Generowanie:** Jeśli nie jest jawnie zdefiniowana, przeglądarka automatycznie utworzy stronę tła. Ta automatycznie generowana strona będzie zawierać wszystkie skrypty tła określone w manifeście rozszerzenia, zapewniając bezproblemową pracę zadań tła rozszerzenia.
|
* **Automatyczne Generowanie:** Jeśli nie jest jawnie zdefiniowana, przeglądarka automatycznie utworzy stronę tła. Ta automatycznie generowana strona będzie zawierać wszystkie skrypty tła określone w manifeście rozszerzenia, zapewniając bezproblemowe działanie zadań tła rozszerzenia.
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Wygodę zapewnianą przez przeglądarkę poprzez automatyczne generowanie strony tła (gdy nie jest jawnie zadeklarowana) zapewnia, że wszystkie niezbędne skrypty tła są zintegrowane i działają, usprawniając proces konfiguracji rozszerzenia.
|
Wygodę zapewnianą przez przeglądarkę poprzez automatyczne generowanie strony tła (gdy nie jest jawnie zadeklarowane) zapewnia, że wszystkie niezbędne skrypty tła są zintegrowane i działają, usprawniając proces konfiguracji rozszerzenia.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
Przykładowy skrypt tła:
|
Przykładowy skrypt tła:
|
||||||
|
@ -256,9 +256,9 @@ chrome.tabs.create({ url: "https://example.net/explanation" });
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
```
|
```
|
||||||
Wykorzystuje [API runtime.onMessage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage), aby nasłuchiwać wiadomości. Gdy otrzyma wiadomość `"explain"`, używa [API tabs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs), aby otworzyć stronę w nowej karcie.
|
Wykorzystuje [interfejs API runtime.onMessage](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/runtime/onMessage), aby nasłuchiwać wiadomości. Gdy otrzyma wiadomość `"explain"`, używa [interfejsu API tabs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/API/tabs), aby otworzyć stronę w nowej karcie.
|
||||||
|
|
||||||
Aby debugować skrypt tła, przejdź do **szczegółów rozszerzenia i zbadaj serwis workera**, co otworzy narzędzia deweloperskie z skryptem tła:
|
Aby debugować skrypt tła, możesz przejść do **szczegółów rozszerzenia i sprawdzić serwis workera**, co otworzy narzędzia deweloperskie z skryptem tła:
|
||||||
|
|
||||||
<figure><img src="https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/browser-extension-pentesting-methodology/broken-reference" alt=""><figcaption></figcaption></figure>
|
<figure><img src="https://github.com/carlospolop/hacktricks/blob/master/pentesting-web/browser-extension-pentesting-methodology/broken-reference" alt=""><figcaption></figcaption></figure>
|
||||||
|
|
||||||
|
@ -275,7 +275,7 @@ Rozszerzenia przeglądarki mogą zawierać różne rodzaje stron:
|
||||||
Zauważ, że te strony nie są trwałe jak strony tła, ponieważ dynamicznie ładowane są treści w razie potrzeby. Mimo to, dzielą pewne możliwości z stroną tła:
|
Zauważ, że te strony nie są trwałe jak strony tła, ponieważ dynamicznie ładowane są treści w razie potrzeby. Mimo to, dzielą pewne możliwości z stroną tła:
|
||||||
|
|
||||||
* **Komunikacja z skryptami zawartości:** Podobnie jak strona tła, te strony mogą otrzymywać wiadomości od skryptów zawartości, ułatwiając interakcję wewnątrz rozszerzenia.
|
* **Komunikacja z skryptami zawartości:** Podobnie jak strona tła, te strony mogą otrzymywać wiadomości od skryptów zawartości, ułatwiając interakcję wewnątrz rozszerzenia.
|
||||||
* **Dostęp do API specyficznych dla rozszerzenia:** Te strony mają pełny dostęp do API specyficznych dla rozszerzenia, zgodnie z uprawnieniami zdefiniowanymi dla rozszerzenia.
|
* **Dostęp do interfejsów API specyficznych dla rozszerzenia:** Te strony mają pełny dostęp do interfejsów API specyficznych dla rozszerzenia, zgodnie z uprawnieniami zdefiniowanymi dla rozszerzenia.
|
||||||
|
|
||||||
### `permissions` i `host_permissions`
|
### `permissions` i `host_permissions`
|
||||||
|
|
||||||
|
@ -283,7 +283,7 @@ Zauważ, że te strony nie są trwałe jak strony tła, ponieważ dynamicznie ł
|
||||||
|
|
||||||
Ponieważ rozszerzenia przeglądarki mogą być tak **uprzywilejowane**, złośliwe lub skompromitowane mogą umożliwić atakującemu **różne sposoby kradzieży wrażliwych informacji i szpiegowania użytkownika**.
|
Ponieważ rozszerzenia przeglądarki mogą być tak **uprzywilejowane**, złośliwe lub skompromitowane mogą umożliwić atakującemu **różne sposoby kradzieży wrażliwych informacji i szpiegowania użytkownika**.
|
||||||
|
|
||||||
Sprawdź, jak działają te ustawienia i jak mogą być wykorzystane w:
|
Sprawdź, jak działają te ustawienia i jak mogą być nadużywane w:
|
||||||
|
|
||||||
{% content-ref url="browext-permissions-and-host_permissions.md" %}
|
{% content-ref url="browext-permissions-and-host_permissions.md" %}
|
||||||
[browext-permissions-and-host\_permissions.md](browext-permissions-and-host\_permissions.md)
|
[browext-permissions-and-host\_permissions.md](browext-permissions-and-host\_permissions.md)
|
||||||
|
@ -297,7 +297,7 @@ Domyślne ustawienie dla stron rozszerzenia przeglądarki jest raczej restrykcyj
|
||||||
```bash
|
```bash
|
||||||
script-src 'self'; object-src 'self';
|
script-src 'self'; object-src 'self';
|
||||||
```
|
```
|
||||||
Dla więcej informacji na temat CSP i potencjalnych bypassów sprawdź:
|
Aby uzyskać więcej informacji na temat CSP i potencjalnych obejść, sprawdź:
|
||||||
|
|
||||||
{% content-ref url="../content-security-policy-csp-bypass/" %}
|
{% content-ref url="../content-security-policy-csp-bypass/" %}
|
||||||
[content-security-policy-csp-bypass](../content-security-policy-csp-bypass/)
|
[content-security-policy-csp-bypass](../content-security-policy-csp-bypass/)
|
||||||
|
@ -305,7 +305,7 @@ Dla więcej informacji na temat CSP i potencjalnych bypassów sprawdź:
|
||||||
|
|
||||||
### `web_accessible_resources`
|
### `web_accessible_resources`
|
||||||
|
|
||||||
aby strona internetowa mogła uzyskać dostęp do strony Rozszerzenia Przeglądarki, na przykład pliku `.html`, ta strona musi być wymieniona w polu **`web_accessible_resources`** pliku `manifest.json`.\
|
Aby strona internetowa mogła uzyskać dostęp do strony rozszerzenia przeglądarki, na przykład pliku `.html`, ta strona musi być wymieniona w polu **`web_accessible_resources`** pliku `manifest.json`.\
|
||||||
Na przykład:
|
Na przykład:
|
||||||
```javascript
|
```javascript
|
||||||
{
|
{
|
||||||
|
@ -331,16 +331,16 @@ W publicznych rozszerzeniach **identyfikator rozszerzenia jest dostępny**:
|
||||||
|
|
||||||
<figure><img src="../../.gitbook/assets/image (1191).png" alt="" width="375"><figcaption></figcaption></figure>
|
<figure><img src="../../.gitbook/assets/image (1191).png" alt="" width="375"><figcaption></figcaption></figure>
|
||||||
|
|
||||||
Jednakże, jeśli używany jest parametr `manifest.json` **`use_dynamic_url`**, ten **identyfikator może być dynamiczny**.
|
Jednakże, jeśli parametr `manifest.json` **`use_dynamic_url`** jest używany, to **ten identyfikator może być dynamiczny**.
|
||||||
|
|
||||||
Zezwolenie na dostęp do tych stron sprawia, że są one **potencjalnie podatne na ataki ClickJacking**:
|
Zezwolenie na dostęp do tych stron sprawia, że strony te są **potencjalnie podatne na ataki ClickJacking**:
|
||||||
|
|
||||||
{% content-ref url="browext-clickjacking.md" %}
|
{% content-ref url="browext-clickjacking.md" %}
|
||||||
[browext-clickjacking.md](browext-clickjacking.md)
|
[browext-clickjacking.md](browext-clickjacking.md)
|
||||||
{% endcontent-ref %}
|
{% endcontent-ref %}
|
||||||
|
|
||||||
{% hint style="success" %}
|
{% hint style="success" %}
|
||||||
Zezwolenie na ładowanie tych stron tylko przez rozszerzenie, a nie przez losowe adresy URL, może zapobiec atakom CLickJacking.
|
Zezwolenie na ładowanie tych stron tylko przez rozszerzenie, a nie przez losowe adresy URL, może zapobiec atakom typu CLickJacking.
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
### `externally_connectable`
|
### `externally_connectable`
|
||||||
|
@ -360,18 +360,18 @@ Zgodnie z [**dokumentacją**](https://developer.chrome.com/docs/extensions/refer
|
||||||
Im mniej rozszerzeń i adresów URL wskazanych tutaj, tym mniejsza będzie powierzchnia ataku.
|
Im mniej rozszerzeń i adresów URL wskazanych tutaj, tym mniejsza będzie powierzchnia ataku.
|
||||||
|
|
||||||
{% hint style="danger" %}
|
{% hint style="danger" %}
|
||||||
Jeśli strona internetowa podatna na XSS lub przejęcie jest wskazana w **`externally_connectable`**, atakujący będzie mógł **wysyłać wiadomości bezpośrednio do skryptu tła**, całkowicie omijając Skrypt Zawartości i jego CSP.
|
Jeśli strona internetowa **podatna na XSS lub przejęcie** jest wskazana w **`externally_connectable`**, atakujący będzie mógł **wysyłać wiadomości bezpośrednio do skryptu tła**, całkowicie omijając Skrypt Zawartości i jego CSP.
|
||||||
|
|
||||||
Dlatego jest to **bardzo potężne obejście**.
|
Dlatego jest to **bardzo potężne obejście**.
|
||||||
|
|
||||||
Co więcej, jeśli klient zainstaluje złośliwe rozszerzenie, nawet jeśli nie jest ono zezwolone na komunikację z podatnym rozszerzeniem, może wstrzyknąć dane XSS na dozwolonej stronie internetowej lub nadużyć interfejsów API **`WebRequest`** lub **`DeclarativeNetRequest`** do manipulowania żądaniami na domenie docelowej, zmieniając żądanie strony dla pliku **JavaScript**. (Należy zauważyć, że CSP na stronie docelowej może zapobiec tym atakom). Ten pomysł pochodzi [**z tego opisu**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
|
Co więcej, jeśli klient zainstaluje złośliwe rozszerzenie, nawet jeśli nie ma zezwolenia na komunikację z podatnym rozszerzeniem, może wstrzyknąć **dane XSS na dozwolonej stronie internetowej** lub nadużyć interfejsów API **`WebRequest`** lub **`DeclarativeNetRequest`** do manipulowania żądaniami na docelową domenę zmieniając żądanie strony dla **pliku JavaScript**. (Należy zauważyć, że CSP na docelowej stronie może zapobiec tym atakom). Ten pomysł pochodzi [**z tego opisu**](https://www.darkrelay.com/post/opera-zero-day-rce-vulnerability).
|
||||||
{% endhint %}
|
{% endhint %}
|
||||||
|
|
||||||
##
|
##
|
||||||
|
|
||||||
## Komunikacja między Skryptem Zawartości a stroną internetową
|
## Komunikacja między Skryptem Zawartości a stroną internetową
|
||||||
|
|
||||||
Środowiska, w których działają **skrypty zawartości** i gdzie istnieją strony hosta, są od siebie **oddzielone**, zapewniając **izolację**. Pomimo tej izolacji, obie strony mają możliwość interakcji z **Model Obiektu Dokumentu (DOM)** strony, wspólnego zasobu. Aby strona hosta mogła komunikować się ze **skryptem zawartości**, lub pośrednio z rozszerzeniem poprzez skrypt zawartości, konieczne jest wykorzystanie **DOM**, który jest dostępny dla obu stron jako kanał komunikacji.
|
Środowiska, w których działają **skrypty zawartości** i gdzie istnieją strony hosta, są od siebie **oddzielone**, zapewniając **izolację**. Pomimo tej izolacji, obie strony mają możliwość interakcji z **Model Obiektu Dokumentu (DOM)** strony, wspólnego zasobu. Aby strona hosta mogła komunikować się ze **skryptem zawartości**, lub pośrednio z rozszerzeniem poprzez skrypt zawartości, konieczne jest wykorzystanie **DOM** dostępnego dla obu stron jako kanału komunikacji.
|
||||||
|
|
||||||
### Wiadomości Post
|
### Wiadomości Post
|
||||||
|
|
||||||
|
@ -408,9 +408,9 @@ Bezpieczna komunikacja Post Message powinna sprawdzać autentyczność otrzymane
|
||||||
* Skrypt zawartości może oczekiwać wiadomości tylko wtedy, gdy użytkownik wykonuje jakąś akcję.
|
* Skrypt zawartości może oczekiwać wiadomości tylko wtedy, gdy użytkownik wykonuje jakąś akcję.
|
||||||
* **Domena pochodzenia**: może oczekiwać wiadomości tylko z listy zaufanych domen.
|
* **Domena pochodzenia**: może oczekiwać wiadomości tylko z listy zaufanych domen.
|
||||||
* Jeśli używany jest regex, należy być bardzo ostrożnym.
|
* Jeśli używany jest regex, należy być bardzo ostrożnym.
|
||||||
* **Źródło**: `received_message.source !== window` można użyć do sprawdzenia, czy wiadomość pochodzi **z tego samego okna**, w którym nasłuchuje Skrypt Zawartości.
|
* **Źródło**: `received_message.source !== window` można użyć do sprawdzenia, czy wiadomość pochodziła **z tego samego okna**, w którym nasłuchuje Skrypt Zawartości.
|
||||||
|
|
||||||
Poprzednie sprawdzenia, nawet jeśli wykonane, mogą być podatne na ataki, więc sprawdź na następnej stronie **potencjalne sposoby obejścia Post Message**:
|
Poprzednie sprawdzenia, nawet jeśli wykonane, mogą być podatne, dlatego sprawdź na następnej stronie **potencjalne sposoby obchodzenia Post Message**:
|
||||||
|
|
||||||
{% content-ref url="../postmessage-vulnerabilities/" %}
|
{% content-ref url="../postmessage-vulnerabilities/" %}
|
||||||
[postmessage-vulnerabilities](../postmessage-vulnerabilities/)
|
[postmessage-vulnerabilities](../postmessage-vulnerabilities/)
|
||||||
|
@ -418,7 +418,7 @@ Poprzednie sprawdzenia, nawet jeśli wykonane, mogą być podatne na ataki, wię
|
||||||
|
|
||||||
### Iframe
|
### Iframe
|
||||||
|
|
||||||
Inną możliwą drogą komunikacji może być poprzez **adresy URL ramek (Iframe URLs)**, przykład można znaleźć w:
|
Inną możliwą drogą komunikacji może być poprzez **adresy URL Iframe**, przykład można znaleźć w:
|
||||||
|
|
||||||
{% content-ref url="browext-xss-example.md" %}
|
{% content-ref url="browext-xss-example.md" %}
|
||||||
[browext-xss-example.md](browext-xss-example.md)
|
[browext-xss-example.md](browext-xss-example.md)
|
||||||
|
@ -426,9 +426,9 @@ Inną możliwą drogą komunikacji może być poprzez **adresy URL ramek (Iframe
|
||||||
|
|
||||||
### DOM
|
### DOM
|
||||||
|
|
||||||
To nie jest "dokładnie" sposób komunikacji, ale **strona internetowa i skrypt zawartości będą miały dostęp do DOM strony internetowej**. Dlatego jeśli **skrypt zawartości** odczytuje jakieś informacje z niego, **ufając DOM-owi strony internetowej**, strona internetowa mogłaby **zmodyfikować te dane** (ponieważ strona internetowa nie powinna być ufała, lub ponieważ strona internetowa jest podatna na XSS) i **narażać Skrypt Zawartości**.
|
To nie jest "dokładnie" sposób komunikacji, ale **strona internetowa i skrypt zawartości będą miały dostęp do DOM**. Dlatego jeśli **skrypt zawartości** odczytuje jakieś informacje z niego, **ufając DOM-owi strony**, strona internetowa mogłaby **zmodyfikować te dane** (ponieważ strona internetowa nie powinna być ufała, lub ponieważ strona internetowa jest podatna na XSS) i **naruszyć Skrypt Zawartości**.
|
||||||
|
|
||||||
Można również znaleźć przykład **opartego na DOM XSS w celu naruszenia rozszerzenia przeglądarki** w:
|
Można również znaleźć przykład **DOM opartego XSS do naruszenia rozszerzenia przeglądarki** w:
|
||||||
|
|
||||||
{% content-ref url="browext-xss-example.md" %}
|
{% content-ref url="browext-xss-example.md" %}
|
||||||
[browext-xss-example.md](browext-xss-example.md)
|
[browext-xss-example.md](browext-xss-example.md)
|
||||||
|
@ -436,19 +436,21 @@ Można również znaleźć przykład **opartego na DOM XSS w celu naruszenia roz
|
||||||
|
|
||||||
## Wrażliwe Informacje w Pamięci/Kodzie
|
## Wrażliwe Informacje w Pamięci/Kodzie
|
||||||
|
|
||||||
Jeśli Rozszerzenie Przeglądarki przechowuje **wrażliwe informacje w swojej pamięci**, mogą one zostać **wydobyte** (szczególnie na maszynach z systemem Windows) i **przeszukane** w poszukiwaniu tych informacji.
|
Jeśli Rozszerzenie Przeglądarki przechowuje **wrażliwe informacje w swojej pamięci**, mogą one zostać **wydobyte** (szczególnie w systemach Windows) i **przeszukane** w poszukiwaniu tych informacji.
|
||||||
|
|
||||||
Dlatego pamięć Rozszerzenia Przeglądarki **nie powinna być uważana za bezpieczną**, a **wrażliwe informacje** takie jak dane uwierzytelniające czy frazy mnemoniczne **nie powinny być przechowywane**.
|
Dlatego pamięć Rozszerzenia Przeglądarki **nie powinna być uważana za bezpieczną**, a **wrażliwe informacje** takie jak dane uwierzytelniające czy frazy mnemoniczne **nie powinny być przechowywane**.
|
||||||
|
|
||||||
Oczywiście, **nie umieszczaj wrażliwych informacji w kodzie**, ponieważ będą one **publiczne**.
|
Oczywiście, **nie umieszczaj wrażliwych informacji w kodzie**, ponieważ będą **publiczne**.
|
||||||
|
|
||||||
|
Aby wydobyć pamięć z przeglądarki, można **wydobyć pamięć procesu** lub przejść do **ustawień** rozszerzenia przeglądarki i kliknąć **`Inspect pop-up`** -> W sekcji **`Memory`** -> **`Zrób zrzut`** i użyć **`CTRL+F`** do wyszukiwania wewnątrz zrzutu wrażliwych informacji.
|
||||||
|
|
||||||
## Komunikacja Skryptu Zawartości **↔︎** Skryptu Tła
|
## Komunikacja Skryptu Zawartości **↔︎** Skryptu Tła
|
||||||
|
|
||||||
Skrypt Zawartości może użyć funkcji [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **lub** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) do wysłania **jednorazowej wiadomości serializowalnej w formacie JSON**.
|
Skrypt Zawartości może użyć funkcji [**runtime.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/runtime#method-sendMessage) **lub** [**tabs.sendMessage()**](https://developer.chrome.com/docs/extensions/reference/tabs#method-sendMessage) do wysłania **jednorazowej wiadomości serializowalnej w formacie JSON**.
|
||||||
|
|
||||||
Aby obsłużyć **odpowiedź**, użyj zwróconego **Promise**. Chociaż, dla zachowania kompatybilności wstecznej, nadal można przekazać **wywołanie zwrotne** jako ostatni argument.
|
Aby obsłużyć **odpowiedź**, użyj zwróconego **Promise**. Choć, dla zachowania wstecznej kompatybilności, nadal można przekazać **callback** jako ostatni argument.
|
||||||
|
|
||||||
Wysłanie żądania z **skryptu zawartości** wygląda następująco:
|
Wysłanie żądania z **skryptu zawartości** wygląda tak:
|
||||||
```javascript
|
```javascript
|
||||||
(async () => {
|
(async () => {
|
||||||
const response = await chrome.runtime.sendMessage({greeting: "hello"});
|
const response = await chrome.runtime.sendMessage({greeting: "hello"});
|
||||||
|
@ -456,7 +458,7 @@ const response = await chrome.runtime.sendMessage({greeting: "hello"});
|
||||||
console.log(response);
|
console.log(response);
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
Wysyłanie żądania z **rozszerzenia** (zwykle z **skryptu tła**) Skrypt zawartości może korzystać z funkcji, z wyjątkiem konieczności określenia, do którego karty ma zostać wysłane. Przykład, jak wysłać wiadomość do skryptu zawartości w wybranej karcie:
|
Wysyłanie żądania z **rozszerzenia** (zwykle skryptu **tła**) Skrypt zawartości może korzystać z funkcji, z wyjątkiem konieczności określenia, do którego karty ma zostać wysłane. Przykład, jak wysłać wiadomość do skryptu zawartości w wybranej karcie:
|
||||||
```javascript
|
```javascript
|
||||||
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
|
// From https://stackoverflow.com/questions/36153999/how-to-send-a-message-between-chrome-extension-popup-and-content-script
|
||||||
(async () => {
|
(async () => {
|
||||||
|
@ -466,7 +468,7 @@ const response = await chrome.tabs.sendMessage(tab.id, {greeting: "hello"});
|
||||||
console.log(response);
|
console.log(response);
|
||||||
})();
|
})();
|
||||||
```
|
```
|
||||||
Na **końcu odbiorczym**, musisz skonfigurować nasłuchiwanie zdarzenia [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) aby obsłużyć wiadomość. Wygląda to tak samo zarówno z treścią skryptu, jak i z stroną rozszerzenia.
|
Na **końcu odbiorczym**, musisz skonfigurować nasłuchiwanie zdarzenia [**runtime.onMessage**](https://developer.chrome.com/docs/extensions/reference/runtime#event-onMessage) aby obsłużyć wiadomość. Wygląda to tak samo zarówno z treści skryptu, jak i strony rozszerzenia.
|
||||||
```javascript
|
```javascript
|
||||||
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
|
// From https://stackoverflow.com/questions/70406787/javascript-send-message-from-content-js-to-background-js
|
||||||
chrome.runtime.onMessage.addListener(
|
chrome.runtime.onMessage.addListener(
|
||||||
|
@ -479,16 +481,16 @@ sendResponse({farewell: "goodbye"});
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
```
|
```
|
||||||
W podanym przykładzie **`sendResponse()`** zostało wykonane synchronicznie. Aby zmodyfikować obsługę zdarzenia `onMessage` w celu asynchronicznego wykonania `sendResponse()`, konieczne jest dodanie `return true;`.
|
W podanym przykładzie **`sendResponse()`** zostało wykonane w sposób synchroniczny. Aby zmodyfikować obsługę zdarzenia `onMessage` w celu asynchronicznego wykonania `sendResponse()`, konieczne jest uwzględnienie `return true;`.
|
||||||
|
|
||||||
Ważnym aspektem jest to, że w przypadkach, gdy wiele stron jest ustawionych do odbierania zdarzeń `onMessage`, **pierwsza strona wykonująca `sendResponse()`** dla określonego zdarzenia będzie jedyną zdolną skutecznie dostarczyć odpowiedź. Wszelkie kolejne odpowiedzi na to samo zdarzenie nie będą brane pod uwagę.
|
Ważnym rozważeniem jest, że w scenariuszach, gdzie wiele stron jest ustawionych do otrzymywania zdarzeń `onMessage`, **pierwsza strona wykonująca `sendResponse()`** dla określonego zdarzenia będzie jedyną zdolną skutecznie dostarczyć odpowiedź. Wszelkie następne odpowiedzi na to samo zdarzenie nie będą brane pod uwagę.
|
||||||
|
|
||||||
Podczas tworzenia nowych rozszerzeń, należy preferować obietnice (promises) zamiast wywołań zwrotnych. W odniesieniu do użycia wywołań zwrotnych, funkcja `sendResponse()` jest uważana za ważną tylko wtedy, gdy jest wykonywana bezpośrednio w kontekście synchronicznym, lub jeśli obsługa zdarzenia wskazuje na operację asynchroniczną poprzez zwrócenie `true`. Jeśli żaden z obsługujących nie zwróci `true` lub jeśli funkcja `sendResponse()` zostanie usunięta z pamięci (zebrana przez garbage collector), wywołany zostanie domyślnie zwrotny wywołanie związane z funkcją `sendMessage()`.
|
Podczas tworzenia nowych rozszerzeń, należy preferować obietnice (promises) w przeciwieństwie do wywołań zwrotnych (callbacks). W odniesieniu do użycia wywołań zwrotnych, funkcja `sendResponse()` jest uważana za ważną tylko wtedy, gdy jest wykonywana bezpośrednio w kontekście synchronicznym, lub jeśli obsługa zdarzenia wskazuje na operację asynchroniczną poprzez zwrócenie `true`. Jeśli żaden z obsługujących nie zwróci `true` lub jeśli funkcja `sendResponse()` zostanie usunięta z pamięci (zebrana przez garbage collector), wywołany zostanie domyślnie zwrotny wywołanie związane z funkcją `sendMessage()`.
|
||||||
|
|
||||||
## Ładowanie rozszerzenia w przeglądarce
|
## Ładowanie rozszerzenia w przeglądarce
|
||||||
|
|
||||||
1. **Pobierz** rozszerzenie przeglądarki i rozpakuj
|
1. **Pobierz** Rozszerzenie Przeglądarki & rozpakuj
|
||||||
2. Przejdź do **`chrome://extensions/`** i **włącz** `Tryb programisty`
|
2. Przejdź do **`chrome://extensions/`** i **włącz** `Tryb Dewelopera`
|
||||||
3. Kliknij przycisk **`Załaduj rozpakowane`**
|
3. Kliknij przycisk **`Załaduj rozpakowane`**
|
||||||
|
|
||||||
W **Firefoxie** przejdź do **`about:debugging#/runtime/this-firefox`** i kliknij przycisk **`Załaduj tymczasowe rozszerzenie`**.
|
W **Firefoxie** przejdź do **`about:debugging#/runtime/this-firefox`** i kliknij przycisk **`Załaduj tymczasowe rozszerzenie`**.
|
||||||
|
@ -497,7 +499,7 @@ W **Firefoxie** przejdź do **`about:debugging#/runtime/this-firefox`** i klikni
|
||||||
|
|
||||||
Kod źródłowy rozszerzenia Chrome można uzyskać za pomocą różnych metod. Poniżej znajdują się szczegółowe wyjaśnienia i instrukcje dla każdej opcji.
|
Kod źródłowy rozszerzenia Chrome można uzyskać za pomocą różnych metod. Poniżej znajdują się szczegółowe wyjaśnienia i instrukcje dla każdej opcji.
|
||||||
|
|
||||||
### Pobieranie rozszerzenia jako ZIP za pomocą wiersza poleceń
|
### Pobierz rozszerzenie jako ZIP za pomocą wiersza poleceń
|
||||||
|
|
||||||
Kod źródłowy rozszerzenia Chrome można pobrać jako plik ZIP za pomocą wiersza poleceń. Wymaga to użycia `curl` do pobrania pliku ZIP z określonego adresu URL, a następnie rozpakowania zawartości pliku ZIP do katalogu. Oto kroki:
|
Kod źródłowy rozszerzenia Chrome można pobrać jako plik ZIP za pomocą wiersza poleceń. Wymaga to użycia `curl` do pobrania pliku ZIP z określonego adresu URL, a następnie rozpakowania zawartości pliku ZIP do katalogu. Oto kroki:
|
||||||
|
|
||||||
|
@ -514,20 +516,20 @@ unzip -d "$extension_id-source" "$extension_id.zip"
|
||||||
|
|
||||||
### Użyj rozszerzenia CRX Viewer
|
### Użyj rozszerzenia CRX Viewer
|
||||||
|
|
||||||
Inną wygodną metodą jest użycie przeglądarki Chrome Extension Source Viewer, który jest projektem open-source. Można go zainstalować ze [Sklepu Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Kod źródłowy przeglądarki jest dostępny w [repozytorium GitHub](https://github.com/Rob--W/crxviewer).
|
Inną wygodną metodą jest korzystanie z przeglądarki Chrome Extension Source Viewer, która jest projektem open-source. Można ją zainstalować ze [Sklepu Chrome Web Store](https://chrome.google.com/webstore/detail/chrome-extension-source-v/jifpbeccnghkjeaalbbjmodiffmgedin?hl=en). Kod źródłowy przeglądarki jest dostępny w [repozytorium GitHub](https://github.com/Rob--W/crxviewer).
|
||||||
|
|
||||||
### Wyświetl źródło lokalnie zainstalowanego rozszerzenia
|
### Wyświetl źródło lokalnie zainstalowanego rozszerzenia
|
||||||
|
|
||||||
Lokalnie zainstalowane rozszerzenia Chrome można również sprawdzić. Oto jak:
|
Lokalnie zainstalowane rozszerzenia Chrome można również sprawdzić. Oto jak:
|
||||||
|
|
||||||
1. Otwórz katalog profilu lokalnego Chrome, odwiedzając `chrome://version/` i zlokalizuj pole "Profile Path".
|
1. Otwórz katalog profilu lokalnego Chrome, odwiedzając `chrome://version/` i zlokalizuj pole "Ścieżka profilu".
|
||||||
2. Przejdź do podfolderu `Extensions/` w katalogu profilu.
|
2. Przejdź do podfolderu `Extensions/` w katalogu profilu.
|
||||||
3. Ten folder zawiera wszystkie zainstalowane rozszerzenia, zazwyczaj z kodem źródłowym w czytelnej formie.
|
3. Ten folder zawiera wszystkie zainstalowane rozszerzenia, zazwyczaj z kodem źródłowym w czytelnej formie.
|
||||||
|
|
||||||
Aby zidentyfikować rozszerzenia, można przyporządkować ich identyfikatory do nazw:
|
Aby zidentyfikować rozszerzenia, można przyporządkować ich identyfikatory do nazw:
|
||||||
|
|
||||||
* Włącz tryb dewelopera na stronie `about:extensions`, aby zobaczyć identyfikatory każdego rozszerzenia.
|
* Włącz tryb dewelopera na stronie `about:extensions`, aby zobaczyć identyfikatory każdego rozszerzenia.
|
||||||
* W każdym folderze rozszerzenia plik `manifest.json` zawiera czytelną wartość pola `name`, co pomaga zidentyfikować rozszerzenie.
|
* Wewnątrz folderu każdego rozszerzenia plik `manifest.json` zawiera czytelną sekcję `name`, co ułatwia identyfikację rozszerzenia.
|
||||||
|
|
||||||
### Użyj Archiwizatora lub Odpakowywacza plików
|
### Użyj Archiwizatora lub Odpakowywacza plików
|
||||||
|
|
||||||
|
@ -545,42 +547,42 @@ Mimo że rozszerzenia przeglądarki mają **ograniczoną powierzchnię ataku**,
|
||||||
* [ ] **Ograniczaj** jak najbardziej **`host_permissions`**
|
* [ ] **Ograniczaj** jak najbardziej **`host_permissions`**
|
||||||
* Użyj **silnej** **`content_security_policy`**
|
* Użyj **silnej** **`content_security_policy`**
|
||||||
* [ ] **Ograniczaj** jak najbardziej **`externally_connectable`**, jeśli nie jest to potrzebne i możliwe, nie pozostawiaj go domyślnie, określ **`{}`**
|
* [ ] **Ograniczaj** jak najbardziej **`externally_connectable`**, jeśli nie jest to potrzebne i możliwe, nie pozostawiaj go domyślnie, określ **`{}`**
|
||||||
* [ ] Jeśli tutaj wymieniony jest **URL podatny na XSS lub przejęcie**, atakujący będzie mógł **wysyłać wiadomości bezpośrednio do skryptów tła**. Bardzo potężne obejście.
|
* [ ] Jeśli tutaj wymieniony jest **URL podatny na XSS lub przejęcie**, atakujący będzie mógł **wysyłać wiadomości bezpośrednio do skryptów w tle**. Bardzo potężne obejście.
|
||||||
* [ ] **Ograniczaj** jak najbardziej **`web_accessible_resources`**, nawet jeśli jest puste, jeśli to możliwe.
|
* [ ] **Ograniczaj** jak najbardziej **`web_accessible_resources`**, nawet jeśli jest puste, jeśli to możliwe.
|
||||||
* [ ] Jeśli **`web_accessible_resources`** nie jest puste, sprawdź [**ClickJacking**](browext-clickjacking.md)
|
* [ ] Jeśli **`web_accessible_resources`** nie jest puste, sprawdź [**ClickJacking**](browext-clickjacking.md)
|
||||||
* [ ] Jeśli zachodzi jakakolwiek **komunikacja** z **rozszerzenia** do **strony internetowej**, sprawdź **podatności na XSS** spowodowane w komunikacji.
|
* [ ] Jeśli zachodzi jakakolwiek **komunikacja** z **rozszerzenia** do **strony internetowej**, [**sprawdź pod kątem XSS**](browext-xss-example.md) **podatności** wynikających z komunikacji.
|
||||||
* [ ] Jeśli są używane Post Messages, sprawdź [**podatności na Post Message**](../postmessage-vulnerabilities/)**.**
|
* [ ] Jeśli są używane Post Messages, sprawdź [**podatności Post Message**](../postmessage-vulnerabilities/)**.**
|
||||||
* [ ] Jeśli **Skrypt zawartości uzyskuje dostęp do szczegółów DOM**, sprawdź, czy nie wprowadzają one XSS, jeśli zostaną **zmodyfikowane** przez stronę internetową
|
* [ ] Jeśli **Skrypt zawartości uzyskuje dostęp do szczegółów DOM**, sprawdź, czy nie wprowadzają one XSS, jeśli zostaną **zmodyfikowane** przez stronę internetową
|
||||||
* [ ] Zwróć szczególną uwagę, jeśli ta komunikacja jest również zaangażowana w **komunikację Skryptu zawartości -> Skrypt tła**
|
* [ ] Zwróć szczególną uwagę, jeśli ta komunikacja jest również zaangażowana w **komunikację Skryptu zawartości -> Skryptu w tle**
|
||||||
* [ ] **Informacje poufne nie powinny być przechowywane** w kodzie rozszerzenia przeglądarki
|
* **Wrażliwe informacje nie powinny być przechowywane** w kodzie rozszerzenia przeglądarki
|
||||||
* [ ] **Informacje poufne nie powinny być przechowywane** w pamięci rozszerzenia przeglądarki
|
* **Wrażliwe informacje nie powinny być przechowywane** w pamięci rozszerzenia przeglądarki
|
||||||
|
|
||||||
## Narzędzia
|
## Narzędzia
|
||||||
|
|
||||||
### [**Tarnish**](https://thehackerblog.com/tarnish/)
|
### [**Tarnish**](https://thehackerblog.com/tarnish/)
|
||||||
|
|
||||||
* Pobiera dowolne rozszerzenie Chrome z podanego linku ze Sklepu Chrome.
|
* Pobiera dowolne rozszerzenie Chrome z podanego linku ze Sklepu Chrome.
|
||||||
* [**manifest.json**](https://developer.chrome.com/extensions/manifest) **viewer**: po prostu wyświetla sformatowaną w JSON wersję manifestu rozszerzenia.
|
* Przeglądarka [**manifest.json**](https://developer.chrome.com/extensions/manifest): po prostu wyświetla sformatowaną w JSON wersję manifestu rozszerzenia.
|
||||||
* Analiza odcisku palca: Wykrywanie [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) i automatyczna generacja JavaScriptu do odcisku palca rozszerzenia Chrome.
|
* Analiza odcisku palca: Wykrywanie [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) i automatyczna generacja JavaScriptu do odcisku palca rozszerzenia Chrome.
|
||||||
* Analiza potencjalnego Clickjackingu: Wykrywanie stron HTML rozszerzenia z dyrektywą [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources). Są one potencjalnie podatne na clickjacking w zależności od celu stron.
|
* Analiza potencjalnego Clickjackingu: Wykrywanie stron HTML rozszerzenia z dyrektywą [web\_accessible\_resources](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources). Są one potencjalnie podatne na clickjacking w zależności od celu stron.
|
||||||
* Przeglądarka ostrzeżeń o uprawnieniach: pokazuje listę wszystkich ostrzeżeń dotyczących uprawnień Chrome, które zostaną wyświetlone podczas próby instalacji rozszerzenia przez użytkownika.
|
* Przeglądarka ostrzeżeń o uprawnieniach: pokazuje listę wszystkich ostrzeżeń dotyczących uprawnień Chrome, które zostaną wyświetlone podczas próby instalacji rozszerzenia przez użytkownika.
|
||||||
* **Funkcje niebezpieczne**: pokazuje lokalizację funkcji niebezpiecznych, które potencjalnie mogą zostać wykorzystane przez atakującego (np. funkcje takie jak innerHTML, chrome.tabs.executeScript).
|
* **Funkcje niebezpieczne**: pokazuje lokalizację funkcji niebezpiecznych, które potencjalnie mogą być wykorzystane przez atakującego (np. funkcje takie jak innerHTML, chrome.tabs.executeScript).
|
||||||
* **Punkty wejścia**: pokazuje, gdzie rozszerzenie przyjmuje dane od użytkownika/zewnętrzne. Jest to przydatne do zrozumienia obszaru powierzchni ataku rozszerzenia i poszukiwania potencjalnych punktów do przesłania złośliwie spreparowanych danych do rozszerzenia.
|
* **Punkty wejścia**: pokazuje, gdzie rozszerzenie przyjmuje dane od użytkownika/zewnętrzne dane. Jest to przydatne do zrozumienia obszaru powierzchni ataku rozszerzenia i poszukiwania potencjalnych punktów do przesyłania złośliwie spreparowanych danych do rozszerzenia.
|
||||||
* Zarówno skanery Funkcji niebezpiecznych, jak i Punkty wejścia mają następujące elementy dla wygenerowanych alertów:
|
* Zarówno skanery Funkcji niebezpiecznych, jak i Punkty wejścia mają następujące elementy dla wygenerowanych alertów:
|
||||||
* Istotny fragment kodu i linia, która spowodowała alert.
|
* Istotny fragment kodu i linia, która spowodowała alert.
|
||||||
* Opis problemu.
|
* Opis problemu.
|
||||||
* Przycisk „Wyświetl plik”, aby zobaczyć pełny plik źródłowy zawierający kod.
|
* Przycisk „Wyświetl plik”, aby zobaczyć pełny plik źródłowy zawierający kod.
|
||||||
* Ścieżka pliku, który wywołał alert.
|
* Ścieżka pliku, który wywołał alert.
|
||||||
* Pełny URI rozszerzenia Chrome pliku, który wywołał alert.
|
* Pełny URI rozszerzenia Chrome pliku, który wywołał alert.
|
||||||
* Typ pliku, taki jak skrypt strony tła, skrypt zawartości, akcja przeglądarki, itp.
|
* Typ pliku, taki jak skrypt strony w tle, skrypt zawartości, akcja przeglądarki, itp.
|
||||||
* Jeśli podatna linia znajduje się w pliku JavaScript, ścieżki wszystkich stron, gdzie jest ona zawarta, oraz status [web\_accessible\_resource](https://developer.chrome.com/extensions/manifest/web\_accessible\_resources) tych stron.
|
* Jeśli podatna linia znajduje się w pliku JavaScript, ścieżki wszystkich stron, gdzie jest ona zawarta, oraz status [web\_accessible\_resource](https://developer.chrome.com/extensions/manifest/web\_accessible_resources).
|
||||||
* **Analizator i sprawdzarka polityki bezpieczeństwa zawartości (CSP)**: Wskaże słabe punkty w polityce CSP Twojego rozszerzenia i oświetli potencjalne sposoby na jej obejście z powodu zatwierdzonych na biało CDN itp.
|
* **Analizator zasad bezpieczeństwa zawartości (CSP) i sprawdzarka bypass**: Wskaże słabe punkty w zasadach CSP Twojego rozszerzenia oraz oświetli potencjalne sposoby na obejście CSP z powodu zatwierdzonych na białej liście CDN itp.
|
||||||
* **Znane biblioteki podatne na ataki**: Wykorzystuje [Retire.js](https://retirejs.github.io/retire.js/) do sprawdzenia, czy używane są znane biblioteki JavaScript podatne na ataki.
|
* **Znane biblioteki podatne**: Wykorzystuje [Retire.js](https://retirejs.github.io/retire.js/) do sprawdzenia, czy używane są znane biblioteki JavaScript podatne na ataki.
|
||||||
* Pobierz rozszerzenie i sformatowane wersje.
|
* Pobierz rozszerzenie i sformatowane wersje.
|
||||||
* Pobierz oryginalne rozszerzenie.
|
* Pobierz oryginalne rozszerzenie.
|
||||||
* Pobierz sformatowaną wersję rozszerzenia (automatycznie sformatowany HTML i JavaScript).
|
* Pobierz sformatowaną wersję rozszerzenia (automatycznie sformatowany HTML i JavaScript).
|
||||||
* Automatyczne buforowanie wyników skanowania, pierwsze uruchomienie skanowania rozszerzenia zajmie sporo czasu. Jednak drugie uruchomienie, zakładając, że rozszerzenie nie zostało zaktualizowane, będzie prawie natychmiastowe dzięki buforowaniu wyników.
|
* Automatyczne buforowanie wyników skanowania, uruchomienie skanowania rozszerzenia zajmie sporo czasu za pierwszym razem. Jednak drugi raz, zakładając, że rozszerzenie nie zostało zaktualizowane, będzie prawie natychmiastowe dzięki buforowaniu wyników.
|
||||||
* Linkowalne adresy URL raportów, łatwe przekazanie komuś innemu raportu o rozszerzeniu wygenerowanego przez tarnish.
|
* Linkowalne adresy URL raportów, łatwo przekieruj kogoś do raportu rozszerzenia wygenerowanego przez tarnish.
|
||||||
|
|
||||||
### [Neto](https://github.com/elevenpaths/neto)
|
### [Neto](https://github.com/elevenpaths/neto)
|
||||||
|
|
||||||
|
@ -606,7 +608,7 @@ Projekt Neto to pakiet Python 3 stworzony do analizy i odkrywania ukrytych funkc
|
||||||
Inne sposoby wsparcia HackTricks:
|
Inne sposoby wsparcia HackTricks:
|
||||||
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
|
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
|
||||||
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
* Zdobądź [**oficjalne gadżety PEASS & HackTricks**](https://peass.creator-spring.com)
|
||||||
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
|
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFTów**](https://opensea.io/collection/the-peass-family)
|
||||||
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegram**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegram**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
|
||||||
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na githubie.
|
* **Podziel się swoimi sztuczkami hakerskimi, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) repozytoriów na githubie.
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue