讲解web攻防实战 web攻防学是什么语言( 二 )


1 2 3alert(\\”xss\\”) 可以被解释为: +ADw-script+AD4-alert(+ACI-xss+ACI-)+ADw-/script+AD4-
可以形成「基于字符集的 XSS 攻击」的原因是由于浏览器在 meta 没有指定 charset 的时候有自动识别编码的机制,所以这类攻击通常就是发生在没有指定或者没来得及指定 meta 标签的 charset 的情况下 。
所以我们有什么办法避免这种 XSS 呢?
记住指定 XML 中不仅要指定字符集为 utf-8,而且标签要闭合基于 Flash 的跨站 XSS
基于 Flash 的跨站 XSS 也是属于反射型 XSS 的一种,虽然现在开发 ActionScript 的产品线几乎没有了,但还是提一句吧,AS 脚本可以接受用户输入并操作 cookie,攻击者可以配合其他 XSS(持久型或者非持久型)方法将恶意 swf 文件嵌入页面中 。主要是因为 AS 有时候需要和 JS 传参交互,攻击者会通过恶意的 XSS 注入篡改参数,窃取并操作cookie 。
避免方法:
严格管理 cookie 的读写权限对 Flash 能接受用户输入的参数进行过滤 escape 转义处理未经验证的跳转 XSS
有一些场景是后端需要对一个传进来的待跳转的 URL 参数进行一个 302 跳转,可能其中会带有一些用户的敏感(cookie)信息 。如果服务器端做302 跳转,跳转的地址来自用户的输入,攻击者可以输入一个恶意的跳转地址来执行脚本 。
这时候需要通过以下方式来防止这类漏洞:
对待跳转的 URL 参数做白名单或者某种规则过滤后端注意对敏感信息的保护, 比如 cookie 使用来源验证 。CSRF
CSRF(Cross-Site Request Forgery),中文名称:跨站请求伪造攻击
那么 CSRF 到底能够干嘛呢?你可以这样简单的理解:攻击者可以盗用你的登陆信息,以你的身份模拟发送各种请求 。攻击者只要借助少许的社会工程学得诡计,例如通过 QQ 等聊天软件发送的链接(有些还伪装成短域名,用户无法分辨),攻击者就能迫使 Web 应用的用户去执行攻击者预设的操作 。例如,当用户登录网络银行去查看其存款余额,在他没有退出时,就点击了一个 QQ 好友发来的链接,那么该用户银行帐户中的资金就有可能被转移到攻击者指定的帐户中 。
所以遇到 CSRF 攻击时,将对终端用户的数据和操作指令构成严重的威胁 。当受攻击的终端用户具有管理员帐户的时候,CSRF 攻击将危及整个 Web 应用程序 。
CSRF 原理
下图大概描述了 CSRF 攻击的原理,可以理解为有一个小偷在你配钥匙的地方得到了你家的钥匙,然后拿着要是去你家想偷什么偷什么 。
完成 CSRF 攻击必须要有三个条件:
用户已经登录了站点 A,并在本地记录了 cookie在用户没有登出站点 A 的情况下(也就是 cookie 生效的情况下),访问了恶意攻击者提供的引诱危险站点 B (B 站点要求访问站点A) 。站点 A 没有做任何 CSRF 防御
你也许会问:「如果我不满足以上三个条件中的任意一个,就不会受到 CSRF 的攻击」 。其实可以这么说的,但你不能保证以下情况不会发生:
你不能保证你登录了一个网站后,不再打开一个 tab 页面并访问另外的网站,特别现在浏览器都是支持多 tab 的 。你不能保证你关闭浏览器了后,你本地的 cookie 立刻过期,你上次的会话已经结束 。上图中所谓的攻击网站 B,可能是一个存在其他漏洞的可信任的经常被人访问的网站 。预防 CSRF
CSRF 的防御可以从服务端和客户端两方面着手,防御效果是从服务端着手效果比较好,现在一般的 CSRF 防御也都在服务端进行 。服务端的预防 CSRF 攻击的方式方法有多种,但思路上都是差不多的,主要从以下两个方面入手:
正确使用 GET,POST 请求和 cookie在非 GET 请求中增加 token
一般而言,普通的 Web 应用都是以 GET、POST 请求为主,还有一种请求是 cookie 方式 。我们一般都是按照如下规则设计应用的请求:
GET 请求常用在查看,列举,展示等不需要改变资源属性的时候(数据库 query 查询的时候)POST 请求常用在 From 表单提交,改变一个资源的属性或者做其他一些事情的时候(数据库有 insert、update、delete 的时候)
当正确的使用了 GET 和 POST 请求之后,剩下的就是在非 GET 方式的请求中增加随机数,这个大概有三种方式来进行:
为每个用户生成一个唯一的 cookie token,所有表单都包含同一个伪随机值,这种方案最简单,因为攻击者不能获得第三方的 cookie(理论上),所以表单中的数据也就构造失败,但是由于用户的 cookie 很容易由于网站的 XSS 漏洞而被盗取,所以这个方案必须要在没有 XSS 的情况下才安全 。每个 POST 请求使用验证码,这个方案算是比较完美的,但是需要用户多次输入验证码,用户体验比较差,所以不适合在业务中大量运用 。渲染表单的时候,为每一个表单包含一个 csrfToken,提交表单的时候,带上 csrfToken,然后在后端做 csrfToken 验证 。