Webview Saldırıları

Reading time: 5 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)

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 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çerik erişimini kontrol etmiştir. Evrensel erişimde olduğu gibi, varsayılan ayarı artırılmış güvenlik 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'de 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ışı bırakılmıştı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 durumlarına yol açabilir. Bir örnek güvenlik açığı, "support_url" adlı bir WebView parametresinin ifşa edilmesiyle ilgiliydi; 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 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 sayaları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 güvenlik açığı 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 eklenerek 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 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)

HackTricks'i Destekleyin