mirror of
https://github.com/HackTricks-wiki/hacktricks.git
synced 2025-10-10 18:36:50 +00:00
132 lines
7.5 KiB
Markdown
132 lines
7.5 KiB
Markdown
# Webview Attacks
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|
||
|
||
## Guide on WebView Configurations and Security
|
||
|
||
### Overview of WebView Vulnerabilities
|
||
|
||
Android 개발의 중요한 측면은 WebViews의 올바른 처리입니다. 이 가이드는 WebView 사용과 관련된 위험을 완화하기 위한 주요 구성 및 보안 관행을 강조합니다.
|
||
|
||
.png>)
|
||
|
||
### **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을 로드하는 데 사용되는 일반적인 함수입니다:
|
||
```java
|
||
webview.loadUrl("<url here>")
|
||
```
|
||
물론, 잠재적인 공격자는 애플리케이션이 로드할 **URL**을 절대 **제어할 수 없어야** 합니다.
|
||
|
||
### **JavaScript 및 Intent 스킴 처리**
|
||
|
||
- **JavaScript**: WebViews에서 기본적으로 비활성화되어 있으며, `setJavaScriptEnabled()`를 통해 활성화할 수 있습니다. 적절한 안전 장치 없이 JavaScript를 활성화하면 보안 취약점이 발생할 수 있으므로 주의가 필요합니다.
|
||
- **Intent 스킴**: WebViews는 `intent` 스킴을 처리할 수 있으며, 신중하게 관리하지 않으면 악용될 수 있습니다. 한 예로, "support_url"이라는 노출된 WebView 매개변수가 XSS 공격을 실행하는 데 악용될 수 있는 취약점이 있었습니다.
|
||
|
||
.png>)
|
||
|
||
adb를 사용한 악용 예:
|
||
```bash
|
||
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:
|
||
```javascript
|
||
@JavascriptInterface
|
||
public String getSecret() {
|
||
return "SuperSecretPassword";
|
||
};
|
||
```
|
||
- JavaScript Bridge는 WebView에 인터페이스를 추가하여 활성화됩니다:
|
||
```javascript
|
||
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge")
|
||
webView.reload()
|
||
```
|
||
- JavaScript를 통한 잠재적 악용, 예를 들어 XSS 공격을 통해 노출된 Java 메서드를 호출할 수 있습니다:
|
||
```html
|
||
<script>
|
||
alert(javascriptBridge.getSecret())
|
||
</script>
|
||
```
|
||
- 위험을 완화하기 위해, **JavaScript 브리지 사용을** APK와 함께 제공된 코드로 제한하고 원격 소스에서 JavaScript 로딩을 방지하십시오. 구형 장치의 경우 최소 API 수준을 17로 설정하십시오.
|
||
|
||
### 반사 기반 원격 코드 실행 (RCE)
|
||
|
||
- 문서화된 방법은 특정 페이로드를 실행하여 RCE를 달성할 수 있게 합니다. 그러나 `@JavascriptInterface` 주석은 무단 메서드 접근을 방지하여 공격 표면을 제한합니다.
|
||
|
||
### 원격 디버깅
|
||
|
||
- **원격 디버깅**은 **Chrome 개발자 도구**를 사용하여 가능하며, WebView 콘텐츠 내에서 상호작용 및 임의의 JavaScript 실행을 가능하게 합니다.
|
||
|
||
#### 원격 디버깅 활성화
|
||
|
||
- 원격 디버깅은 애플리케이션 내의 모든 WebView에 대해 활성화할 수 있습니다:
|
||
```java
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||
WebView.setWebContentsDebuggingEnabled(true);
|
||
}
|
||
```
|
||
- 애플리케이션의 디버깅 가능 상태에 따라 조건부로 디버깅을 활성화하려면:
|
||
```java
|
||
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
|
||
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
|
||
{ WebView.setWebContentsDebuggingEnabled(true); }
|
||
}
|
||
```
|
||
## 임의 파일 유출
|
||
|
||
- XMLHttpRequest를 사용하여 임의 파일의 유출을 시연합니다:
|
||
```javascript
|
||
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://labs.integrity.pt/articles/review-android-webviews-fileaccess-attack-vectors/index.html)
|
||
- [https://github.com/authenticationfailure/WheresMyBrowser.Android](https://github.com/authenticationfailure/WheresMyBrowser.Android)
|
||
- [https://developer.android.com/reference/android/webkit/WebView](https://developer.android.com/reference/android/webkit/WebView)
|
||
- [https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1](https://medium.com/@justmobilesec/deep-links-webviews-exploitations-part-ii-5c0b118ec6f1)
|
||
- [https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I](https://www.justmobilesec.com/en/blog/deep-links-webviews-exploitations-part-I)
|
||
|
||
{{#include ../../banners/hacktricks-training.md}}
|