文章目录

  • XSS
    • 反射型
    • 持久型
    • DOM型
    • XSS如何防御?
  • CSRF

XSS

XSS全程Cross Site Scripting,名为跨站脚本攻击,是一种常见于 Web 应用中的计算机安全漏洞。

恶意攻击者往 Web 页面里嵌入恶意的客户端脚本,当用户浏览此网页时,脚本就会在用户的浏览器上执行,进而达到攻击者的目的。
比如获取用户的 Cookie、导航到恶意网站、携带木马等。

攻击者对客户端网页注入的恶意脚本一般包括 JavaScript,有时也会包含 HTML 和 Flash。
有很多种方式进行 XSS 攻击,但它们的共同点为:将一些隐私数据像 cookie、session 发送给攻击者,将受害者重定向到一个由攻击者控制的网站,在受害者的机器上进行一些恶意操作。

大部分的 XSS 漏洞都是由于没有处理好用户的输入,导致恶意脚本在浏览器中执行。任何输入提交数据的地方都有可能存在 XSS。

XSS攻击可以分为3类:反射型(非持久型)、存储型(持久型)、基于DOM。


反射型

反射型 XSS 只是简单地把用户输入的数据 “反射” 给浏览器,这种攻击方式往往需要攻击者诱使用户点击一个恶意链接,或者提交一个表单,或者进入一个恶意网站时,注入脚本进入被攻击者的网站。

攻击者可以注入任意的恶意脚本进行攻击,可能注入恶作剧脚本,或者注入能获取用户隐私数据(如cookie)的脚本,这取决于攻击者的目的。

持久型

存储型 XSS 会把用户输入的数据 “存储” 在服务器端,当浏览器请求数据时,脚本从服务器上传回并执行。这种 XSS 攻击具有很强的稳定性。

比较常见的一个场景是攻击者在社区或论坛上写下一篇包含恶意 JavaScript 代码的文章或评论,文章或评论发表后,所有访问该文章或评论的用户,都会在他们的浏览器中执行这段恶意的 JavaScript 代码。

DOM型

基于 DOM 的 XSS 攻击是指通过恶意脚本修改页面的 DOM 结构,是纯粹发生在客户端的攻击。

XSS 代码可能是插入简单的<script src="https://test.com/haker.js">,载入第三方的恶意脚本,这些恶意脚本,通常是读取用户的 cookie 。

XSS如何防御?

XSS 漏洞是由于对用户提交的数据没有经过严格的过滤处理造成的,所以防御的原则就是不相信用户输入的数据,对输入进行过滤,对输出进行编码。

1、使用XSS Filter(输入检查):
针对用户提交的数据进行有效的验证,只接收我们规定的长度或内容的提交,过滤掉其他的输入内容。

eg:

  • 表单数据指定值的类型:年龄只能是 int 、name 只能是字母数字等。
  • 过滤或移除特殊的 html 标签:<script><iframe>等。
  • 过滤 js 事件的标签:onclick、onerror、onfocus等。

2、html实体
当需要往 HTML 标签之间插入不可信数据的时候,首先要做的就是对不可信数据进行 HTML Entity 编码,在 html 中有些字符对于 HTML 来说是具有特殊意义的,所以这些特殊字符不允许在文本中直接使用,需要使用实体字符。

html 实体的存在是导致 XSS 漏洞的主要原因之一,因此我们需要将实体转化为相应的实体编号。

显示结果 描述 实体编号
空格 &nbsp ;
< 小于 &lt ;
> 大于 &gt ;
& &amp ;
‘’ 引号 &quot ;

3、Http Only cookie

许多 XSS 攻击的目的就是为了获取用户的 cookie,将重要的 cookie 标记为 http only,这样的话当浏览器向服务端发起请求时就会带上 cookie 字段,但是在脚本中却不能访问 cookie,这样就避免了 XSS 攻击利用 js 的 document.cookie获取 cookie。


CSRF

CSRF,即 Cross Site Request Forgery,名为跨站请求伪造,是一种劫持受信任用户向服务器发送非预期请求的攻击方式。

通常情况下,CSRF攻击是攻击者借助受害者的Cookie骗取服务器的信任,可以在受害者毫不知情的情况下以受害者名义伪造请求发送给受攻击服务器,从而在未授权的情况下执行在权限保护之下的操作。

CSRF攻击原理及过程:

  1. 用户C打开浏览器,访问受信任网站A,输入用户名和密码请求登录网站A;
  2. 在用户信息通过验证后,网站A产生Cookie信息并返回给浏览器,此时用户登录网站A成功,可以正常发送请求到网站A;
  3. 用户未退出网站A之前,在同一个浏览器中,打开一个Tab页访问网站B;
  4. 网站B接收到用户请求后,返回一些攻击性代码,并发出一个请求要求访问第三方站点A。;
  5. 浏览器在接收到这些攻击性代码后,根据网站B的请求,在用户不知情的情况下携带Cookie信息,向网站A发出请求。网站A并不知道该请求其实是由B发起的,所以会根据用户C的Cookie信息以C的权限处理该请求,导致来自网站B的恶意代码被执行。

CSRF攻击实例:

受害者 Bob 在银行有一笔存款,通过对银行的网站发送请求 http://bank.example/withdraw?account=bob&amount=1000000&for=bob2 可以使 Bob 把 1000000 的存款转到 bob2 的账号下。
通常情况下,该请求发送到网站后,服务器会先验证该请求是否来自一个合法的 session,并且该 session 的用户 Bob 已经成功登陆。

黑客 Mallory 自己在该银行也有账户,他知道上文中的 URL 可以把钱进行转帐操作。Mallory 可以自己发送一个请求给银行:http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory。但是这个请求来自 Mallory 而非 Bob,他不能通过安全认证,因此该请求不会起作用。

这时,Mallory 想到使用 CSRF 的攻击方式,他先自己做一个网站,在网站中放入如下代码: src=”http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory ”,并且通过广告等诱使 Bob 来访问他的网站。当 Bob 访问该网站时,上述 url 就会从 Bob 的浏览器发向银行,而这个请求会附带 Bob 浏览器中的 cookie 一起发向银行服务器。大多数情况下,该请求会失败,因为他要求 Bob 的认证信息。
但是,如果 Bob 当时恰巧刚访问他的银行后不久,他的浏览器与银行网站之间的 session 尚未过期,浏览器的 cookie 之中含有 Bob 的认证信息。
这时,悲剧发生了,这个 url 请求就会得到响应,钱将从 Bob 的账号转移到 Mallory 的账号,而 Bob 当时毫不知情。等以后 Bob 发现账户钱少了,即使他去银行查询日志,他也只能发现确实有一个来自于他本人的合法请求转移了资金,没有任何被攻击的痕迹。而 Mallory 则可以拿到钱后逍遥法外。


防御CSRF攻击:
目前防御 CSRF 攻击主要有三种策略:验证 HTTP Referer 字段;在请求地址中添加 token 并验证;在 HTTP 头中自定义属性并验证。

1、验证HTTP Referer字段
根据 HTTP 协议,在 HTTP 头中有一个字段叫 Referer,它记录了该 HTTP 请求的来源地址。

通过 Referer Check,可以检查请求是否来自合法的”源”。

在通常情况下,访问一个安全受限页面的请求来自于同一个网站,比如需要访问 http://bank.example/withdraw?account=bob&amount=1000000&for=Mallory,用户必须先登陆 bank.example,然后通过点击页面上的按钮来触发转账事件。
这时,该转帐请求的 Referer 值就会是转账按钮所在的页面的 URL,通常是以 bank.example 域名开头的地址。
而如果黑客要对银行网站实施 CSRF 攻击,他只能在他自己的网站构造请求,当用户通过黑客的网站发送请求到银行时,该请求的 Referer 是指向黑客自己的网站。
因此,要防御 CSRF 攻击,银行网站只需要对于每一个转账请求验证其 Referer 值,如果是以 bank.example 开头的域名,则说明该请求是来自银行网站自己的请求,是合法的。
如果 Referer 是其他网站的话,则有可能是黑客的 CSRF 攻击,拒绝该请求。

然而,这种方法并非万无一失。Referer 的值是由浏览器提供的,虽然 HTTP 协议上有明确的要求,但是每个浏览器对于 Referer 的具体实现可能有差别,并不能保证浏览器自身没有安全漏洞。使用验证 Referer 值的方法,就是把安全性都依赖于第三方(即浏览器)来保障,从理论上来讲,这样并不安全。事实上,对于某些浏览器,比如 IE6 或 FF2,目前已经有一些方法可以篡改 Referer 值。如果 bank.example 网站支持 IE6 浏览器,黑客完全可以把用户浏览器的 Referer 值设为以 bank.example 域名开头的地址,这样就可以通过验证,从而进行 CSRF 攻击。

即便是使用最新的浏览器,黑客无法篡改 Referer 值,这种方法仍然有问题。因为 Referer 值会记录下用户的访问来源,有些用户认为这样会侵犯到他们自己的隐私权,特别是有些组织担心 Referer 值会把组织内网中的某些信息泄露到外网中。因此,用户自己可以设置浏览器使其在发送请求时不再提供 Referer。当他们正常访问银行网站时,网站会因为请求没有 Referer 值而认为是 CSRF 攻击,拒绝合法用户的访问。

2、在请求地址中添加token并验证
可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。

这种方法要比检查 Referer 要安全一些,token 可以在用户登陆后产生并放于 session 之中,然后在每次请求时把 token 从 session 中拿出,与请求中的 token 进行比对。

3、在 HTTP 头中自定义属性并验证
这种方法也是使用 token 并进行验证,和上一种方法不同的是,这里并不是把 token 以参数的形式置于 HTTP 请求之中,而是把它放到 HTTP 头中自定义的属性里。通过 XMLHttpRequest 这个类,可以一次性给所有该类请求加上 csrftoken 这个 HTTP 头属性,并把 token 值放入其中。


CSRF和XSS的区别:
1、CSRF需要登陆后操作,XSS不需要
2、CSRF是请求页面api来实现非法操作,XSS是向当前页面植入js脚本来修改页面内容。

XSS、CSRF攻击以及预防手段相关推荐

  1. XSS CSRF 攻击

    XSS CSRF 攻击 XSS:跨站脚本(Cross-site scripting) CSRF:跨站请求伪造(Cross-site request forgery)定义: 跨网站脚本(Cross-si ...

  2. 利用django中间件CsrfViewMiddleware防止csrf攻击

    一.在django后台处理 1.将django的setting中的加入django.contrib.messages.middleware.MessageMiddleware,一般新建的django项 ...

  3. 什么是 CSRF 攻击

    CSRF 英文全称是 Cross-site request forgery,所以又称为"跨站请求伪造",是指黑客引诱用户打开黑客的网站,在黑客的网站中,利用用户的登录状态发起的跨站 ...

  4. CSRF攻击:陌生链接不要随便点

    CSRF攻击:陌生链接不要随便点 上一篇文章中我们讲到了 XSS 攻击,XSS 的攻击方式是黑客往用户的页面中注入恶意脚本,然后再通过恶意脚本将用户页面的数据上传到黑客的服务器上,最后黑客再利用这些数 ...

  5. python middleware模块_详解利用django中间件django.middleware.csrf.CsrfViewMiddleware防止csrf攻击...

    一.在django后台处理 1.将django的setting中的加入django.contrib.messages.middleware.MessageMiddleware,一般新建的django项 ...

  6. 一次渗透测试引发Json格式下的CSRF攻击

    0x00 前言 漏洞背景 hw时期在电信三巨头之一旗下的子公司出差,做一下渗透测试.公网的业务主挖逻辑漏洞,但是每次挖着挖着就变成了CSRF攻击,出差半个月算是把这辈子的CSRF都给挖完了. test ...

  7. 【安全】XSS安全漏洞与CSRF攻击

    XSS攻击 XSS攻击通常指的是通过利用网页开发时留下的漏洞,通过巧妙的方法注入恶意指令代码到网页,使用户加载并执行攻击者恶意制造的网页程序.这些恶意网页程序通常是JavaScript,但实际上也可以 ...

  8. 常见网络攻击及防御方法总结(XSS、SQL注入、CSRF攻击)

      从互联网诞生之初起,无时无刻不存在网络攻击,其中XSS攻击和SQL注入攻击是网站应用攻击的最主要的两种手段,全球大约70%的网站应用攻击都来自XSS攻击和SQL注入攻击.此外,常用的网站应用攻击还 ...

  9. go预防CSRF攻击

    CSRF(Cross-site request forgery),中文名称:跨站请求伪造,也被称为:one click attack/session riding,缩写为:CSRF/XSRF. 那么C ...

最新文章

  1. 从LeNet到AlexNet
  2. mysql 堵塞_Mysql解决USE DB堵塞详解
  3. PicPick手册:绿色小巧功能多的截屏软件
  4. Python中文乱码
  5. BIEE配置多个实例(BIEE Multiple Instance)
  6. CCF认证2014-9-2 画图
  7. c语言全民,C语言还有学习的必要吗
  8. 趣图 | 著名的悖论蒙提霍尔问题到底是什么?
  9. 2. node.js 模块管理机制
  10. JSOI2009 BZOJ2257 瓶子和燃料
  11. 微信小程序生成跳转体验版二维码
  12. Springboot框架简介
  13. (第二版)零基础入门Python小甲鱼-笔记-第一章-p2
  14. 中国拳手徐灿将战世界拳王:有信心把金腰带带回祖国
  15. JavaScript中实现键值对的方法
  16. 魅族容器云平台基于Kubernetes自动化运维实践
  17. rovisional headers are shown Learn more 报错
  18. 微型计算机是计算器吗,小型计算机和微型计算机是同一个吗?
  19. Linux加法简单程序,Linux操作之——简单命令
  20. 让IE浏览器支持HTML5标准的方法

热门文章

  1. IoT DDoS警报系统是如何帮助我们预测网络攻击的?
  2. 12.Linux 网络配置
  3. 跨境电商前景 跨境电商运营前景待遇
  4. 华为鸿蒙魔法闪投大小屏幕互动,「老熊科普」魔法闪投,荣耀智慧屏就是你的“超级大手机”...
  5. 如何改变视频的MD5值?一分钟让你学会操作
  6. 数据库 和 数据仓库
  7. 群晖域名解析出现错误?别慌,排查原因有步骤
  8. 【ava数据集可视化】ava数据集ID可视化 A Video Dataset of Spatio-temporally Localized Atomic Visual Actions
  9. HTTPS中CA证书的签发及使用过程
  10. 72 ----直纹面、二次直纹面、单叶双曲面、双曲抛物面