0CTF blog bypass csp nonce

赛后复现的一个题,用到了很多技巧,复现的过程收获很大,这篇文章从一个新手的角度来分析这道xss题目。

网站有几个功能

/new : 发布新文章
/: 查看发布的文章
/flag: flag,需要得到管理员看到的flag页面
/submit: 提交链接
/article/3869: 查看文章链接

网站的csp规则为:

Content-Security-Policy: script-src 'self' 'unsafe-inline'
Content-Security-Policy: default-src 'none'; script-src 'nonce-YR0W8GPS4XSyrpssLDEnV7EtYtM=' 'strict-dynamic'; style-src 'self'; img-src 'self' data:; media-src 'self'; font-src 'self' data:; connect-src 'self'; base-uri 'none'

很有意思的是这里用了两个csp规则,csp1和csp2都有

两个CSP分开写,是同时生效并且单独生效的,也就是与的关系。

换个说法就是,strict-dynamic 表明我们可以运行动态生成的js, 假设我们通过动态生成script标签的方式(dom xss),成功绕过了第二个CSP,但我们引入了' ], '3waves': [ '', '' ], 'lines': [ '', '' ], 'sphere': [ '', '' ], }

即根据我们输入的内容选择对应的js特效,但是这里输入值并没有白名单过滤(不要相信用户的输入),导致我们构造恶意的js内容

思路:

  1. 我们首先需要覆盖掉config.js
    , ">">
    0CTF blog bypass csp nonce_第1张图片
    image.png

    effect参数这里服务端限制只能写入70个字节,bypass csp1的unsafe-inline的很多方法都用不了了。

    大佬给出的payload:

    id">

    直接弹出name是没有任何内容的,但是我们通过该网站login?next调到我们的服务器上时会有什么变化呢,我们访问:http://202.120.7.197:8090/login?next=http://lj.s7star.cn/xss/name.html

    成功弹框前一个网页的name数据

    0CTF blog bypass csp nonce_第2张图片
    image.png

    那么我们如何将我们http://202.120.7.197:8090/article/3879 网站的name发出来呢?

    我们再我们vps上再挂个html:

    
    
    
    
    
    

    我们添加了一个iframe指向我们的文章,因为该网站并没有设置x-frame-options选项,因此可以被嵌入,因为浏览器会保存cookie,因此iframe里面的页面无需登陆就可以访问到。

    frames[0].document
    VM1835:1 Uncaught DOMException: Blocked a frame with origin "http://lj.s7star.cn" from accessing a cross-origin frame.
        at :1:11
    (anonymous) @ VM1835:1
    frames[0].window.name
    VM2087:1 Uncaught DOMException: Blocked a frame with origin "http://lj.s7star.cn" from accessing a cross-origin frame.
        at :1:18
    frames[0].location="/"
    "/"
    name
    ""
    frames[0].name
    "flag{ONLY_4dmin_can_r3ad_7h!s}"
    

    在我们的vps网站上测试,虽然因为同源策略限制我们无法访问iframe里面的dom,也无法直接获取iframe的name值,但我们可以改变window.href调到我们的首页来,此时iframe已经和我们的vps同源,我们就可以将name带出来并且访问成功了.

    知道怎么带出来后我们就可以顺利写出poc了.

    
    
    

    上面这段就不难理解了,先用iframe指向含有xss的文章链接,通过location.href跳到我们的vps上面来,并将name带出来,获取iframe的name窗口值并发送到我们监听的端口上。

    最后提交我们的链接:

    http://202.120.7.197:8090/login?next=http://lj.s7star.cn/xss/evil.html
    
    0CTF blog bypass csp nonce_第3张图片
    image.png

    参考:

    https://lorexxar.cn/2018/04/05/0ctf2018-blog/

    https://blog.cal1.cn/post/0CTF%202018%20Quals%20Bl0g%20writeup

你可能感兴趣的:(0CTF blog bypass csp nonce)