渗透!15分钟拿下最受欢迎的某约会网站
本文只用于技术讨论,不可用于违法途径!且行且珍惜~
这是一个关于后端安全性很差的故事,比较长,写的还是蛮细的。(我以为是那种网站,咳咳咳,面壁去)
这个网站美其名曰使用科学和机器学习来促进尽兴进行智能匹配约会,
但是我花了15分钟就黑进去了。
这个网站注册后,会让您回答关于自己的一些问题(问卷一样),
然后他们会为您显示一些带有模糊照片的匹配项,告诉您它们与您的兼容性达95%。
如果不支付正式会员资格的费用,你就被限制了很多功能
(看到这里,很熟悉的赶脚有木有)
您将只能查看自己的匹配程度,发送笑脸,
并发送预先定义的打招呼消息,
如果想收到对方的答复或发送个人消息,
只有一条路子:充会员,每个月50英镑。
第一件事就是查看进出该应用程序的流量。
我使用的是iPhone,因此在Mac上安装了一个代理Charles,并通过该代理运行了iPhone的WiFi。
居然可以看到对方的个人资料和每一个细节,
并且,他们只是通过非安全的HTTP发送女孩的完整个人资料!!!
有一张模糊的照片列表,
但无法轻松访问未模糊的照片,只能将其留待以后使用。
所有重要的请求似乎都基于SSL协议,
激活了CharlesSSLProxy,并在iPhone上安装了CharlesSSL证书,
但是莫得用,该应用程序无法再连接。
似乎他们在这里做得很好,
因为他们知道作者没有使用适当的SSL证书,并且正在执行中间人攻击。
如果iOS应用程序很难破解,那么尝试Web应用程序。
相同的界面,相同的模糊面孔,相同的收件箱,但无法访问。
在Chrome上,读取HTTPS请求非常容易。
将“过滤网络”选项切换到XHR,
然后查看GET请求,
哇哦,下图是我刚刚收到的收件箱聊天消息!
既然可以看到这么多信息,那就简单了。
如果需要发送消息,那么我要做的第一件事就是查看消息的格式。
因此,我切换到匹配列表上的其他任何人,
单击按钮以发送预定义的消息,
然后选择其中一个“如果您很有名,您会是谁?”,
然后将其发送出去。
同时,我保留了Chrome网络请求的日志。
是单词未发送,还是发生了其他幺蛾子?
额,聊天居然是通过websockets进行,我早该想到的!!!
转到Chrome网络标签中的Websocket过滤,
很高兴,有一个Websocket(虽然只有一个)可以监视。
从最简单的开始:查找单词“有名”。
但是,这个单词在websocket中也不存在。
再然后,我循环遍历这些消息,
试图理解要发送的XML的细节,貌似是这样子的:
1.打开连接2.验证Websocket服务3.连接到Jabber客户端,设置配置参数4.然后发送一条消息!
既然我了解发送的工作原理,让我们尝试复制它。
我安装了SimpleWebsocketClientChrome扩展程序,
复制了websocketURL,打开了websocket连接,然后成功了。
下一步:1.打开第一个连接请好。2.认证。3.连接到Jabber客户端并设置这些参数。
如何发送该消息呢?
查看JSON有效负载,似乎有一个消息对象,
该预定义消息有一个ID,我们将其发送。
我决定尝试将消息密钥设置为值“Heythere!”,
不为啥,只是尝试一下。
有趣,架构不应该是这样的,再看看。
让我们看一下预定义消息的列表。我打开列表以发送更多消息,
然后检查了HTML,结果发现该消息的ID为62。好的,我知道我理解错了,
messageId是其他的ID,而预定义消息的ID值为62。
那么“CEQ”类型应该如何设置?
现在只需将类型设置为CHAT,并将值设置为我的聊天消息即可。
相应如下:
bingo,我收到了收据。
刷新收件箱页面,已经成功写了一条消息。
最后一个难题是知道如何与该网站上的任何人交谈,
而不仅仅是与某个人交谈。
除了消息Websocket框架,与我聊天的人似乎没有任何标识符。
但是看起来,
电子邮件地址的聊天地址似乎就是我要发送给的人的标识符。
但是我要从哪里获得此标识符呢,愁。
将扩展的配置文件信息复制到SublimeText,在文本中找到聊天地址。
嗯,它是加密格式的用户ID。
好吧,让我们尝试一下。
我将其发送给了我测试过的那个女孩,好吧,再一次失败。
仔细查看所有这些ID和聊天地址后,发现它就是resourceID
第二次尝试:查找该资源ID是什么。
好的,这是未加密的用户ID。
十分简单,resourceID,然后,瞧,消息已经发送给美女!
我们现在如何尝试查看那些模糊的照片呢?
在个人资料JSON数组中,有一张照片列表,URL格式是酱紫的:
我试图修改查询参数,但是我总是得到一个空图像。
我在想,如果我有一个付费帐户,
那么我可以看到如何将模糊图像映射到原始图像。
好吧,那是不可能的,付费账户可是要50镑的啊!!!
所以,我们能做些什么?
好吧,只好去检查我自己的个人资料照片,URL包含什么?
事实上它是酱紫的:
这些参数是什么意思?
我在jsonprettyprint.com上导出我的个人资料到SublimeText,然后进行搜索。
事实证明,该网站利用枚举图片(I1,I2,I3等等)的方式,
长标识符就是我的encryptedUserId,
照片具有1或2版本,大小由THUMB,ICON,NORMAL等等来定义。
那就变得很简单了:
我们将其应用于另一个匹配者的图片
瞧:(少儿不宜之打码)
好吧,让我们检查一下这是多么不安全。
我们能否在不与他人匹配的情况下查看别人的个人资料?
要获取某人的个人资料,HTTPGET请求是这样的:
如果我们从Chrome网络中复制CURL,
则会得到这样的废话(原文就是废话,而不是会话):
好了,让我们更改一个匹配ID,
看看是否可以获取数据,结果是:404NotFound.
请使用其他数字重试,结果:404NotFound.
非常好!!!
我们可以通过使用用户ID来获取这些配置文件吗?已经把我整蒙了。
我不是黑客,也不想造成任何损害,我只是了解Web服务是如何工作的。
我刚才做过的逆向工程几乎都是在Chrome上完成,不需要任何其他工具。
向收费如此高的服务获得完整的成员资格功能非常容易,
因为大多数安全性是在前端而不是后端完成的。
它就像是一堵高墙城堡,门开着,但里面没有护卫。
给他们的工程师的建议(如果他们关心的话):1.看在玉皇大帝的份上,只使用安全连接。
千万别通过HTTP发送某人的个人资料。
2.在您的Jabber邮件系统中设置权限。
检查用户发送具有CHAT特征的消息是否是高级会员。
3.过滤掉您的messages端点(在对话中会显示),
仅在用户是高级会员时才能显示消息。
4.请勿在没有检查会员资格的情况下提供图像。
您可以在图像被请求时重新路由您的Web服务器(Jetty),
检查成员资格,如果用户不是高级用户,则模糊化其服务。
5.最重要的是,从内而外建立安全性!
我已经马赛克掉并替换了所有出现的网站名称以及有关成员的所有识别信息。