iOS WebViews
Last updated
Last updated
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)
The code of this page was extracted from here. Check the page for further details.
WebViews, uygulamalar içinde etkileşimli web içeriği görüntülemek için kullanılır. Farklı WebViews türleri, iOS uygulamaları için farklı işlevsellikler ve güvenlik özellikleri sunar. İşte kısa bir genel bakış:
UIWebView, JavaScript'i devre dışı bırakma desteği olmadığı için iOS 12'den itibaren artık önerilmemektedir; bu da onu script injection ve Cross-Site Scripting (XSS) saldırılarına karşı savunmasız hale getirir.
WKWebView, uygulamalara web içeriği eklemek için tercih edilen seçenektir ve içerik üzerinde daha fazla kontrol ve güvenlik özellikleri sunar. JavaScript varsayılan olarak etkindir, ancak gerekirse devre dışı bırakılabilir. Ayrıca, JavaScript'in otomatik olarak pencereler açmasını önlemek için özellikler destekler ve tüm içeriğin güvenli bir şekilde yüklenmesini sağlar. Ayrıca, WKWebView'in mimarisi, bellek bozulması riskini ana uygulama sürecini etkileyecek şekilde en aza indirir.
SFSafariViewController, uygulamalar içinde standart bir web tarayıcı deneyimi sunar; okunabilir bir adres alanı, paylaşım ve navigasyon düğmeleri ile Safari'de içerik açmak için doğrudan bir bağlantı içeren belirli bir düzen ile tanınır. WKWebView'in aksine, JavaScript SFSafariViewController'da devre dışı bırakılamaz; ayrıca çerezleri ve verileri Safari ile paylaşır, bu da kullanıcı gizliliğini uygulamadan korur. App Store yönergelerine göre belirgin bir şekilde görüntülenmelidir.
WebViews konfigürasyonlarını incelerken, iki ana tür üzerinde durulmaktadır: UIWebView ve WKWebView. Bu WebView'ları bir ikili dosya içinde tanımlamak için, belirli sınıf referansları ve başlatma yöntemlerini arayan komutlar kullanılmaktadır.
UIWebView Tanımlama
Bu komut, ikili dosyada buna ilişkin metin dizelerini arayarak UIWebView örneklerini bulmaya yardımcı olur.
WKWebView Tanımlama
Benzer şekilde, WKWebView için bu komut, kullanımını gösteren metin dizelerini ikili dosyada arar.
Ayrıca, bir WKWebView'in nasıl başlatıldığını bulmak için, başlatılmasıyla ilgili yöntem imzasını hedef alan aşağıdaki komut çalıştırılır:
WKWebView için, JavaScript'in devre dışı bırakılmasının gerekli olmadıkça en iyi uygulama olduğu vurgulanmaktadır. Derlenmiş ikili dosya, javaScriptEnabled
özelliğinin false
olarak ayarlandığını doğrulamak için aranır, böylece JavaScript'in devre dışı olduğu garanti edilir:
WKWebView, UIWebView ile karşılaştırıldığında karışık içerik sorunlarını tanımlama yeteneği sunar. Bu, tüm sayfa kaynaklarının güvenli bağlantılar üzerinden yüklendiğinden emin olmak için hasOnlySecureContent
özelliği kullanılarak kontrol edilir. Derlenmiş ikide arama şu şekilde gerçekleştirilir:
Dinamik analiz, WebView örneklerini ve özelliklerini incelemeyi içerir. Bu amaçla webviews_inspector.js
adlı bir script kullanılır ve UIWebView
, WKWebView
ve SFSafariViewController
örneklerini hedef alır. Bulunan örnekler hakkında, URL'ler ve JavaScript ile güvenli içerikle ilgili ayarlar dahil olmak üzere bilgi kaydeder.
Yığın incelemesi, WebView örneklerini tanımlamak ve javaScriptEnabled
ve hasonlysecurecontent
özelliklerini kontrol etmek için ObjC.choose()
kullanılarak gerçekleştirilebilir.
Script şu şekilde çalıştırılır:
Ana Sonuçlar:
WebView örnekleri başarıyla bulunmuş ve incelenmiştir.
JavaScript etkinleştirme ve güvenli içerik ayarları doğrulanmıştır.
Bu özet, JavaScript etkinleştirme ve karışık içerik tespiti gibi güvenlik özelliklerine odaklanarak, WebView yapılandırmalarını statik ve dinamik yaklaşımlarla analiz etme sürecindeki kritik adımları ve komutları kapsar.
WebView'lerde içerik yönetimi, özellikle http(s)://
, file://
ve tel://
gibi çeşitli protokollerle çalışırken kritik bir unsurdur. Bu protokoller, uygulamalar içinde hem uzaktan hem de yerel içeriğin yüklenmesini sağlar. Yerel içerik yüklenirken, kullanıcıların dosya adını veya yolunu etkilemesini ve içeriği düzenlemesini önlemek için önlemler alınması gerektiği vurgulanmaktadır.
WebView'ler, içerik yüklemek için farklı yöntemler sunar. Artık kullanılmayan UIWebView için loadHTMLString:baseURL:
ve loadData:MIMEType:textEncodingName:baseURL:
gibi yöntemler kullanılır. Diğer yandan, WKWebView, web içeriği için loadHTMLString:baseURL:
, loadData:MIMEType:textEncodingName:baseURL:
ve loadRequest:
yöntemlerini kullanır. Yerel dosyaları yüklemek için genellikle pathForResource:ofType:
, URLForResource:withExtension:
ve init(contentsOf:encoding:)
gibi yöntemler kullanılır. loadFileURL:allowingReadAccessToURL:
yöntemi, belirli bir URL veya dizini WebView'e yükleme yeteneği ile özellikle dikkat çekicidir; eğer bir dizin belirtilirse hassas verileri açığa çıkarabilir.
Bu yöntemleri kaynak kodunda veya derlenmiş ikili dosyada bulmak için aşağıdaki gibi komutlar kullanılabilir:
Dosya erişimi ile ilgili olarak, UIWebView evrensel olarak buna izin verirken, WKWebView dosya URL'lerinden erişimi yönetmek için allowFileAccessFromFileURLs
ve allowUniversalAccessFromFileURLs
ayarlarını tanıtır; her ikisi de varsayılan olarak false'dur.
Güvenlik ayarları için WKWebView yapılandırmalarını incelemek üzere bir Frida script örneği sağlanmıştır:
Son olarak, yerel dosyaları dışa aktarmayı amaçlayan bir JavaScript yükü, yanlış yapılandırılmış WebView'larla ilişkili potansiyel güvenlik riskini göstermektedir. Bu yük, dosya içeriklerini sunucuya iletmeden önce hex formatına kodlar, WebView uygulamalarında sıkı güvenlik önlemlerinin önemini vurgular.
iOS 7'den itibaren, Apple WebView'deki JavaScript ile native Swift veya Objective-C nesneleri arasında iletişim için API'ler sağladı. Bu entegrasyon esasen iki yöntemle sağlanmaktadır:
JSContext: Bir Swift veya Objective-C bloğu, bir JSContext
içindeki bir tanımlayıcıya bağlandığında otomatik olarak bir JavaScript fonksiyonu oluşturulur. Bu, JavaScript ve native kod arasında sorunsuz bir entegrasyon ve iletişim sağlar.
JSExport Protokolü: JSExport
protokolünü miras alarak, native özellikler, örnek yöntemler ve sınıf yöntemleri JavaScript'e açılabilir. Bu, JavaScript ortamında yapılan herhangi bir değişikliğin native ortamda yansıtıldığı ve tersinin de geçerli olduğu anlamına gelir. Ancak, bu yöntemle hassas verilerin istemeden açığa çıkmadığından emin olmak önemlidir.
JSContext
'e ErişimObjective-C'de, bir UIWebView
için JSContext
aşağıdaki kod satırı ile alınabilir:
WKWebView
WKWebView
için, JSContext
'e doğrudan erişim mevcut değildir. Bunun yerine, JavaScript ile yerel iletişim sağlamak için postMessage
fonksiyonu aracılığıyla mesaj iletimi kullanılır. Bu mesajlar için işleyiciler aşağıdaki gibi ayarlanır, böylece JavaScript yerel uygulama ile güvenli bir şekilde etkileşimde bulunabilir:
JavaScript, bir script mesaj işleyici tanımlayarak yerel katmanla etkileşimde bulunabilir. Bu, bir web sayfasından yerel işlevleri çağırmak gibi işlemlere olanak tanır:
Yerel bir fonksiyon çağrısının sonucunu yakalamak ve manipüle etmek için, HTML içinde geri çağırma fonksiyonunu geçersiz kılmak mümkündür:
Yerel taraf, JavaScriptBridgeMessageHandler
sınıfında gösterildiği gibi JavaScript çağrısını işler; burada sayıların çarpılması gibi işlemlerin sonuçları işlenir ve görüntüleme veya daha fazla manipülasyon için JavaScript'e geri gönderilir:
(Tutorial based on the one from https://blog.vuplex.com/debugging-webviews)
iOS webview'leri içindeki web içeriğini etkili bir şekilde hata ayıklamak için, console.log()
'a gönderilen mesajların Xcode günlüklerinde görüntülenmemesi nedeniyle Safari'nin geliştirici araçlarını içeren özel bir kurulum gereklidir. İşte ana adımları ve gereksinimleri vurgulayan basitleştirilmiş bir kılavuz:
iOS Cihazında Hazırlık: Safari Web Inspector, iOS cihazınızda etkinleştirilmelidir. Bu, Ayarlar > Safari > Gelişmiş bölümüne giderek Web Inspector seçeneğini etkinleştirerek yapılır.
macOS Cihazında Hazırlık: macOS geliştirme makinenizde, Safari içinde geliştirici araçlarını etkinleştirmeniz gerekir. Safari'yi başlatın, Safari > Tercihler > Gelişmiş bölümüne erişin ve Geliştir menüsünü Göster seçeneğini seçin.
Bağlantı ve Hata Ayıklama: iOS cihazınızı macOS bilgisayarınıza bağladıktan ve uygulamanızı başlattıktan sonra, macOS cihazınızdaki Safari'yi kullanarak hata ayıklamak istediğiniz webview'i seçin. Safari'nin menü çubuğunda Geliştir bölümüne gidin, iOS cihazınızın adının üzerine gelerek webview örneklerinin bir listesini görün ve incelemek istediğiniz örneği seçin. Bu amaçla yeni bir Safari Web Inspector penceresi açılacaktır.
Ancak, sınırlamaların farkında olun:
Bu yöntemle hata ayıklama, Safari'ye dayandığı için bir macOS cihazı gerektirir.
Sadece Xcode aracılığıyla cihazınıza yüklenen uygulamalardaki webview'ler hata ayıklama için uygundur. App Store veya Apple Configurator aracılığıyla yüklenen uygulamalardaki webview'ler bu şekilde hata ayıklanamaz.
Learn & practice AWS Hacking:HackTricks Training AWS Red Team Expert (ARTE) Learn & practice GCP Hacking: HackTricks Training GCP Red Team Expert (GRTE)