之前做的好多系统,并没有考虑安全问题,最近才有了这个意识,XSS和CSRF是比较常见的攻击方式,今天来了解一下,内容参考自浅说 XSS 和 CSRF,Web安全系列——XSS攻击和网络安全-CSRF
XSS
跨站脚本攻击(Cross Site Script),这种攻击是指攻击者在网站上注入恶意的客户端代码,通过恶意脚本对客户端网页进行篡改,从而在用户浏览网页时,对用户浏览器进行控制或者获取用户隐私数据。这些恶意程序通常是javascript,但也可能是Java,VBScript,ActiveX,Flash甚至是普通的HTML。如果攻击成功,攻击者就可能会获得更高权限,如用户的隐私数据cookie、session等,也可能会将victim重定向到由攻击者控制的网站,在victim的机器上进行一些恶意操作。
XSS 攻击分类
XSS攻击可以分为三类,一类是“反射型”,一类是“存储型”,还有一类”DOM Based”
反射型XSS
反射型XSS,也叫作非持久型XSS,字面理解,就是仅对当次页面访问有影响,通常要求用户访问一恶意连接,或者要提交一个表单,或者是进入一个被攻击者篡改后的网站。我们将XSS攻击的恶意脚本称为XSS Payload.反射型XSS把XSS的Payload写在URL中,通过浏览器直接“反射”给用户。
存储型XSS
存储型XSS,也叫持久型XSS,会把黑客输入的恶意脚本存储在数据库中或者说服务器端,当其他用户浏览包含该恶意脚本的页面时,就会执行该恶意脚本。如将恶意代码注入到一个新闻文本中或者评论中都会使访问该页面的用户执行这段恶意代码
DOM Based
基于 DOM 的 XSS 攻击是指通过恶意脚本修改页面的 DOM 结构,是纯粹发生在客户端的攻击。payload不在服务器发出的HTTP响应页面中,当客户端脚本运行时(渲染页面时),payload才会加载到脚本中执行
XSS的可能后果
- Cookie劫持攻击,Cookie中一般会保存用户的登录凭证,如果被盗取,可能通过Cookie登进用户的账户进行恶意操作
- 框架钓鱼,利用JS脚本操作网页中的DOM结构和内容,通过JS脚本,生成虚假的页面,欺骗用户执行操作,从而将用户所有的输入发送到攻击者的服务器上
- 。。。。。
XSS的预防
现如今好多浏览器都内置了XSS的措施,如firfox的CSP,IE8内置的XSS Filter等,开发者还可以使用的其他常用防御手段有
- HttpOnly防止截取Cookie
HttpOnly由微软提出,在IE6中实现,如今已逐渐成为标准,浏览器将禁止页面的Javascript 访问带有 HttpOnly 属性的Cookie,因此可以防止XSS攻击后的Cookie劫持 输入检查
不相信用户的任何输入,对于用户的输入一律进行检查,过滤和转义,建立可信任的字符和HTML标签白名单,对于不再白名单之列的自负或者标签进行过滤或编码输出转义
在服务器端输出数据之前对潜在的威胁的字符进行编码、转义
CSRF
跨站请求伪造(Cross-site request forgery),也叫作one-click attack 或者 session riding,是一种挟制用户在当前已登录的Web应用程序上执行非本意的操作的攻击方法。
通常的CSRF攻击是攻击者借助受害者的Cookie骗取服务器的信任,可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击服务器,从而在并未授权的情况下执行在权限保护之下操作
可能情况: 用户已经登录了www.aaa.com,自然aaa这个网站就会将用户的登录状态session存在cookie中;然后,aaa.com这个网页有一个对作品点赞的功能,点赞提交地址为aaa.com/api.like?id=777;这时,另外一个叫www.bbb.com的网站,放了这样一个元素< img src=”aaa.com/api.like?id=888”>,这样的话,一旦用户进入这个bbb.com页面,就会请求aaa.com这个网站的点赞接口,而且点赞的用户对象是888;最后因为用户的登录信息尚未过期,那就等于给id为888这个作品点赞了,然而,用户并不知情。
CSRF的预防
- Referer Check
通过HTTP的referer可知道,用户是通过哪个网站发送这个请求的。在通常情况下,访问一个安全受限页面的请求来自于同一个网站,所以可以通过判断referer的值来防御CRSF攻击,但是referer的判断并不是好方法,有各种方式可以绕过的方法 - 添加 token 验证
CSRF 攻击之所以能够成功,是因为攻击者可以完全伪造用户的请求,该请求中所有的用户验证信息都是存在于 Cookie 中,因此攻击者可以在不知道这些验证信息的情况下直接利用用户自己的 Cookie 来通过安全验证。要抵御 CSRF,关键在于在请求中放入攻击者所不能伪造的信息,并且该信息不存在于 Cookie 之中。可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求
CSRF和XSS的对比
XSS利用的是用户对指定网站的信任,CSRF利用的是网站对用户网页浏览器的信任。