我之前使用阿里小号注册了一些账户,其中有一个账户密码忘记了,由于之前的阿里小号过期了,想找回账户密码必须先把过期的阿里小号找回来(找回密码需要验证手机号)
如下图所示,阿里小号客户端只允许索引手机号的前四位,不支持直接查找指定的手机号
,如果想使用以前的号码,正常方式只能一直点换一组看人品了V_V,尝试刷了几十次都没有我要找回的号码,手点的都酸了,还是放弃这种方式吧;分析了一下如果点击换一组时把阿里服务器返回的列表数据改掉不就可以了吗?动手尝试一下
1.首先先通过抓包抓包工具看一下点击换一组时调用的接口(在mac使用charles开一个代理服务器,手机的wifi代理设置为mac电脑的ip地址),
从上图可以看出调用的接口是
https://aliqin.m.tmall.com/usercenter/secret_info.do?ver=2.0&_input_charset=UTF-8&m=GetSecretNos&phone_no=${阿里小号绑定的宿主手机号}&num=8&like=&callback=jsonp7
服务器返回的数据为:
{
"code": "0000",
"message": "SUCCESS",
"data": {
"hasMore": 1,
"numList": [
{
"number": "13175465948",
"areaName": "台州",
"province": "浙江"
},
{
"number": "13175469656",
"areaName": "台州",
"province": "浙江"
},
{
"number": "13173730284",
"areaName": "台州",
"province": "浙江"
},
{
"number": "13175484505",
"areaName": "台州",
"province": "浙江"
},
{
"number": "13175321143",
"areaName": "台州",
"province": "浙江"
},
{
"number": "13174793926",
"areaName": "台州",
"province": "浙江"
},
{
"number": "13175860242",
"areaName": "台州",
"province": "浙江"
},
{
"number": "13211317742",
"areaName": "南宁",
"province": "广西"
}
]
}
}
2.有了上面的数据结构,就可以通过DNS欺骗的方式,通过脚本启动一个http服务伪装成阿里的服务器,这里使用nodejs,脚本如下(ali.js)
var rf = require("fs");
var data= rf.readFileSync("/Users/tong/Desktop/ali.json","utf-8");
console.log(data);
var http = require("http");
http.createServer(function(request,response) {
console.log('request received');
response.writeHead(200, {"Content-Type":"application/json;charset=UTF-8","S":"STATUS_NORMAL","Content-Language":"zh-CN","Server": "Tengine"});
response.write(data);
response.end();
}).listen(80);
console.log('server started');
上面的ali.json就是事先伪造好的发给客户端的数据(假如想找回的号码是13012345678),数据如下所示
jsonp3({
"code":"0000",
"message":"SUCCESS",
"data":{
"hasMore":1,
"numList":[{
"number":"13012345678",
"areaName":"临沂新村",
"province":"上海"
},{
"number":"15676274544",
"areaName":"柳州",
"province":"广西"
},{
"number":"15607823242",
"areaName":"柳州",
"province":"广西"
},{
"number":"13174788562",
"areaName":"台州",
"province":"浙江"
},{
"number":"15676254554",
"areaName":"柳州",
"province":"广西"
},{
"number":"15677532984",
"areaName":"玉林",
"province":"广西"
},{
"number":"15677694914",
"areaName":"百色",
"province":"广西"
},{
"number":"15676240451",
"areaName":"桂林",
"province":"广西"
}]
}
})
3.修改hosts文件(/etc/hosts),把阿里小号的服务器域名映射到本机127.0.0.1
127.0.0.1 aliqin.m.tmall.com
4.启动nodejs服务,mac监听80端口需要root权限
5.用浏览器尝试访问
这个时候成功的欺骗了浏览器,返回了篡改以后的数据
6、客户端设置完wifi代理后,点击换一组
篡改的数据成功的出现在阿里小号客户端上,点击确认
付钱以后号码就可以找回来了哈哈(上面这个号码是随便搞的,要使用阿里小号库里已存在且没被占用的手机号才能成功)。
上面使用的中间人攻击方式,对大多数安全校验不严格的客户端都比较适用,假如阿里的这个接口对返回的报文做一个hash,客户端通过这个hash值校验一下返回的数据就可以很大的程度提高篡改的成本了,或者把接口改成https