如何将"不适用"的反射型XSS转化为欧洲HR巨头的"已确认"发现
TL;DR 我在一个范围内的目标(年收入33.9亿欧元的欧洲人力资源巨头)上进行主动安全测试时,发现网站搜索框存在反射型DOM XSS漏洞,用户输入通过AJAX响应返回并以未转义的方式插入到DOM中。初步分类将其关闭为不适用;在提供多个PoC和其他证据(GIF + webhook日志)后,目标安全团队于2025年10月17日验证并接受了这一发现。
教训:坚持和证据胜过假设和草率的分类。
你好,黑客们!
在Bug Bounty计划范围内的目标上进行测试时,我注意到搜索输入框通过AJAX端点将查询参数中的原始输入反射到DOM中。
基本payload的初始尝试被过滤:<script>标签被阻止,空格也被阻止。
但当我注入简单的HTML如<i>test</i>时,它以斜体呈现,确认了HTML注入。
那时我发现了接收器。我意识到页面在客户端使用.html(),意味着事件处理程序可以存活。
于是开始了过滤器绕过战争:无空格payload、零点击/点击执行。我不断制作payload,攻击目标的过滤器和越来越多的PoC列表。我不能放弃;我有那种感觉,当某些事情不对劲时。我坚持了下来,最终成功了!
发现(2025年9月21日)
约束条件:
- 无空格
- 严格的128字符限制
- 输入通过AJAX反射到DOM
- 无CSP
- 事件属性被保留
尽管如此,我能嗅到漏洞的存在,所以我继续前进直到它出现。
代码片段
第一个PoC:最初payload只是为了证明DOM执行:
|
|
最终让发现被接受的payload是分类团队要求的:“如果你能注入一个表单,将数据POST到你控制的位置,我很乐意接受”。换句话说,他们想要一个payload,将输入框注入到页面中,当提交时,通过POST将输入的数据发送到我控制的端点。
我回复了以下payload:
|
|
完整URL示例如下:
|
|
报告过程
提交日期:2025年9月21日
2025年9月22日,报告被关闭为"不适用"
分类回复说"我们无法复现你的PoC,因此我们将你的报告关闭为不适用",而不是先给我回复的机会。于是战斗开始了。
49天战斗:拒绝→改进→接受
坚持胜过骄傲。拒绝给了我他们需要接受发现的线索。
9月22日: 关闭为"不适用,PoC不再工作"
于是我回复GIF + webhook日志,证明它仍然"工作"。
这表明他们实际上是错误的。
9月30日: 他们重新开放但将严重性改为→“低影响/无登录”
我展示了登录路径 + 钓鱼表单注入PoC。
10月1日: 分类团队再次推回,但他提到"如果你能注入一个表单,将数据POST到你控制的位置,我很乐意接受"。于是我交付了他请求的onclick PoC。
10月17日: 实际公司的安全团队回应:“经过测试,我们已经复现了你的PoC RXSS。“标记为已接受。
获胜的PoC
一个”