1. 什么是XSS
Cross Site Scripting(跨站脚本攻击),是一种代码注入攻击。攻击者在目标网站注入恶意脚本,使之在用户的浏览器运行。利用这些恶意脚本,盗取用户的敏感信息如cookie等,进而危害数据安全。
2. 分类
分类:反射型(非持久型)XSS、存储型(持久型)XSS、DOM型XSS。
2.1 反射型(非持久型)XSS
反射型xss只是简单的把用户输入的数据从服务器反射给用户浏览器,要利用这个漏洞,攻击者必须以某种方式诱导用户访问一个精心设计的URL(恶意链接),才能实施攻击。比如:如果未做防范XSS,用户名设为,则会执行预设好的JavaScript代码。
2.1.1 漏洞成因
当用户的输入或者一些用户可控参数未经处理地输出到页面上,就容易产生XSS漏洞。主要场景有以下几种:
● 将不可信数据插入到HTML标签之间时;// 例如div, p, td;
● 将不可信数据插入到HTML属性里时;// 例如:<div width=$INPUT>
● 将不可信数据插入到SCRIPT里时;// 例如:
● 还有插入到Style属性里的情况,同样具有一定的危害性;// 例如<span style=” property : $INPUT ”>
● 将不可信数据插入到HTML URL里时,// 例如:<a href=”www.abcd.com?param= $INPUT ”>
● 使用富文本时,没有使用XSS规则引擎进行编码过滤。
若服务端或者前端没有做好防范措施,就会出现漏洞隐患。
2.1.2 攻击流程
反射型XSS通常出现在搜索等功能中,需要被攻击者点击对应的链接才能触发,且受到XSS Auditor(chrome内置的XSS保护)、NoScript等防御手段的影响较大,所以它的危害性较存储型要小。
2.2 存储型(持久型)XSS
存储型(或 HTML 注入型/持久型)XSS 攻击最常发生在由社区内容驱动的网站或 Web 邮件网站,不需要特制的链接来执行。黑客仅仅需要提交 XSS 漏洞利用代码(反射型XSS通常只在url中)到一个网站上其他用户可能访问的地方。这些地区可能是博客评论,用户评论,留言板,聊天室,HTML 电子邮件,wikis,和其他的许多地方。一旦用户访问受感染的页,执行是自动的。
2.2.1 漏洞成因
存储型XSS漏洞的成因与反射型的根源类似,不同的是恶意代码会被保存在服务器中,导致其它用户(前端)和管理员(前后端)在访问资源时执行了恶意代码,用户访问服务器-跨站链接-返回跨站代码。
2.2.2 攻击流程
2.3 DOM型XSS
通过修改页面的DOM节点形成的XSS,称之为DOM Based XSS。
2.3.1 漏洞成因
DOM型XSS是基于DOM文档对象模型的。对于浏览器来说,DOM文档就是一份XML文档,当有了这个标准的技术之后,通过JavaScript就可以轻松的访问DOM。当确认客户端代码中有DOM型XSS漏洞时,诱使(钓鱼)一名用户访问自己构造的URL,利用步骤和反射型很类似,但是唯一的区别就是,构造的URL参数不用发送到服务器端,可以达到绕过WAF、躲避服务端的检测效果。
2.3.2 攻击示例
<html>
<head>
<title>DOM Based XSS Demo</title>
<script>
function xsstest()
{
var str = document.getElementById("input").value;
document.getElementById("output").innerHTML = "<img
src='"+str+"'></img>";
}
</script>
</head>
<body>
<div id="output"></div>
<input type="text" id="input" size=50 value="" />
<input type="button" value="submit" onclick="xsstest()" />
</body>
</html>
在这段代码中,submit按钮的onclick事件调用了xsstest()函数。而在xsstest()中,修改了页面的DOM节点,通过innerHTML把一段用户数据当作HTML写入到页面中,造成了DOM Based XSS。
3. 防止XSS攻击
1、输入过滤:包括用户输入、url参数、post请求参数、Ajax
2、输出转义:比如<:‘<’ >:‘>’,转成特殊字符的实体
3、cookie设置为http-only(在服务端设置),那么页面的js将无法读取到cookie信息
4. 什么是CRSF攻击
Cross Site Request Forgery(跨站请求伪造),CSRF或XSRF。
CSRF通过伪装已登录用户身份,向网站发送恶意请求。
4.1 攻击流程
用户登录受信任网站A,在本地生成cookie 2、在不登出A的情况下,访问危险网站B,B含有需要用户身份的恶意请求,用户浏览器携带cookie发送请求,从而在用户不知情的情况下完成了一次请求。
4.2 防止CRSF攻击
1、验证码:强制用户与应用进行交互,才能完成最终请求。这种方式能很好的抑制csrf,但是用户体验较差
2、Referer Header:根据HTTP协议,在HTTP头中有一个字段叫Referer,记录了该HTTP请求的来源地址。 服务器判断请求头的referer。这种方法并非万无一失,Referer的值是由浏览器提供的,每个浏览器对于Referer的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞。在部分情况下,攻击者可以隐藏,甚至修改自己请求的Referer。
3、服务端产生加密的token,客户端存到本地(cookie或localStorage,需要防止xss),以后的请求都将token放到authorization发送到服务端,服务端解密token判断。
5. CSRF与XSS的区别
本质上讲,XSS是代码注入问题,CSRF是http问题。
XSS是内容没有过滤导致浏览器将攻击者的输入当代码执行
CSRF是因为浏览器在发送HTTP请求时自动带上cookie,而一般网站的session-id都存在cookie里