iOS Universal Links

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

HackTricks'i desteklemenin diğer yolları:

Giriş

Evrensel bağlantılar, kullanıcılara Safari yönlendirmesi gereksinimini atlayarak içeriği doğrudan uygulamada açarak kesintisiz bir yönlendirme deneyimi sunar. Bu bağlantılar, diğer uygulamalar tarafından talep edilemez ve güvenlidir. Bu, apple-app-site-association JSON dosyasının web sitesinin kök dizininde barındırılmasıyla sağlanır ve web sitesi ile uygulama arasında doğrulanabilir bir bağlantı kurar. Uygulama yüklü olmadığı durumlarda, Safari kullanıcıyı web sayfasına yönlendirir ve uygulamanın varlığını sürdürür.

Sızma testçileri için apple-app-site-association dosyası özellikle ilgi çekicidir, çünkü bu dosya, yayınlanmamış özelliklerle ilgili olabilecek duyarlı yolları ortaya çıkarabilir.

İlişkili Alan Yetkisi'nin Analizi

Geliştiriciler, Universal Bağlantıları Xcode'un Yetenekler sekmesinde İlişkili Alanlar'ı yapılandırarak veya .entitlements dosyasını inceleyerek etkinleştirir. Her alan applinks: ile önekiyle belirtilir. Örneğin, Telegram'ın yapılandırması aşağıdaki gibi görünebilir:

<key>com.apple.developer.associated-domains</key>
<array>
<string>applinks:telegram.me</string>
<string>applinks:t.me</string>
</array>

Daha kapsamlı bilgilere ulaşmak için arşivlenmiş Apple Geliştirici Belgeleri'ne başvurun.

Derlenmiş bir uygulama ile çalışılıyorsa, yetkilendirmeler bu kılavuzda belirtildiği gibi çıkarılabilir.

Apple App Site Association Dosyasını Almak

apple-app-site-association dosyası, yetkilendirmelerde belirtilen alan adları kullanılarak sunucudan alınmalıdır. Dosyanın https://<alan_adı>/apple-app-site-association adresinden doğrudan HTTPS üzerinden erişilebilir olduğundan emin olun. Apple App Site Association (AASA) Validator gibi araçlar bu süreçte yardımcı olabilir.

Uygulamada Universal Bağlantıları İşlemek

Uygulama, universal bağlantıları doğru bir şekilde işlemek için belirli yöntemleri uygulamalıdır. Aranması gereken temel yöntem application:continueUserActivity:restorationHandler: yöntemidir. İşlenen URL'lerin şemasının HTTP veya HTTPS olması önemlidir, diğerleri desteklenmeyecektir.

Veri İşleyici Yöntemini Doğrulama

Bir universal bağlantı bir uygulamayı açtığında, bir NSUserActivity nesnesi URL ile birlikte uygulamaya iletilir. Bu URL'yi işlemeye başlamadan önce, güvenlik risklerini önlemek için doğrulamak ve temizlemek önemlidir. İşlemi gösteren bir Swift örneği aşağıda verilmiştir:

func application(_ application: UIApplication, continue userActivity: NSUserActivity,
restorationHandler: @escaping ([UIUserActivityRestoring]?) -> Void) -> Bool {
// Check for web browsing activity and valid URL
if userActivity.activityType == NSUserActivityTypeBrowsingWeb, let url = userActivity.webpageURL {
application.open(url, options: [:], completionHandler: nil)
}

return true
}

URL'ler, özellikle parametre içeriyorsa, potansiyel sahte veya hatalı verilere karşı dikkatlice ayrıştırılmalı ve doğrulanmalıdır. Bu amaçla NSURLComponents API'si kullanışlıdır, aşağıda gösterildiği gibi:

guard let url = URL(string: "https://example.com/path?param=value") else {
    // Handle invalid URL
    return
}

guard let components = NSURLComponents(url: url, resolvingAgainstBaseURL: true) else {
    // Handle invalid URL components
    return
}

// Access individual components
if let scheme = components.scheme {
    print("Scheme: \(scheme)")
}

if let host = components.host {
    print("Host: \(host)")
}

if let path = components.path {
    print("Path: \(path)")
}

if let queryItems = components.queryItems {
    for item in queryItems {
        print("Parameter: \(item.name), Value: \(item.value ?? "")")
    }
}

Bu kod parçası, verilen URL'yi ayrıştırır ve bileşenlerine erişim sağlar. Böylece, URL'nin şeması, ana bilgisayarı, yolunu ve parametrelerini elde edebilirsiniz.

func application(_ application: UIApplication,
continue userActivity: NSUserActivity,
restorationHandler: @escaping ([Any]?) -> Void) -> Bool {
guard userActivity.activityType == NSUserActivityTypeBrowsingWeb,
let incomingURL = userActivity.webpageURL,
let components = NSURLComponents(url: incomingURL, resolvingAgainstBaseURL: true),
let path = components.path,
let params = components.queryItems else {
return false
}

if let albumName = params.first(where: { $0.name == "albumname" })?.value,
let photoIndex = params.first(where: { $0.name == "index" })?.value {
// Process the URL with album name and photo index

return true

} else {
// Handle invalid or missing parameters

return false
}
}

Geliştiriciler, evrensel bağlantıların kullanıcı deneyimini artırırken güvenlik ve gizlilik standartlarını korumak için dikkatli yapılandırma ve doğrulama yaparak sağlayabilirler.

Referanslar

AWS hacklemeyi sıfırdan kahraman olmak için öğrenin htARTE (HackTricks AWS Red Team Expert)!

HackTricks'i desteklemenin diğer yolları:

Last updated