我的第一次交互是了解应用程序的使用方式,浏览所有可访问的功能,并对每个功能进行一点点探索,而不会落入任何兔子洞。一段时间后,我发现了一个 IDOR 漏洞,该漏洞已作为已接受的风险关闭。
“不安全的直接对象引用 (IDOR) 是一种 Web 应用程序安全漏洞,当应用程序在没有适当访问控制的情况下向用户公开内部对象标识符(例如数据库密钥或文件路径)时,就会发生这种漏洞。”
我是如何发现 IDOR 是此应用程序上下一个有效错误的密钥,IDOR 如下所示。
-
我转到 https://redacted.com/example/ 7ce9f641-e29a-4d01-bea1–2b83924d8358 -
该页面的 javascript 使用 URL 的 UUID 获取资源→ https://resources.redacted.com/resources/ 7ce9f641-e29a-4d01-bea1–2b83924d8358。 -
该资源路径在提供的 UUID 上具有 IDOR,这意味着任何用户都可以访问该特定路由。
在尝试新的标识符时,我发现你可以使用 ..%2f 来控制 JavaScript 获取的资源的路由。
一个例子是:
这是一个 CSRF,因为你可以控制 javascript 在前端获取的 GET 路由。
攻击者使用 CSRF(Cross Site Request Forgery)强制用户发出经过身份验证的恶意请求。
对这个上下文没有任何安全影响,但记下所有小错误很重要,你可能可以在应用程序的其他部分找到相同的错误。注意接下来发生的事情。
这个小错误存在于应用程序的很大一部分路由上,好的部分是当我在接受邀请功能中发现相同的错误时。
此功能如下所示
-
我去 https://redacted.com/accept-invitation?userId=6502b3fc-22dd-4f16-a883–36d825aa8ca0&name=Nightbloodz&invitationId=e04cd1f5-e876–4d12-a4e8–9d7e05db0b0b -
新页面将加载一个按钮,上面写着 “Accept Invitation” -
当您单击该按钮时,将使用提供的 UUID 向 https://redacted.com/invite/e04cd1f5-e876–4d12-a4e8–9d7e05db0b0b/accept发送 POST 请求。 -
如果我把..%2f,我可以将 URL 发送给任何用户,并且可以将经过身份验证的 POST 请求发送到域的任何端点,即所有 POST 路由上的 CSRF。
此攻击的一个示例是:
之后,我发现了一些会对受害者造成恶意影响的 POST 端点,最终的 POC 会是这样的。
-
受害者点击您的邀请链接,然后点击“接受邀请”。 -
经过身份验证的 POST 请求将发送到攻击者提供的以下路由之一:
- /logout →注销用户
- /course/courseID/publish →发布现有草稿
- /course/courseID/share/userid →与攻击者共享私人课程或资源
- /course/courseID/delete → 删除课程或资源
...有很多低影响的路线。
自我 XSS
使用相同的 Client-Side 路径遍历,我能够升级 SELF XSS。
有一个具有此工作流程的故事创建器功能。
-
故事草稿创建,该草稿就像一个可编辑的拼贴画,您可以在其中放置图像、视频或文本。可使用如下 URL https://redacted.com/create/1aefacb0–6280–4b58-a6f9–39940b4ae616 进行访问。 -
当您访问该 URL 时,javascript 使用只有所有者才能访问的草稿 UUID 获取 https://redacted.com/stories/drafts/1aefacb0–6280–4b58-a6f9–39940b4ae616,响应包含一个包含所有草稿信息的 JSON。
用于在前端绘制故事的 DRAFT DATA:
[
{
"type":"image",
"url":"https://image.com/image.jpg"
},
{
"type":"video",
"url":"https://video.com/video"
},
{
"type":"text",
"text":"text"
},
...
]
-
该草稿可以发布,任何用户都可以通过 https://redacted.com/stories/1aefacb0–6280–4b58-a6f9–39940b4ae616/public 访问该故事 JSON 数据,它包含与草稿相同的数据。
经过一番研究,我在编辑草稿时发现了一个响应错误,大概是这样的:
请求 JSON 数据以更改草稿:
[
{
"type":"thistypedoesnotexist"
}
]
响应:
{
"error":"thistypedoesnotexist type doesn't exist, use video, image, text or iframe."
}
可以在草稿中创建 iframe 对象,最好的是我可以控制 iframe 的完整 URL,这意味着我可以使用“javascript:alert()”来触发 XSS,并且我能够使用 javascript 代码提取会话令牌,这将导致帐户接管。
使用以下方法编辑草稿信息:
[
{
"type":"iframe",
"url":"javascript:alert()"
}
]
导致 XSS:
自身 XSS 到 XSS
该 XSS 的问题在于,只有该草稿的所有者才能弹出 XSS,并且它不会影响任何其他用户。我尝试在故事的已发布版本而不是草稿中弹出 XSS,iframe 对象位于公共 JSON 数据中,但 iframe 不存在于公共故事中。
工作流的 javascript 资源获取部分与之前的 “accept invitation” 类似,并且容易受到客户端路径遍历的攻击。
我的目标是加载公共故事 JSON 信息,而不是草稿 JSON 信息,以便任何用户都可以获取故事信息并弹出 XSS。
- 其他用户无法访问/stories/drafts/1aefacb0–6280–4b58-a6f9–39940b4ae616
,但它包含的信息与 /stories/1aefacb0–6280–4b58-a6f9–39940b4ae616/public 相同 -
草稿功能容易受到客户端路径遍历的影响,因此我将公共 JSON 路由注入到 URL 中,javascript 将加载所需的 JSON。 -
草稿 URL 未由其他用户加载注入:
https://redacted.com/create/1aefacb0–6280–4b58-a6f9–39940b4ae616
-
其他用户加载了注入的草稿 URL:
https://redacted.com/create/blah%2f..%2f..%2f1aefacb0–6280–4b58-a6f9–39940b4ae616%2fpublic
通过该注入,任何加载 https://redacted.com/create/blah%2f..%2f..%2f1aefacb0–6280–4b58-a6f9–39940b4ae616%2fpublic 的用户都将受到我的 XSS 的影响,我可以使用 javascript 接管他们的帐户,只能从内存存储中获取他们的会话令牌。
这两个 bug 表明,在应用程序的特定部分发现的 bug 可以在其他部分重复出现。
有很多攻击面使用这种攻击,但在报告了这 2 个错误并目睹了公司缺乏兴趣后,我决定转向其他应用程序。
就我而言,我不想花时间在一个将帐户接管严重性设置为 MEDIUM (6.1) 的程序上,并在他们应该重视 PII 披露时让我感到痛苦。当我要求更正时,三位彬彬接受了这种严厉,我仍然不明白这一点。
然后,该公司花了将近 2 个月的时间来评估 CSRF 报告。
在这种情况下,关键是停止哭泣并继续前进。
原文始发于微信公众号(红云谈安全):客户端路径遍历的威力:我如何通过“../”发现并升级 2 个 bug
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论