132 lines
7.1 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.

# Webview napadi
{{#include ../../banners/hacktricks-training.md}}
## Vodič o WebView konfiguracijama i bezbednosti
### Pregled WebView ranjivosti
Kritičan aspekt Android razvoja uključuje pravilno rukovanje WebView-ima. Ovaj vodič ističe ključne konfiguracije i bezbednosne prakse za smanjenje rizika povezanih sa korišćenjem WebView-a.
![WebView primer](<../../images/image (1190).png>)
### **Pristup datotekama u WebView-ima**
Po defaultu, WebView-ima je dozvoljen pristup datotekama. Ova funkcionalnost se kontroliše metodom `setAllowFileAccess()`, dostupnom od Android API nivoa 3 (Cupcake 1.5). Aplikacije sa dozvolom **android.permission.READ_EXTERNAL_STORAGE** mogu čitati datoteke sa spoljnog skladišta koristeći URL šemu datoteke (`file://path/to/file`).
#### **Zastarjele funkcije: Univerzalni i pristup datotekama sa URL-ova**
- **Univerzalni pristup sa URL-ova datoteka**: Ova zastarela funkcija je omogućavala cross-origin zahteve sa URL-ova datoteka, predstavljajući značajan bezbednosni rizik zbog potencijalnih XSS napada. Podrazumevana postavka je onemogućena (`false`) za aplikacije koje cilјaju Android Jelly Bean i novije.
- Da biste proverili ovu postavku, koristite `getAllowUniversalAccessFromFileURLs()`.
- Da biste izmenili ovu postavku, koristite `setAllowUniversalAccessFromFileURLs(boolean)`.
- **Pristup datotekama sa URL-ova datoteka**: Ova funkcija, takođe zastarela, kontrolisala je pristup sadržaju sa drugih URL-ova šeme datoteka. Kao i univerzalni pristup, njena podrazumevana postavka je onemogućena radi poboljšane bezbednosti.
- Koristite `getAllowFileAccessFromFileURLs()` za proveru i `setAllowFileAccessFromFileURLs(boolean)` za postavljanje.
#### **Sigurno učitavanje datoteka**
Za onemogućavanje pristupa sistemu datoteka dok se i dalje pristupa resursima i sredstvima, koristi se metoda `setAllowFileAccess()`. Sa Android R i novijim, podrazumevana postavka je `false`.
- Proverite sa `getAllowFileAccess()`.
- Omogućite ili onemogućite sa `setAllowFileAccess(boolean)`.
#### **WebViewAssetLoader**
Klasa **WebViewAssetLoader** je savremeni pristup za učitavanje lokalnih datoteka. Koristi http(s) URL-ove za pristup lokalnim sredstvima i resursima, usklađujući se sa politikom iste porekla, čime se olakšava upravljanje CORS-om.
### loadUrl
Ovo je uobičajena funkcija koja se koristi za učitavanje proizvoljnih URL-ova u webview:
```java
webview.loadUrl("<url here>")
```
Ofc, potencijalni napadač nikada ne bi trebao moći da **kontroliše URL** koji aplikacija učitava.
### **JavaScript i upravljanje Intent shemama**
- **JavaScript**: Onemogućen po defaultu u WebView-ima, može se omogućiti putem `setJavaScriptEnabled()`. Preporučuje se oprez jer omogućavanje JavaScripta bez odgovarajućih zaštita može uvesti sigurnosne ranjivosti.
- **Intent shema**: WebView-i mogu obraditi `intent` shemu, što može dovesti do eksploatacija ako se ne upravlja pažljivo. Jedna ranjivost uključivala je izloženi WebView parametar "support_url" koji se mogao iskoristiti za izvršavanje napada skriptiranja između sajtova (XSS).
![Vulnerable WebView](<../../images/image (1191).png>)
Primer eksploatacije koristeći adb:
```bash
adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView es support_url "https://example.com/xss.html"
```
### Javascript Bridge
Funkcija koju pruža Android omogućava **JavaScript** u WebView-u da poziva **nativne Android aplikacione funkcije**. To se postiže korišćenjem `addJavascriptInterface` metode, koja integriše JavaScript sa nativnim Android funkcionalnostima, nazvanim _WebView JavaScript bridge_. Preporučuje se oprez jer ova metoda omogućava svim stranicama unutar WebView-a da pristupe registrovanom JavaScript Interface objektu, što predstavlja bezbednosni rizik ako se osetljive informacije izlože putem ovih interfejsa.
- **Ekstremni oprez je potreban** za aplikacije koje cilјaju Android verzije ispod 4.2 zbog ranjivosti koja omogućava dalјinsko izvršavanje koda putem zlonamernog JavaScript-a, koristeći refleksiju.
#### Implementacija JavaScript Bridge-a
- **JavaScript interfejsi** mogu interagovati sa nativnim kodom, kao što je prikazano u primerima gde je metoda klase izložena JavaScript-u:
```javascript
@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
```
- JavaScript Bridge se omogućava dodavanjem interfejsa u WebView:
```javascript
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge")
webView.reload()
```
- Potencijalna eksploatacija putem JavaScript-a, na primer, putem XSS napada, omogućava pozivanje izloženih Java metoda:
```html
<script>
alert(javascriptBridge.getSecret())
</script>
```
- Da biste smanjili rizike, **ograničite korišćenje JavaScript mosta** na kod koji je isporučen sa APK-om i sprečite učitavanje JavaScript-a iz udaljenih izvora. Za starije uređaje, postavite minimalni API nivo na 17.
### Izvršenje daljinskog koda zasnovano na refleksiji (RCE)
- Dokumentovana metoda omogućava postizanje RCE putem refleksije izvršavanjem specifičnog payload-a. Međutim, `@JavascriptInterface` anotacija sprečava neovlašćen pristup metodama, ograničavajući površinu napada.
### Daljinsko debagovanje
- **Daljinsko debagovanje** je moguće sa **Chrome Developer Tools**, omogućavajući interakciju i proizvoljno izvršavanje JavaScript-a unutar WebView sadržaja.
#### Omogućavanje daljinskog debagovanja
- Daljinsko debagovanje može biti omogućeno za sve WebView-ove unutar aplikacije na sledeći način:
```java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
```
- Da uslovno omogućite debagovanje na osnovu stanja debagovanja aplikacije:
```java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}
```
## Ekstrakcija proizvoljnih fajlova
- Prikazuje ekstrakciju proizvoljnih fajlova koristeći 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)
```
## Reference
- [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)
{{#include ../../banners/hacktricks-training.md}}