XSS和CSRF
概念
-
XSS(Cross-site scripting)攻击全称跨站脚本攻击,是一种经常出现在web应用中的计算机安全漏洞,它允许web用户恶意将代码植入到提供给其它用户使用的页面中。比如这些代码包括HTML代码和客户端脚本。攻击者利用XSS漏洞旁路掉访问控制——例如同源策略(same origin policy)。这种类型的漏洞由于被骇客用来编写危害性更大的网络钓鱼攻击而变得广为人知。 - 当发生了在目标用户的浏览器层面上,当渲染
DOM树的过程发生了不在预期内执行的JS代码时,就发生了XSS攻击 - 跨站脚本的重点不在‘跨站’上,而在于脚本上。大多数
XSS攻击的主要方式是嵌入一段远程或者第三方域上的JS代码。实际上是在目标网站的作用域下执行了这段js代码。
攻击方式
反射型XSS
- 反射型
XSS,也叫非持久型XSS,是指发生请求时,XSS代码出现在请求URL中,作为参数提交到服务器,服务器解析并响应。响应结果中包含XSS代码,最后浏览器解析并执行。 - 重要特征:
- 出现在
URL请求路径; - 服务端需要解析
- 浏览器解析后,
XSS代码才能攻击。
- 出现在
- 这种方式可以获取存储在cookie中的用户信息。
存储型XSS
- 存储型
XSS,也叫持久型XSS,主要是将XSS代码发送到服务器(不管是数据库、内存还是文件系统等),然后在下次请求页面的时候就不用带上XSS代码了。 - 最典型的就是留言板
XSS。用户提交了一条包含XSS代码的留言到数据库。当其他用户查询留言时,那些留言的内容会从服务器解析之后加载出来。浏览器发现有XSS代码,就当做正常的HTML和JS解析执行。XSS攻击就发生了。
DOM XSS
-
DOM XSS攻击不同于反射型XSS和存储型XSS,DOM XSS代码不需要服务器端的解析响应的直接参与,而是通过浏览器端的DOM解析。 - 前提是易受攻击的网站有一个
HTML页面采用不安全的方式从document.location或document.URL或document.referrer获取数据(或者任何其他攻击者可以修改的对象)。
危害
- 通过
document.cookie盗取cookie。 - 使用
js或css破坏页面正常的结构与样式 - 流量劫持(通过访问某段具有
window.location.href定位到其他页面) -
Dos攻击:利用合理的客户端请求来占用过多的服务器资源,从而使合法用户无法得到服务器响应。 - 利用
iframe、frame、XMLHttpRequest或上述Flash等方式,以(被攻击)用户的身份执行一些管理动作,或执行一些一般的如发微博、加好友、发私信等操作。 - 利用可被攻击的域受到其他域信任的特点,以受信任来源的身份请求一些平时不允许的操作,如进行不当的投票活动。
防御
- 采用特征匹配方式,在所有提交的信息中都进行匹配检查。对于这种类型的
XSS攻击,采用的模式匹配方法一般会对javascript这个关键字进行检索,一旦发现提交信息中包含javascript,就认定为XSS攻击。但是,这种防御的缺陷也很致命,即可以通过tab或者空格来躲避这种特征匹配。 - 对输入内容的特定字符进行编码,例如表示
html标记的< >等符号; - 对重要的
cookie设置httpOnly, 防止客户端通过document.cookie读取cookie,此HTTP头由服务端设置。 - 不要使用
Eval来解析并运行不确定的数据或代码,对于JSON解析请使用JSON.parse()方法;这个主要是防止DOMXSS的攻击。 - 后端接口也应该要做到关键字符过滤的问题。
应对XSS攻击的主要手段还是编码与过滤两种,编码用于将特殊的符号<、>、&、'、""进行转义,而过滤则是阻止特定的标记、属性、事件。
总结
-
XSS即跨站点脚本攻击,只要浏览器加载,解析,执行了意料之外的JS,CSS等都可以被认为是受到了XSS攻击,而XSS攻击的分类主要有反射型、存储型和**DOM XSS** 三种。 -
反射型攻击者通过包装改造URL参数,然后利用前端代码的缺陷或漏洞来攻击,它更偏向与前端层面,并且在实际攻击中攻击者会根据
HTML实体编码、URL编码、uniocde编码等进行编码然后欺骗用户点击访问。而存储型攻击者则会通过抓包工具或者是直接调用接口的方式想尽一切办法来向后端数据库注入数据。
CSRF
概念
-
CSRF(Cross-site request forgery)跨站请求伪造,也被称为One Click Attack或者Session Riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。 - 尽管听起来像跨站脚本
XSS,但它与XSS非常不同,XSS利用站点内的信任用户,而CSRF则通过伪装成受信任用户的请求来利用受信任的网站。 - 与
XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。
攻击方式
防御
验证
HTTP Referer字段
-
HTTP头中有一个字段交Referer,记录了该HTTP请求的来源地址。所以当有人恶意利用CSRF攻击时,可以先验证Referer值,如果该值合法那么才允许进行后续操作,否则拒绝这次请求。 - 这种防御方式最关键的地方,就是要保证
Referer值的正确性,一旦被人修改或者仿造,那么依然可以进行CSRF攻击。并且部分行业的人员为了防止网站信息被泄露,可能在发送请求时不提供Referer,这样服务器端会误认为是CSRF攻击而拒绝这次请求。
在请求地址中添加 token 并验证
-
CSRF攻击之所以能够成功,是因为黑客可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于cookie中,因此黑客可以在不知道这些验证信息的情况下直接利用用户自己的cookie来通过安全验证。要抵御CSRF,关键在于在请求中放入黑客所不能伪造的信息,并且该信息不存在于cookie之中。可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务器端建立一个拦截器来验证这个token,如果请求中没有token或者token内容不正确,则认为可能是CSRF攻击而拒绝该请求。 - 这种防御方式的关键在于,不能让token被黑客获取,但是一般很难有效的防止
token不被他人窃取。并且,如何高效的保证什么请求应该携带token,什么请求不需要携带token,也需要一番功夫。
在 HTTP 头中自定义属性并验证
- 这种方法也是使用
token并进行验证,和上一种方法不同的是,这里并不是把token以参数的形式置于HTTP请求之中,而是把它放到HTTP头中自定义的属性里。 - 通过
XMLHttpRequest这个类,可以一次性给所有该类请求加上csrftoken这个HTTP头属性,并把 token 值放入其中。这样解决了上种方法在请求中加入token的不便,同时,通过XMLHttpRequest请求的地址不会被记录到浏览器的地址栏,也不用担心token会透过Referer泄露到其他网站中去。
两者的区别
-
CSRF需要用户先登录访问网站A,获取他的cookie;而XSS不需要登录即可。 -
CSRF是利用网站A本身的漏洞,去请求网站A的api;而XSS是向网站A注入JS代码,然后执行JS里的代码,篡改网站A的内容。