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的内容。