hacktricks/mobile-pentesting/android-app-pentesting/webview-attacks.md

151 lines
9.6 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

# Ataki na WebView
<details>
<summary><strong>Naucz się hakować 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:
* 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)
* Odkryj [**Rodzinę PEASS**](https://opensea.io/collection/the-peass-family), naszą kolekcję ekskluzywnych [**NFT**](https://opensea.io/collection/the-peass-family)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](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) na GitHubie.
</details>
## Przewodnik po Konfiguracjach i Bezpieczeństwie WebView
### Przegląd Zagrożeń WebView
Krytycznym aspektem rozwoju aplikacji na Androida jest poprawne zarządzanie WebViews. Ten przewodnik podkreśla kluczowe konfiguracje i praktyki bezpieczeństwa mające na celu zmniejszenie ryzyka związanego z użyciem WebView.
![Przykład WebView](<../../.gitbook/assets/image (718).png>)
### **Dostęp do Plików w WebViews**
Domyślnie WebViews pozwalają na dostęp do plików. Funkcjonalność ta jest kontrolowana przez metodę `setAllowFileAccess()`, dostępną od poziomu API Androida 3 (Cupcake 1.5). Aplikacje z uprawnieniem **android.permission.READ\_EXTERNAL\_STORAGE** mogą odczytywać pliki z zewnętrznego przechowywania za pomocą schematu adresu URL pliku (`file://ścieżka/do/pliku`).
#### **Funkcje przestarzałe: Uniwersalny dostęp i Dostęp do plików z adresów URL**
* **Uniwersalny dostęp z adresów URL pliku**: Ta funkcja, która została oznaczona jako przestarzała, umożliwiała żądania międzydomenowe z adresów URL pliku, stanowiąc znaczące ryzyko bezpieczeństwa związanego z potencjalnymi atakami XSS. Domyślne ustawienie jest wyłączone (`false`) dla aplikacji kierowanych na Androida Jelly Bean i nowsze.
* Aby sprawdzić to ustawienie, użyj `getAllowUniversalAccessFromFileURLs()`.
* Aby zmodyfikować to ustawienie, użyj `setAllowUniversalAccessFromFileURLs(boolean)`.
* **Dostęp do plików z adresów URL pliku**: Ta również przestarzała funkcja kontrolowała dostęp do treści z innych adresów URL schematu pliku. Podobnie jak uniwersalny dostęp, domyślnie jest wyłączona dla zwiększonego bezpieczeństwa.
* Użyj `getAllowFileAccessFromFileURLs()` do sprawdzenia i `setAllowFileAccessFromFileURLs(boolean)` do ustawienia.
#### **Bezpieczne Ładowanie Plików**
Aby wyłączyć dostęp do systemu plików, zachowując jednocześnie dostęp do zasobów i zasobów, używana jest metoda `setAllowFileAccess()`. W przypadku Androida R i nowszych, domyślne ustawienie to `false`.
* Sprawdź za pomocą `getAllowFileAccess()`.
* Włącz lub wyłącz za pomocą `setAllowFileAccess(boolean)`.
#### **WebViewAssetLoader**
Klasa **WebViewAssetLoader** to nowoczesne podejście do ładowania plików lokalnych. Wykorzystuje adresy URL http(s) do dostępu do lokalnych zasobów i zasobów, zgodnie z zasadą tego samego pochodzenia, ułatwiając zarządzanie CORS.
### loadUrl
To powszechna funkcja używana do ładowania dowolnych adresów URL w WebView:
```java
webview.loadUrl("<url here>")
```
Oczywiście, potencjalny atakujący nigdy nie powinien móc **kontrolować adresu URL**, który ma zostać załadowany przez aplikację.
### **Obsługa JavaScriptu i schematu Intent**
* **JavaScript**: Domyślnie wyłączony w WebViews, może być włączony za pomocą `setJavaScriptEnabled()`. Należy zachować ostrożność, ponieważ włączenie JavaScriptu bez odpowiednich zabezpieczeń może wprowadzić podatności na ataki.
* **Schemat Intent**: WebViews mogą obsługiwać schemat `intent`, co potencjalnie prowadzi do eksploatacji, jeśli nie jest ostrożnie zarządzany. Przykładem podatności było ujawnione parametru WebView "support\_url", który mógł być wykorzystany do wykonania ataków typu cross-site scripting (XSS).
![Podatna WebView](<../../.gitbook/assets/image (719).png>)
Przykład eksploatacji za pomocą adb:
{% code overflow="wrap" %}
```bash
adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView es support_url "https://example.com/xss.html"
```
### Most JavaScript Bridge
Android udostępnia funkcję, która umożliwia **JavaScriptowi** w WebView wywoływanie **funkcji natywnych aplikacji Android**. Jest to osiągane poprzez wykorzystanie metody `addJavascriptInterface`, która integruje JavaScript z funkcjami natywnymi Androida, określanymi jako _mostek JavaScript WebView_. Zaleca się ostrożność, ponieważ ta metoda pozwala wszystkim stronom w WebView na dostęp do zarejestrowanego obiektu interfejsu JavaScript, co stanowi ryzyko bezpieczeństwa, jeśli wrażliwe informacje są ujawnione poprzez te interfejsy.
* **Wymagana jest skrajna ostrożność** dla aplikacji kierowanych na wersje Androida poniżej 4.2 z powodu podatności umożliwiającej zdalne wykonanie kodu poprzez złośliwy JavaScript, wykorzystujący odbicie.
#### Implementacja mostka JavaScript
* **Interfejsy JavaScript** mogą współdziałać z kodem natywnym, jak pokazano w przykładach, gdzie metoda klasy jest udostępniana JavaScriptowi:
```javascript
@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
```
* JavaScript Bridge jest włączony poprzez dodanie interfejsu do WebView:
```javascript
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
webView.reload();
```
* Potencjalne wykorzystanie poprzez JavaScript, na przykład za pomocą ataku XSS, umożliwia wywołanie odsłoniętych metod Javy:
```html
<script>alert(javascriptBridge.getSecret());</script>
```
* Aby zmniejszyć ryzyko, **ogranicz używanie mostka JavaScript** do kodu dostarczonego w pliku APK i zapobiegaj ładowaniu JavaScript z zdalnych źródeł. Dla starszych urządzeń ustaw minimalny poziom API na 17.
### Wykonanie zdalnego kodu (RCE) oparte na refleksji
* Udokumentowana metoda pozwala osiągnąć RCE poprzez refleksję poprzez wykonanie określonego ładunku. Jednak adnotacja `@JavascriptInterface` zapobiega nieautoryzowanemu dostępowi do metody, ograniczając powierzchnię ataku.
### Zdalne debugowanie
* **Zdalne debugowanie** jest możliwe dzięki **Chrome Developer Tools**, umożliwiając interakcję i dowolne wykonanie JavaScript w treści WebView.
#### Włączanie zdalnego debugowania
* Zdalne debugowanie można włączyć dla wszystkich widoków WebView w aplikacji poprzez:
```java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
```
* Aby warunkowo włączyć debugowanie na podstawie stanu debugowania aplikacji:
```java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}
```
## Wyciek dowolnych plików
* Demonstruje wyciek dowolnych plików za pomocą obiektu XMLHttpRequest:
```javascript
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
if (xhr.readyState == XMLHttpRequest.DONE) {
alert(xhr.responseText);
}
}
xhr.open('GET', 'file:///data/data/com.authenticationfailure.wheresmybrowser/databases/super_secret.db', true);
xhr.send(null);
```
## Odnośniki
* [https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html](https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html)
* [https://github.com/authenticationfailure/WheresMyBrowser.Android](https://github.com/authenticationfailure/WheresMyBrowser.Android)
* [https://developer.android.com/reference/android/webkit/WebView](https://developer.android.com/reference/android/webkit/WebView)
* [https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1](https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1)
* [https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I](https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I)
<details>
<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:
* Jeśli chcesz zobaczyć swoją **firmę reklamowaną w HackTricks** lub **pobrać HackTricks w formacie PDF**, sprawdź [**PLANY SUBSKRYPCYJNE**](https://github.com/sponsors/carlospolop)!
* Kup [**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)
* **Dołącz do** 💬 [**grupy Discord**](https://discord.gg/hRep4RUj7f) lub [**grupy telegramowej**](https://t.me/peass) lub **śledź** nas na **Twitterze** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**.**
* **Podziel się swoimi sztuczkami hakowania, przesyłając PR-y do** [**HackTricks**](https://github.com/carlospolop/hacktricks) i [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github repos.
</details>