Link和作者使用Acunetix扫描器发现了Google的一处XSS。
作为日常的研究工作,我们经常用不同的漏洞扫描器扫描Google的各种服务。不久前漏洞扫描器报告了以下XSS
https://google.ws/ajax/pi/fbfr?wvstest=javascript:domxssExecutionSink(1,%22%27%5C%22%3E%3Cxsstag%3E()locxss%22)
有时候存在误报情况,但既然扫到了Google的漏洞,还是要深入研究一下。
接下来就是检查分析HTTP响应
HTTP/1.1 200 OK
...
<!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>
该响应包含一个空表单和一些JavaScript代码。我们将代码弄得美观一些
(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);
然后了解代码每一步的原理
(function() {
// 将要自动执行的函数
}).call(this);
(function() {
// The variable “a” points to a form that is empty right now
var a = window.document.forms[0],
// The variable b is a location hash without the # character
b = location.hash.substr(1);
// If there is no b (no hash in the location URI), try to self-close
b || window.close();
// Split the location hash using the & character
var c = b.split("&"),
// And decode the first (zero) element
d = decodeURIComponent(c[0]);
// The hash value becomes the action of the form
a.action = d;
// The below content is not important in the context of the issue
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)
}
// The form is auto-submitted
a.submit();
}).call(this);
一旦我们知道了函数的工作原理,接下来就是构造一个合适的payload:
https://google.ws/ajax/pi/fbfr#javascript:alert(document.cookie)
我们还决定看看此漏洞是否会影响其他Google域:
https://google.com/ajax/pi/fbfr#javascript:alert(document.cookie)
只需更改一行代码即可消除该漏洞:
(function() {
var a = window.document.forms[0],
b = location.hash.substr(1);
b || window.close();
var c = b.split("&"),
d = decodeURIComponent(c[0]);
// 只需更改以下行。
// to check if the location hash begins with http:
0 != d.indexOf("http") && window.close();
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);
漏洞报告时间:2019年12月27日上午01:01。
漏洞分类时间:2019年12月27日下午08:32。
修复时间:2020年1月8日。
支付赏金:2020年1月8日。
赏金金额:5000美元
原文:https://www.acunetix.com/blog/web-security-zone/xss-google-acunetix/