[Android] Open redirect vulnerability Using Deeplink
Deeplink
- 특정 페이지에 도달할 수 있는 링크를 의미함.
=> 즉, 모바일 웹상에 있는 링크나 그림을 클릭할 경우
기기 내 관련 앱이나 사전에 정의된 특정 페이지가 실행되는 모바일 기술
- 웹에서 사용되는 http://, https:// 와는 다르게 모바일 어플리케이션마다 각자 생성한 프로토콜을 사용하고 있어
검증이 미흡한 경우 취약점 발생 가능성 존재
- URL 스킴 방식 : 앱에 URl 스킴(scheme) 값을 등록하여 딥링크 사용
- 앱링크(App Link) : Android 제공 - 도메인 주소를 이용한 딥링크 사용
- 유니버셜 링크(Universal Link) : iOS 제공 - 도메인 주소를 이용한 딥링크 사용
android에서 URL Scheme 방식의 딥링크를 사용하기 위해
AndroidManifest.xml에서 data 태그에 host, scheme 정의 필요
<activity android:name="com.silver35.example">
<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:host="velog.io/silver35" android:scheme="http"/>
</intent-filter>
</activity>
GitHub - optiv/InsecureShop: An Intentionally designed Vulnerable Android Application built in Kotlin.
An Intentionally designed Vulnerable Android Application built in Kotlin. - GitHub - optiv/InsecureShop: An Intentionally designed Vulnerable Android Application built in Kotlin.
github.com
InsecureShop.apk 파일 디컴파일 후,
AndroidManifest.xml 파일에서
data 태그에 host가 com.insecureshop, scheme이 insecureshop로 정의됨을 확인
com.insecureshop.WebViewActivity
onCreate 함수에 intent0을 선언한 뒤
intent.getData()로 uri를 가져오고 uri0 변수가 null인지 확인함
만약 uri0이 null이 아니면 경로에 /web이 있는지 확인하고
=>있으면 url 파라미터 값을 data 변수에 저장
그렇지 않으면 /webview가 있는지 확인하고
=>url 파라미터 값을 data 값에 저장
/web과 /webview를 모두 포함하지 않으면
=>앱 종료
포함하고 있으면
=>webview.loadUrl(data)를 통해 웹 페이지가 로드 됨
따라서, 위의 앱에서 임의의 웹페이지를 로드하기 위해 아래와 같이 URL을 작성함
insecureshop://com.insecureshop/web?url=https://damti.tistory.com/
insecureshop://com.insecureshop/webview?url=https://damti.tistory.com/
nox로 앱 실행 후,
adb의 am 명령을 이용해 임의의 url로 리다이렉션을 하도록 실행
adb shell am start -W -a android.intent.action.VIEW -d "insecureshop://com.insecureshop/web?url=https://damti.tistory.com/"
의도한 url로 이동하는 것을 확인할 수 있음
참고 출처
https://velog.io/@silver35/Android-Open-redirect-vulnerability-Using-Deeplink