Bug Bounty:利用Acunetix发现Google XSS
字数 937 2025-08-25 22:58:34
利用Acunetix发现Google XSS漏洞分析报告
漏洞概述
本报告详细记录了使用Acunetix漏洞扫描器发现Google某服务中的跨站脚本(XSS)漏洞的过程,包括漏洞发现、分析、利用和修复的全过程。该漏洞最终获得Google漏洞赏金计划5000美元的奖励。
漏洞发现
扫描过程
- 使用Acunetix扫描器对Google各项服务进行常规扫描
- 扫描器报告了以下可疑URL:
https://google.ws/ajax/pi/fbfr?wvstest=javascript:domxssExecutionSink(1,%22%27%5C%22%3E%3Cxsstag%3E()locxss%22)
初步验证
- 虽然扫描器有时会出现误报,但考虑到目标为Google服务,决定深入分析
漏洞分析
HTTP响应分析
服务器返回的响应包含以下关键内容:
<!doctype html><div style="display:none">
<form method="post"> </form>
<script nonce="+ao+4Egc+7YExl3qyyWMJg==">
(function(){
var a=window.document.forms[0],
b=location.hash.substr(1);
b||window.close();
var c=b.split("&"),
d=decodeURIComponent(c[0]);
a.action=d;
for(var e=1;e<c.length;e++){
var f=c[e].split("="),
g=document.createElement("input");
g.type="hidden";
g.name=f[0];
g.value=decodeURIComponent(f[1]);
a.appendChild(g)
}
a.submit();
}).call(this);
</script>
</div>
代码解析
-
变量初始化:
a获取页面中的第一个表单b获取URL中#后的内容(即location.hash去掉#)
-
逻辑流程:
- 如果没有hash内容(
b为空),则关闭窗口 - 将hash内容按
&分割成数组c - 解码数组第一个元素
c[0]存入d - 将表单的action属性设置为
d - 遍历剩余参数,创建隐藏input并添加到表单
- 自动提交表单
- 如果没有hash内容(
漏洞原理
- 关键问题在于直接将URL hash部分解码后设置为表单的action属性
- 攻击者可构造恶意hash值执行任意JavaScript代码
漏洞利用
有效Payload
https://google.ws/ajax/pi/fbfr#javascript:alert(document.cookie)
影响范围
- 该漏洞也影响其他Google域名,如:
https://google.com/ajax/pi/fbfr#javascript:alert(document.cookie)
修复方案
修复代码
在设置action属性前添加验证:
0 != d.indexOf("http") && window.close();
修复原理
- 检查解码后的hash值是否以"http"开头
- 如果不是,则关闭窗口,阻止恶意代码执行
时间线
- 报告时间: 2019年12月27日 01:01
- 分类时间: 2019年12月27日 20:32
- 修复时间: 2020年1月8日
- 赏金支付: 2020年1月8日
- 赏金金额: 5000美元
经验总结
-
自动化工具的价值:
- Acunetix等扫描器能有效发现潜在漏洞
- 即使是大公司的服务也可能存在漏洞
-
代码审计要点:
- 特别注意动态设置DOM属性的操作
- 对用户输入必须进行严格验证
-
漏洞利用技巧:
- 理解location.hash的用法和潜在风险
- 分析JavaScript代码的执行流程是关键
-
修复建议:
- 对动态设置的属性值进行白名单验证
- 避免直接使用用户输入作为可执行代码