xss攻击与防御

一、XSS攻击

Cross Site Scripting跨站脚本攻击

利用js和DOM攻击。

盗用cookie,获取敏感信息

破坏正常页面结构,插入恶意内容(广告..)

劫持前端逻辑

DDos攻击效果——分布式拒绝服务攻击

Server Limit Dos,Http header过长,server返回400

二、攻击原理和手段

攻击方式

  • 反射性
  • 存储性

1、反射型攻击

发出请求时,XSS代码出现在URL中,作为输入提交到服务器端,服务器解析后响应,XSS代码随响应内容一起传回给浏览器,最后浏览器解析执行XSS代码。这个过程像一次反射,故叫反射型XSS。

  • 明文URL中value就是攻击代码
  • 服务器解析URL中XSS代码并传回
  • 浏览器解析执行

传播-》URL传播-》短网址传播

短域名服务:

http://url.6ti.co/app/index.php?i=1&c=entry&op=exit&do=home&m=bg_dym

2、存储型攻击

存储型XSS和反射型XSS的差别仅在于,提交的代码会存储在服务器端(数据库,内存,文件系统等),下次请求目标页面时不用再提交XSS代码。 

更隐蔽。

XSS存在的位置

  • 反射型——URL中
  • 存储型——服务器端
  •  

XSS攻击注入点:

  • HTML节点内,通过用户输入动态生成
  • HTML属性,属性是由用户输入
  • JavaScript代码

  • 富文本(一大段HTML,有格式)
    •   富文本得保留HTML,HTML有XSS攻击风险

三、防御

1、浏览器自带防御

ctx.set('X-Xss-Protection',0); 反射型参数出现在HTML内容或属性中。

0 禁止XSS过滤。

1 启用XSS过滤(通常浏览器是默认的)。 如果检测到跨站脚本攻击,浏览器将清除页面(删除 不安全的部分)。
1;mode=block 启用XSS过滤。 如果检测到攻击,浏览器将不会清除页面,而是阻止页面加载。

1; report= (Chromium only) 启用XSS过滤。 如果检测到跨站脚本攻击,浏览器将清除页面并使用CSP report-uri 指令的功能 发送违规报告。

ctx.set('X-Xss-Protection',0)在chrome浏览器中已经失效了。可以用CSP。

2、CSP

CSP: Content Security Policy 

 内容安全策略 (CSP, Content Security Policy) 是一个附加的安全层,用于帮助检测和缓解某 些类型的攻击,包括跨站脚本 (XSS) 和数据注入等攻击。 这些攻击可用于实现从数据窃取到 网站破坏或作为恶意软件分发版本等用途。

CSP 本质上就是建立白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只 需要配置规则,如何拦截是由浏览器自己实现的。我们可以通过这种方式来尽量减少 XSS 攻 击。

// 只允许加载本站资源 
Content-Security-Policy: default-src 'self' // 只允许加载 HTTPS 协议图片
Content-Security-Policy: img-src https://* // 不允许加载任何来源框架
Content-Security-Policy: child-src 'none'

 

ctx.set('Content-Security-Policy', "default-src 'self'")

// 尝试一下外部资源不能加载

http://localhost:3000/?from=<script src="http://localhost:4000/hack.js"> </script>

 

3、编码转义

1,黑名单

用户的输入永远是不可信任的,不能让所有用户输入保持原样

对用户输入的数据进行HTML Entity编码。最普遍的做法就是转义输入输出的内容,对于引号、尖括号、斜杠 进行转义。

 function escape(str) {    
str = str.replace(/&/g, '&amp;')    
str = str.replace(/</g, '&lt;')    
str = str.replace(/>/g, '&gt;')    
str = str.replace(/"/g, '&quto;')    
str = str.replace(/'/g, '&#39;')    
str = str.replace(/`/g, '&#96;')    
str = str.replace(/\//g, '&#x2F;')    
return str  }

 

用转义字符代替字符。

转义的时机

  • 存储时
  • 显示时

ejs转义

<% code %>用于执行其中javascript代码; 
<%= code %>会对code进行html转义; 
<%- code %>将不会进行转义

黑名单错杀的太多。 

2,白名单

富文本来说,显然不能通过上面的办法来转义所有字符,因为这样会把需要的格式也过滤掉。对 于这种情况,通常采用白名单过滤的办法,当然也可以通过黑名单过滤,但是考虑到需要过滤的 标签和标签属性实在太多,更加推荐使用白名单的方式。

白名单库:xss库

const xss = require('xss')  let html = xss('<h1 id="title">XSS Demo</h1><script>alert("xss");</script>')  
// -> <h1>XSS Demo</h1>&lt;script&gt;alert("xss");&lt;/script&gt;  console.log(html)

4、过滤

编码后显示时候还要解码。解码后显示原样代码前过滤。

过滤掉不合法输入,保证安全。

  • 移除用户上传的DOM属性,如onerror等。
  • 移除用户上传的Style节点,Script节点,Iframe节点等。 

onerror自动触发xss。 

style:body:display:none.

js对页面有百分比操作权限。

iframe引入其它页面资源。

通过xss注入的方式,引诱用户触发csrf攻击。

5,HttpOnly Cookie

这是预防XSS攻击窃取用户cookie最有效的防御手段。Web应 用程序在设置cookie时,将其 属性设为HttpOnly,就可以避免该网页的cookie被客户端恶意JavaScript窃取,保护用户 cookie信息。

response.addHeader("Set-Cookie", "uid=112; Path=/; HttpOnly")
posted @ 2018-09-13 11:11  starof  阅读(3420)  评论(0编辑  收藏  举报