漏洞
常见攻击方式:
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 攻击风险。参考:
<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 安全安全规约
- 禁止引入第三方FLASH
- 禁止新应用在客户端使用Flash插件,请使用H5相关功能标签
WebSocket 安全安全规约
- 禁止使用 Origin , cookie 进行认证,建议使用 Set-WebSocket-Key 系列进行认证。包含 WebSocket 的服务将存在和传统HTML安全不同的风险,因此必须经过安全评审。
- 使用 wss 协议而非 ws 协议。
- 原则上禁止用 Web Socket 搭设FTP,MAIL等服务协议。
- 服务器检查 Origin 头;限制同一用户的连接数(建议5以下);限制同一IP的握手尝试次数(建议5次以下)。
Access-Control-Allow-Origin
HTTP头安全规约
- 使用 jsonp 跨域数据传输形式,代替该方式进行跨域数据传输
- 除过 CDN 等特殊业务场景,其他业务禁止使用该头
【强制】支持CORS跨域的接口,返回头Access-Control-Allow-Origin
必须使用白名单验证, 禁止直接返回*
其它安全规约
【强制】尽量避免执行系统命令。如果应用必须通过系统命令获取信息,则务必不要通过外部输入获取命令。通过外部输入获取命令参数时,需要使用安全函数对其进行包装。
【强制】禁止在Cookie中 明文写入 敏感数据
【强制】编写的SQL必须预编译,不允许通过字符串拼接的方式合成
【强制】部分特殊场景,必须通过拼接合成,则拼接的变量必须经过处理,只允许[a-zA-Z0-9_-.]+
字符
Ref
实战:
- WebSecurity basics by MartinFowler
- 13 best practices to secure your web application
- egg.js security
- 集团安全编码规范
- Write secutriy node code
- Web App Security Checklist
- HTML5 Security Cheatsheet
原理: