扫码领资料
获网安教程
来Track安全社区投稿~
赢千元稿费!还有保底奖励~(https://bbs.zkaq.cn)
在十二月,我决定在 Facebook 上进行漏洞挖掘,并选择了 Facebook Android 应用程序。
我正在分析 Facebook 应用程序的密码恢复流程,我注意到以下端点被使用。
当用户输入他的电子邮件/电话号码时,电子邮件通过参数 q
以以下方式提供。
该端点包含许多参数,超出了所需的数量,所以我很想测试这些参数的作用。
我很快注意到,虽然用户的电子邮件是由 q
参数携带的,但它还包含一个 qs
参数。
现在,如果你不知道的话;在 Facebook 中,参数后面的字符 s
表示复数。
例如:
invite_id,复数 = invite_ids
user_id,复数 = user_ids
我知道在复数参数中,你可以传递数组数据,例如: user_ids=[“UserID1”,”UserID2"]
所以我以以下方式提供数据:
qs=[“[vicitmemail1@gmail.com]”,”[victimemail2@gmail.com]”]
但它给出了一个错误,声明数组键无效,所以这不是一个普通数组,它有自己的键。
经过一些模糊测试,我最终弄清楚参数 qs
以 JSON 包装格式接受值,并且具有键 “phone” 和 “email”,而email/phone的值将作为数组提供。
示例:[q=victim@gmail.com] qs={“email”:[“[victim@gmail.com]”],”phone”:[“981234567890”]}
现在,当你在忘记密码的端点中提供电子邮件时,与你相关的数据将以加密格式返回。
响应将包含:你的加密用户ID、联系点等。
在数据中还有一个值 summary
,其值设置为 1
。
最初我以为这只是一个布尔值,但事实证明:
当我们在 qs
中提供一个电子邮件时: qs={“email”:[“[user1@gmail.com]”]} 响应中会获得一个用户的数据,因此: summary=1
当我们在 qs
中提供两个电子邮件时: qs={“email”:[“[user1@gmail.com]”,”[user2@gmail.com]”]} 响应中会获得两个用户的数据,因此:summary=2
但这里有最后一部分:
假设我提供: qs={“email”:[“[victim1@gmail.com]”,”[victim2@gmail.com]”]} 响应中只获得了一个用户的数据。
这意味着什么? 这两个电子邮件属于同一个用户,并且这两个电子邮件指向同一个用户,导致响应为 “summary”:1
现在,基本上这是一个暴力破解攻击场景。
我提供受害者的用户名以及一个电子邮件,如果电子邮件属于受害者,则响应为 “summary:1”
qs={“email”:[“victimUserName”,”Email”]}
//是的,我们可以在电子邮件参数中提供用户名
利用二分法搜索
暴力破解攻击是非常嘈杂的。但通过使用二分搜索,这种攻击变得容易得多。
由于端点接受一个数据数组:我不必只提交 1个用户名+1个电子邮件
我可以提供 1个用户名+ 100多个电子邮件。
例如;qs={“email”:[“victimUserName”,”[email1@gmail.com]”,”[email2@gmail.com]”,”[email3@gmail.com]”]}
现在,如果请求中的任何电子邮件属于受害者用户名:
Summary=3 //响应为 email1+email2+email3
否则 summary=4 //响应为 victimUsername+email1+email2+email3
这使得暴力破解更加简单,并有效识别任何用户的私人电子邮件,下面是一个展示二分搜索的图示
我还收到了 Facebook 团队的 sweeeet 回复,感觉不错:)
声明:⽂中所涉及的技术、思路和⼯具仅供以安全为⽬的的学习交流使⽤,任何⼈不得将其⽤于⾮法⽤途以及盈利等⽬的,否则后果⾃⾏承担。所有渗透都需获取授权!
如果你是一个网络安全爱好者,欢迎加入我的知识星球:zk安全知识星球,我们一起进步一起学习。星球不定期会分享一些前沿漏洞,每周安全面试经验、SRC实战纪实等文章分享,微信识别二维码,只需25,即可加入。