0124.距离被曝光仅一步之遥:利用人类行为

admin 2026-01-30 18:32:20 网络安全文章 来源:ZONE.CI 全球网 0 阅读模式

文章总结: 本文展示了结合IDOR漏洞与OSINT的攻击手法。目标网站存在认证缺失问题,仅需确认号和事件ID即可窃取用户PII。鉴于暴力破解不可行,作者通过搜索社交媒体上的活动徽章照片,扫描二维码获取确认号,并推断事件ID,成功获取受害者敏感信息。该案例揭示了技术漏洞配合人类行为疏忽带来的严重数据泄露风险,建议加强身份验证并提升隐私意识。 综合评分: 88 文章分类: 渗透测试,社会工程学,漏洞分析,数据泄露,WEB安全


cover_image

0124.距离被曝光仅一步之遥:利用人类行为

原创

Abdallah Ahmed Abdallah Ahmed

Rsec

2026年1月29日 10:06 贵州

本文章仅用网络安全研究学习,请勿使用相关技术进行违法犯罪活动。

声明:本文搬运自互联网,如你是原作者,请联系我们!

类型:奇妙的IDOR

大家好,希望大家一切都好。

今天我要谈谈我在 BBP 中发现的一个漏洞,该漏洞允许远程攻击者获取受害者的以下数据:

  • 姓名
  • 电子邮件
  • 手机号码
  • 公司
  • 位置
  • T 恤尺码
  • 以及许多其他与受害者相关的数据。

#

介绍

我在寻找目标的过程中,偶然发现了 sub.target.com 这个网站。

该网络应用程序负责管理与公司相关的事件。

乍一看,这个应用程序似乎静态且乏味,可供测试的功能非常有限。我几乎准备转向下一个目标,但还是决定做最后检查。我开始修改 HTTP 请求头,立刻发现了一个问题。服务器的 CORS 配置错误。

深入探究 CORS 配置错误

服务器的响应具有以下规格:

  • Content-Type: Text/HTML -> (无需预检请求)
  • Access-Control-Allow-Origin: https://d3do.com
  • Access-Control-Allow-Credentials: true

所以下一步就是确定身份验证方法。

注册后,应用程序生成了一个具有以下属性的字符串:

  • 11个字符
  • 仅包含首字母大写字母和数字(例如: AAAAAAAAA11 )

它与我的帐户关联;称为确认号码(我们稍后会用到它)。

我试图找出确切的身份验证方法,因为身份验证后的请求包含以下内容:

  • Cookie(包含多个会话 Cookie)
  • x-app-auth:Bearer

因此,我在登录时注意到了这个请求。

POST /some/path HTTP/1.1Host: sub.target.comCookie: <Cookies>x-app-auth: Bearer <token>content-type: application/jsoncreated-by:&nbsp;app-event-id: XXXXXXXX-XXXX-XXXX-XXXX-XXXXXXXXXXXXapp-user-type: standardhttplogpageloadid: <uuid>httplogrequestid: <uuid>localized-validations: trueReferer: <referer>
{"eventId":"<UUID-of-the-Event>","emailAddress":"[email protected]","confirmationNumber":"<My-Confirmation-Number>","inviteeId":"<User-UUID>"}

此次请求的响应包含了我在注册过程中输入的所有数据,其中包括以下个人身份信息 (PII)。

HTTP/1.1&nbsp;200&nbsp;OKContent-Type: application/jsonContent-Length:&nbsp;6553--SNIP--
{&nbsp; &nbsp; "validationMessages": [],&nbsp; &nbsp;&nbsp;"regCart": {--SNIP--&nbsp; &nbsp; &nbsp; &nbsp; "groupRegistration": false,&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"volumeDiscountsInCartStatusType":&nbsp;"NO_VOLUME_DISCOUNT_IN_CART",&nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"eventRegistrations": [{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "eventRegistrationId":&nbsp;"13c616de-8197-4fa7-8702-9494b72d51ff",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"attendee": {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "personalInformation": {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "contactIdEncoded":&nbsp;"rXX_2SgEQ1G5sTThx2AxXQ",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"parentContactId":&nbsp;"00000000-0000-0000-0000-000000000000",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"contactId":&nbsp;"ad75ffd9-2804-4351-b9b1-34e1c760315d",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"firstName":&nbsp;"duke",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"lastName":&nbsp;"dedo",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"emailAddress":&nbsp;"[email protected]",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"sourceId":&nbsp;"14c04565071f4622aa7db50ea024eacf",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"company":&nbsp;"Hacker One",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"title":&nbsp;"Bug Hunter",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"primaryAddressType":&nbsp;"WORK",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"mobilePhone":&nbsp;"+XXXXXXXXXXXX",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"showOnMemberDirectoryFlag": false,&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"customFields": [{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "questionId":&nbsp;"b169c7ab-84a5-4250-8656-18405731dd51",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"answers": [{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "answerType":&nbsp;"Choice",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"choice":&nbsp;"Egypt"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }, {&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "questionId":&nbsp;"5b8cc360-6157-4f33-be53-63ef5632e5fb",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"answers": [{&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; "answerType":&nbsp;"Choice",&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;&nbsp;"choice":&nbsp;"XL"&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }]&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; }--SNIP--}

我认为这是一个找出身份验证方法的绝佳机会。

为了了解身份验证是如何进行的,我逐个删除了标头和 Cookie, 并等待应用程序返回 401 未授权。

请求突然变成了

POST /some/path HTTP/1.1Host: sub.target.comEvent-Id: <event-uid>Content-Length: number

{"eventId":"<event-uid>","emailAddress":"[email protected]","confirmationNumber":"<My-Confirmation-Number>","inviteeId":"<User-UUID>"}

我仍然没有收到预期的 401 未授权错误。

然后我开始移除参数以更深入地了解这个端点,请求变成了

我仍然可以访问这些数据。

我记下了这项请求,并决定在解决 CORS 问题后再处理它。

由于无法仅凭之前的请求来确定身份验证信息,所以我查看了页面源代码,最终确定是这个 cookie 负责身份验证。

由于应用程序没有指定 cookie 的 SameSite 属性,现代 Web 浏览器的默认行为是将其视为 Lax ,并且 cookie 不会通过跨域使用 javascript 发送。

回到有趣的终点

请求包含以下参数:

  • 正文和标题中的 event-uid
  • 确认号码

因此,我理所当然地认为,唯一用于区分我的数据的参数是确认号(我们可以将其视为 uuid)。

暴力破解确认号码

和所有人一样,我首先想到的就是暴力破解确认号码,因为它看起来并不长。

我编写了一个脚本来生成符合确认号码条件的列表,并尝试暴力破解确认号码。

几次请求后,我注意到存在速率限制,并且在第 5 次请求时触发了该限制。

HTTP/2&nbsp;422&nbsp;Unprocessable&nbsp;Entity...// Other headers...
{&nbsp;&nbsp;"validationMessages": [&nbsp; &nbsp; {&nbsp; &nbsp; &nbsp;&nbsp;"severity":&nbsp;"Error",&nbsp; &nbsp; &nbsp;&nbsp;"unLocalizedInternalMessage":&nbsp;"Number of failed attempts exceeded the throttle threshold limit",&nbsp; &nbsp; &nbsp;&nbsp;"localizationKey":&nbsp;"REGAPI.THROTTLE_EXCEEDED",&nbsp;&nbsp; &nbsp; &nbsp;&nbsp;"parametersMap": {},&nbsp; &nbsp; &nbsp;&nbsp;"subValidationMessageList": []&nbsp; &nbsp; }&nbsp; ]}

我通过使用 X-Forwarded-For标头成功绕过了它。

此端点存在速率限制绕过和身份验证缺失的问题,因此我将其报告。

#

后退一步

我知道我没能找到任何受害者,而攻击者需要暴力破解

AZ=26+0–9=10->36¹¹

每次发生这样的事,我都会想到,最好的情况也是我的报告会被标记为信息/P4 并关闭;所以我退后了一步。

得知该应用会管理活动后,我很好奇参加过该公司相关活动的人会获得怎样的徽章;于是我就直接在谷歌上搜索了一下。

<company name>&nbsp;event&nbsp;badge

然后我一直往下翻,直到在活动中找到一张有趣的自拍照。

我在自拍中看到了徽章上显示的二维码。

出于好奇,我决定扫描一下,于是我下载了图片,裁剪出二维码,然后扫描了它,令人惊讶的是,二维码的值竟然是确认号码。

单凭确认号码无法获取受害者的个人身份信息 (PII),我需要与此确认号码关联的事件用户 ID (event-uid)。

为了获取准确的事件日期,我从帖子日期中获取了事件日期,如下所示。

然后我用谷歌搜索了

<company-name> event (date of post -1)&nbsp;# if you have attended an event, there's a high chance your posts will be the next daythe search term was&nbsp;> target event may 1

我找到了本次活动的报名页面。

活动已结束,无法注册,但启动购票流程足以让我获取所需的活动 uid。

通过返回到易受攻击的端点并使用

我已成功获取该受害者的个人身份信息!

#

更多受害者

为了找到获取 UUID 的可靠方法,我开始进行开源情报搜集,寻找参加过与该公司相关活动的人员,并通过以下方式成功获取了更多受害者:

  • 使用话题标签

第一个受害者的帖子包含一个标签 #very_cool_event ,所以我在 X(推特)的搜索栏中使用它,然后继续滚动查找发布包含他们的徽章和泄露其二维码的照片的人。

  • 谷歌搜索

如果只在知名平台的搜索栏里使用话题标签,我会错过很多我不知道的平台(你不知道你不知道的东西);所以为了拓宽我的潜在平台范围,我用了这个笨蛋工具。

intext:#very_cool_event

这让我有机会了解新的平台,甚至想起了一些我当时忘记的知名平台。

  • 在谷歌中使用图片进行搜索

当我尝试使用话题标签方法寻找更多受害者时,我发现很多用户只是拍下他们的徽章照片并发布到社交媒体上(没有自拍);所以我拍了一张这样的照片,并用它在谷歌上搜索。

这种方法让我更容易接触到更多受害者。

然后我提交了另一份报告,这份报告被认定为严重问题。

#

总结

综合以上步骤,重现问题的步骤如下:

  1. 前往社交媒体平台
  2. 使用与活动相关的标签进行搜索(#示例)
  3. 向下滚动直到找到带有可扫描二维码的已公开徽章。
  4. 扫描二维码获取确认号码
  5. 使用帖子发布日期获取事件 UID
  6. 使用确认号码和事件 UID 获取此受害者的个人身份信息 (PII)

我还收到了 h1_analyst_sky 的点赞。

仅此而已。

如果您有任何问题或反馈,请随时私信我。

LinkedIn 或 Twitter 。

下次再见!


免责声明:

本文所载程序、技术方法仅面向合法合规的安全研究与教学场景,旨在提升网络安全防护能力,具有明确的技术研究属性。

任何单位或个人未经授权,将本文内容用于攻击、破坏等非法用途的,由此引发的全部法律责任、民事赔偿及连带责任,均由行为人独立承担,本站不承担任何连带责任。

本站内容均为技术交流与知识分享目的发布,若存在版权侵权或其他异议,请通过邮件联系处理,具体联系方式可点击页面上方的联系我

本文转载自:Rsec Abdallah Ahmed Abdallah Ahmed《0124.距离被曝光仅一步之遥:利用人类行为》

评论:0   参与:  0