我如何拿下最受欢迎的一个约会网站

admin 2021年12月7日10:12:43评论88 views字数 6212阅读20分42秒阅读模式

我如何拿下最受欢迎的一个约会网站

这是一个关于后端安全性很差的故事,比较长,作者写的还是蛮细的。
(我以为是那种网站,咳咳咳,面壁去)

这个网站美其名曰使用科学和机器学习来促进尽兴进行智能匹配约会,但是作者花了15分钟就黑进去了。


我如何拿下最受欢迎的一个约会网站


(这个配图为啥看起来没有任何吸引力。。。)

这个网站注册后,会让您回答关于自己的一些问题(问卷一样),然后他们会为您显示一些带有模糊照片的匹配项,告诉您它们与您的兼容性达95%。如果不支付正式会员资格的费用,你就被限制了很多功能(看到这里,很熟悉的赶脚有木有),您将只能查看自己的匹配程度,发送笑脸,并发送预先定义的打招呼消息,如果想收到对方的答复或发送个人消息,只有一条路子:充会员,每个月50英镑。


我如何拿下最受欢迎的一个约会网站


从逆向开始

第一件事就是查看进出该应用程序的流量。作者使用的是iPhone,因此在Mac上安装了一个代理Charles,并通过该代理运行了iPhone的WiFi。


我如何拿下最受欢迎的一个约会网站


居然可以看到对方的个人资料和每一个细节,并且,他们只是通过非安全的HTTP发送女孩的完整个人资料!!!


有一张模糊的照片列表,但作者无法轻松访问未模糊的照片,只能将其留待以后使用。


所有重要的请求似乎都基于SSL协议,作者激活了CharlesSSL Proxy,并在iPhone上安装了CharlesSSL证书,但是莫得用,该应用程序无法再连接。似乎他们在这里做得很好,因为他们知道作者没有使用适当的SSL证书,并且正在执行中间人攻击。


我如何拿下最受欢迎的一个约会网站


Web应用程序

如果iOS应用程序很难破解,那么尝试Web应用程序。我转到他们的网站并登录。相同的界面,相同的模糊面孔,相同的收件箱,但无法访问。
在Chrome上,读取HTTPS请求非常容易。将“过滤网络”选项切换到XHR,然后查看GET请求,哇哦,下图是我刚刚收到的收件箱聊天消息!


我如何拿下最受欢迎的一个约会网站

[
{
"messageId": "b123738-5123-4123-9123-1232333b1234",
"type": "CHAT",
"value": "Hi Zed! I feel like I should send an interestingmessage but I'm all Mondayed out. How are you?",
"createdTimeStamp": 1523914585468,
"readTimeStamp": 1523914778123,
"sender": false
},
{
"messageId": "ABC1235C-AABC-4ABC-8ABC-1ABC4EBC7ABC",
"type": "SMILE",
"createdTimeStamp": 1523883156123,
"readTimeStamp": 1523886591123,
"sender": true
}
]

既然可以看到这么多信息,那就简单了。

发送消息

如果需要发送消息,那么我要做的第一件事就是查看消息的格式。因此,我切换到匹配列表上的其他任何人,单击按钮以发送预定义的消息,然后选择其中一个“如果您很有名,您会是谁?”,然后将其发送出去。
同时,我保留了Chrome网络请求的日志。
好的,查看我们刚刚创建的PUT和POST请求,我在任何地方都找不到“有名”一词。是单词未发送,还是发生了其他幺蛾子?
在我发送消息后发生的POST请求之一中,payload为:

{
"logs": [
{
"logMessage": "Message Sent (Soft ACK) - on server sender",
"method": "WEBSOCKET",
"logLevel": "INFO",
"additionalInfo":"{"messageId":"12351f23-fABC-4ABC-9ABC-ABCc123a0ABC","matchId":12309078132}"
}
]
}

额,聊天居然是通过websockets进行,我早该想到的!!!

Websocket检查

转到Chrome网络标签中的Websocket过滤,很高兴,有一个Websocket(虽然只有一个)可以监视。


我如何拿下最受欢迎的一个约会网站


从最简单的开始:查找单词“有名”。但是这个单词在websocket中也不存在。
再然后,我循环遍历这些消息,试图理解要发送的XML的细节,貌似是这样子的:
  1.打开连接
  2.验证Websocket服务
  3.连接到Jabber客户端,设置配置参数
  4.然后发送一条消息!

<message xmlns=”jabber:client” to=[email protected] 
id=”84123ff6-f123-4123-9123-c123458a0abc" type=”chat”>

<body>{“message”:{“messageId”:”84123ff6-f123-4123-9123-c123458a0abc",
”type”:”CEQ”,”value”:”62"}}</body><request xmlns=”urn:xmpp:receipts”/>
<data><accesstoken>84123ff6-f123-4123-9123-c123458a0abc</accesstoken>
<header name=”User-Agent” value=”Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36"/>

<header name=”X-xyz-gdid”/><resourceid>12309078132</resourceid></data></message>

既然我了解发送的工作原理,让我们尝试复制它。


我如何拿下最受欢迎的一个约会网站


我安装了Simple Websocket Client Chrome扩展程序,复制了websocket URL,打开了websocket连接,然后成功了。下一步:
  1.打开第一个连接请好。
  2.认证。
  3.连接到Jabber客户端并设置这些参数。

如何发送该消息呢?查看JSON有效负载,似乎有一个消息对象,该预定义消息有一个ID,我们将其发送。我决定尝试将消息密钥设置为值“ Hey there!”,不为啥,只是尝试一下。
{“message”:"Hey There!"}
啊欧,错误。

<error code=’400' type=’modify’><bad-request
xmlns=’urn:ietf:params:xml:ns:xmpp-stanzas’/>
<text
xmlns=’urn:ietf:params:xml:ns:xmpp-stanzas’>
Can not instantiate value of

type [simple type, class com.xyz.services.comm.api.message.Message]
from String value ('Hey there!');
no single-String constructor/factory method
at [Source: org.glassfish.jersey.message.internal.ReaderInterceptorExecutor$UnCloseableInputStream@b5a4c95;
line: 1, column: 2] (through reference chain:
com.xyz.services.comm.api.message.ClientMessageWrapper["message"])</text></error></message>

有趣,架构不应该是这样的,再看看。
我正在发送预定义的消息ID,因此该ID必然存在于某处。让我们看一下预定义消息的列表。
我打开列表以发送更多消息,然后检查了HTML结果发现该消息的ID为62。
好的,我知道我理解错了,messageId是其他的ID,而预定义消息的ID值为62。那么“ CEQ”类型应该如何设置?
我记得在浏览GET请求时看到了这样的事情:


我如何拿下最受欢迎的一个约会网站


现在只需将类型设置为CHAT,并将值设置为我的聊天消息即可。相应如下:

<message xmlns=’jabber:client’ from=’mailto:[email protected]/android.phone.emulator
to=’1231232yr2_3–mailto:[email protected]/android.phone.emulator
xml:lang=’en’ id=’123f7–32' type=’chat’>
<data/>
<received xmlns=’urn:xmpp:receipts’
id=’81231236-f5ce-abcd-9abc-c6e12312312c0'/>
</message>

bingo,我收到了收据。刷新收件箱页面,已经成功写了一条消息。

与匹配到的人交流

最后一个难题是知道如何与该网站上的任何人交谈,而不仅仅是与某个人交谈。除了消息Websocket框架,与我聊天的人似乎没有任何标识符。但是看起来,电子邮件地址的聊天地址似乎就是我要发送给的人的标识符。

to=”mailto:123jnwrvd7_123gd2abcv12_12@chat.xyz.com”


但是我要从哪里获得此标识符呢,愁。

将扩展的配置文件信息复制到Sublime Text,在文本中找到聊天地址。嗯,它是加密格式的用户ID。好吧,让我们尝试一下。

{“message”:{“messageId”:”84123ff6-f123-4123-123b-c6123e8a1230",”type”:”CHAT”,”value”:”Good evening Sophie! Haha already tired? Interesting messages are over-rated anyway ”}}

我将其发送给了我测试过的那个女孩,好吧,再一次失败。

仔细查看所有这些ID和聊天地址后,发现它就是resource ID

<resourceid>12309078132</resourceid>

第二次尝试:
查找该资源ID是什么。好的,这是未加密的用户ID。十分简单。编辑resource ID,然后,瞧,消息已经发送给美女!


我如何拿下最受欢迎的一个约会网站


为什么停在这里(这标题就是酱紫。。。)

我们现在如何尝试查看那些模糊的照片呢?在个人资料JSON数组中,有一张照片列表,URL格式是酱紫的:

https://images.xyz.com/photos/v2/photo/NORMAL/I1/d5abcttnp5yxjytb227v6fp56p.jpg?blur=60&crop=faces&fit=crop&g=2&h=160&ixlib=java-1.1.1&w=160&s=cda2e652b4182b123a1678

我试图修改查询参数,但是我总是得到一个空图像。

我在想,如果我有一个付费帐户,那么我可以看到如何将模糊图像映射到原始图像。

好吧,那是不可能的,付费账户可是要50镑的啊!!!

所以,我们能做些什么?

好吧,只好去检查我自己的个人资料照片,URL包含什么?

事实上它是酱紫的:

https://www.xyz.com/photos/v1/photo/THUMB/I3/1236VKj18jtm5Ih8Cr2pSAabc.jpg

这些参数是什么意思?我在jsonprettyprint.com上导出我的个人资料到Sublime Text,然后进行搜索。事实证明,该网站利用枚举图片(I1,I2,I3等等)的方式,长标识符就是我的encryptedUserId,照片具有1或2版本,大小由THUMB,ICON,NORMAL等等来定义。

那就变得很简单了:

https://www.xyz.com/photos/v<version>/photo/<SIZE>/<IMAGE-NUMBER>/<ENCRYPTED-USER-ID>.jpg

我们将其应用于另一个匹配者的图片。瞧:(少儿不宜之打码)


我如何拿下最受欢迎的一个约会网站

这项服务是否像我认为的那样不安全?

好吧,让我们检查一下这是多么不安全。我们能否在不与他人匹配的情况下查看别人的个人资料?

要获取某人的个人资料,HTTP GET请求是这样的:

https://www.xyz.com/publicapi/v2/matchprofile/<match-id>/profile

如果我们从Chrome网络中复制CURL,则会得到这样的废话(原文就是废话而不是会话):

curl 'https://www.xyz.com/publicapi/v2/matchprofile/12303942525/profile?'
-H 'authorization: Bearer 12339f23-2302-4e6f-b9ae-1f9c99a6e123'
-H 'Accept-Encoding: gzip, deflate, br'
-H 'Accept-Language: en-US,en;q=0.9,ar;q=0.8'
-H 'User-Agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10_12_5)
AppleWebKit/537.36 (KHTML, like Gecko) Chrome/65.0.3325.181 Safari/537.36'
-H 'x-xyz-gdid: ' -H 'accept: application/json' -H 'Connection: keep-alive'
-H 'content-type: application/json' -H 'x-xyz-platform: desktop' --compressed

好了,让我们更改一个匹配ID,看看是否可以获取数据,结果是:404 Not Found.

请使用其他数字重试,结果:404 Not Found.

非常好 我们可以通过使用用户ID来获取这些配置文件吗?已经把我整蒙了。

我的观点已经证明,我不会在此浪费更多的时间,到此结束。

后记

我不是黑客,也不想造成任何损害,我只是了解Web服务是如何工作的。我刚才做过的逆向工程几乎都是在Chrome上完成,不需要任何其他工具。向收费如此高的服务获得完整的成员资格功能非常容易,因为大多数安全性是在前端而不是后端完成的。它就像是一堵高墙城堡,门开着,但里面没有护卫。

给他们的工程师的建议(如果他们关心的话):
  1.看在玉皇大帝的份上,只使用安全连接。千万别通过HTTP发送某人的个人资料。
  2.在您的Jabber邮件系统中设置权限。检查用户发送具有CHAT特征的消息是否是高级会员。
  3.过滤掉您的messages端点(在对话中会显示),仅在用户是高级会员时才能显示消息。
  4.请勿在没有检查会员资格的情况下提供图像。您可以在图像被请求时重新路由您的Web服务器(Jetty),检查成员资格,如果用户不是高级用户,则模糊化其服务。
  5.最重要的是,从内而外建立安全性!

声明

我已经马赛克掉并替换了所有出现的网站名称以及有关成员的所有识别信息。这篇文章并非针对该网站,或旨在对其造成任何伤害。


我如何拿下最受欢迎的一个约会网站


本文始发于微信公众号(疯猫网络):我如何拿下最受欢迎的一个约会网站

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2021年12月7日10:12:43
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   我如何拿下最受欢迎的一个约会网站https://cn-sec.com/archives/505143.html

发表评论

匿名网友 填写信息