漏洞

常见攻击方式:

XSS / 配置错误 / 敏感信息泄露 / 权限漏洞 / DDOS / 撞库 / 弱口令 / SQL 注入 / 文件下载 / URL 重定向和跳转 / CSRF …

  • 接口XSS测试
  • 接口CSRF测试
  • 接口水平权限测试
  • 接口敏感数据泄漏测试
  • 接口SQL注入测试
  • 接口SHELL注入测试
  • 接口SSRF注入测试
  • 接口请求重放测试(短信、邮件炸弹)


漏洞与工具

  • 抓包工具 Burpsuit
  • 上线测试指南
  • 白盒扫描工具
  • 黑盒测试工具
  • 漏洞上报平台

XSS

Cookie 丢失,假冒用户身份登录。

攻击类型:

  • 反射型:写在链接中。
  • 存储型:存储在服务端中。
  • DOM 型:脚本动态创建。

防范方案:

阿里方案:CSP 脚本引入 / SecHook 后端转义 / 前端转义

CSP

【强制】禁止向HTML页面输出 未经安全过滤末正确转义 的用户数据。用户数据不仅仅包括用户正常数据,同时包括攻击者可修改,伪造的其他数据(例如HTTP头,页面隐藏表单等)

方案:页面接入 CSP 脚本,CSP, 即内容安全策略(Content Security Policy)是基于同源策略(same origin policy 的一种安全模型。这也是 HTML5 支持的一套全新主动防御的体系,CSP 可以有效的降低 XSS 攻击风险。参考:

  1. <script src="http://g.alicdn.com/secdev/pointman/js/index.js" app="uz"></script>

XSS攻击的核心问题在于浏览器无法区分脚本是应用的一部分,还是由第三方恶意注入的内容。CSP 定义了允许创建受信任内容源白名单的Content-Security-Policy HTTP头,这样可以让浏览器不再盲目信任服务器发送的所有内容,并且能让浏览器只执行或者渲染来自这些源的内容。即使攻击者能够找到注入点注入脚本,脚本不匹配白名单,也不会被执行。

虽然脚本资源是最明显的安全风险点。CSP提供了丰富的策略指令集来启用对页面允许加载资源的极精细控制。上面提到了script-src指令。其他常见的指令有:

  • connect-src限制了可以连接到的源(通过XHR、WebSockets和EventSource)。
  • font-src指定了可以提供web字体的源。启用Google web字体的font-src指令内容为[https://themes.googleusercontent.com](https://themes.googleusercontent.com)
  • frame-src列出了可以作为页面帧嵌入的源。例如:frame-src [https://youtube.com](https://youtube.com)会允许嵌入YouTube视频,而不能嵌入其他源。
  • img-src定义了可以加载图片的源。
  • media-src限制了允许发送视频和音频的圆。
  • object-src允许控制Flash和其他插件。
  • style-src控制样式表的源。

转义

  • 后端模板开启默认转义。
  • 前端 Ajax 数据开启转移输出。比如私用 ele.innerText = content

  • 【强制】统一使用POST方式提交AJAX请求,禁止GET请求
  • 【强制】如果涉及对后端数据的增删改,则必须在后端通过框架配置或单独验证的方式进行CSRF验证
  • 【强制】AJAX 接口返回头必须正确设置 Content-Type
  • 【强制】AJAX 接口输出 JSON 字符串禁止 通过字符串拼接构造,且 输出的JSON需要经过安全过滤
    在新安全包的 SpringMVC 拓展中,JSON 相关要求默认生效
  • 【强制】JSONP接口Callback必须 验证有效性
  • 【强制】JSONP接口返回头必须JSONP接口返回头必须正确设置Content-Type
  • 【强制】JSONP接口输出JSON字符串禁止 通过字符串拼接构造,且 输出的JSON需要经过安全过滤
  • 【强制】JSONP接口返回内容首行必须为 空行 或者 注释

URL 重定向

在使用以上跳转方法进行跳转的时候,需要根据业务需求配置安全域白名单,对URL进行白名单校验。

function parseURL_TICKTICK(url, allowDomains) {
  // 必须使用统一的特殊函数名,方便检测
  // allowDomains 禁止适配`*`通配符 
  var domainStr = "",
      i         = 0,
      result    = [];
  for (i; i < allowDomains.length; i++) {
    allowDomains[i] = "(" + allowDomains[i].replace(".", "\\.") + ")";
  }
  domainStr = "(" + allowDomains.join("|") + ")";
  regStr = new RegExp("^((http://)|(https://)|(//))?([0-9a-zA-Z\\._:\\-]*[\\.@])?" +        domainStr + "(:[0-9]+)?(\/.*)?$");
  // ^((http:\/\/)|(https:\/\/)|(\/\/))?([0-9a-zA-Z\._:\-]*[\.@])?((taobao\.com)|(alibaba\.com)(:[0-9]+)?(\/.*)?$/
  result = url.match(regStr);
  return !!(result && result[0]);
}

CSRF

跨站请求伪造:身份伪造,伪装来自受信人用户的请求,而 XSS 利用站点内的信任用户来发送请求。所有涉及 CRUD 的操作都需要增加 csrftoken。服务端生成 token 放置到 seesion 以及 cookie 里面。

会话验权。

  • 后端在 vim 或者模板中埋入 CSRF Token。
  • 前端在 Ajax 请求中埋入 CSRF Token:
"&_tb_token_=" + $!csrfToken.ajaxUniqueToken

敏感信息

  • 禁止使用 LocalStorage / SessionStorage / GlobalStorage 对敏感信息进行存储。
  • 建立白名单机制,对未知来源的 postMessage 以及 receiveMessage 主动屏蔽过滤。
  • 前端禁止写入 cookies

劫持安全

在 http 请求头中添加X-FRAME-OPTIONS头,可根据情况自行设置,如下:

DENY // 拒绝任何域加载
SAMEORIGIN // 允许同源域下加载
ALLOW-FROM // 可以定义允许frame加载的页面地址

全网推广 HTTPS。


JSONP 劫持:进行 token / refer 校验。敏感数据不要采用 JSONP 传输。并且设置 JSONP 白名单。

Sandbox

其它

Flash 安全安全规约

  1. 禁止引入第三方FLASH
  2. 禁止新应用在客户端使用Flash插件,请使用H5相关功能标签

WebSocket 安全安全规约

  1. 禁止使用 Origin , cookie 进行认证,建议使用 Set-WebSocket-Key 系列进行认证。包含 WebSocket 的服务将存在和传统HTML安全不同的风险,因此必须经过安全评审。
  2. 使用 wss 协议而非 ws 协议。
  3. 原则上禁止用 Web Socket 搭设FTP,MAIL等服务协议。
  4. 服务器检查 Origin 头;限制同一用户的连接数(建议5以下);限制同一IP的握手尝试次数(建议5次以下)。

Access-Control-Allow-Origin HTTP头安全规约

  1. 使用 jsonp 跨域数据传输形式,代替该方式进行跨域数据传输
  2. 除过 CDN 等特殊业务场景,其他业务禁止使用该头

【强制】支持CORS跨域的接口,返回头Access-Control-Allow-Origin必须使用白名单验证, 禁止直接返回*


其它安全规约

【强制】尽量避免执行系统命令。如果应用必须通过系统命令获取信息,则务必不要通过外部输入获取命令。通过外部输入获取命令参数时,需要使用安全函数对其进行包装。

【强制】禁止在Cookie中 明文写入 敏感数据

【强制】编写的SQL必须预编译,不允许通过字符串拼接的方式合成

【强制】部分特殊场景,必须通过拼接合成,则拼接的变量必须经过处理,只允许[a-zA-Z0-9_-.]+字符


Ref

实战:

原理: