安全工程师的核心竞争力不在于他能拥有多少个0day,掌握多少种安全技术,而在于他对安全理解的深度,以及由此引申的看待安全问题的角度和高度。

一、我的安全世界观

(1)安全问题的本质是信任问题。

(2) 安全3要素(CIA)

  1. 机密性(Confidentiality) ~加密
  2. 完整性(Integrity) ~签名
  3. 可用性(Availability) ~HA

其他:可审计性、不可抵赖性…

(3) 安全评估4个阶段

  1. 资产等级划分 ~数据
  2. 威胁分析 ~头脑风暴/威胁建模
  3. 风险分析
  4. 确认解决方案

威胁建模:STRIDE(微软)

威胁 定义 对应的安全属性
Spoofing(伪装) 冒充他人身份 认证
Tampering(篡改) 修改数据或代码 完整性
Repudiation(抵赖) 否认做过的事情 不可抵赖性
InformationDisclosure(信息泄露) 机密信息泄露 机密性
Denial of service(拒绝服务) 拒绝服务 可用性
Elevation of privilege(提升权限) 未经授权获得许可 授权

风险分析,DREAD模型(微软)

等级 高(3) 中(2) 低(1)
Damage Potential 获取完整验证权限;执行管理员权限;非法上传文件 泄露敏感信息 泄露其他信息
Reproducibility 攻击者可以随意攻击 攻击者可重复攻击,但有时间限制 攻击者很难重复攻击过程
Exploitability 初学者在短期内能掌握攻击方法 熟练的攻击者才能完成这次攻击 漏洞利用条件非常苛刻
Affect Users 所有用户,默认配置,关键用户 部分用户,非默认配置 极少用户,匿名用户
Discoverability 漏洞很显眼,攻击条件很容易获得 在私有域,部分人能看到,需深入挖掘 发现该漏洞极其困难

设计安全方案(有针对性)

  1. 能有效解决问题
  2. 用户体验良好
  3. 高性能
  4. 低耦合
  5. 易于扩展和升级

(4)设计安全方案技巧

技巧
Secure by default 总则 黑名单、白名单 防火墙、服务器软件、Web…
Defense in deepth 纵深防御 不同层面、不同方面的安全方案相互配合;针对问题根源 Web应用、操作系统、数据库、网络环境安全
数据与代码分离 漏洞成因 注入;缓存区溢出 SQL、XSS、CRLF、X-Path…
不可预测性 克服攻击方法 有效对抗基于篡改、伪造的攻击;加密算法、随机算法、哈希算法… CSRF~token

安全是一门朴素的学问,也是一门平衡的艺术。


二、浏览器安全

1.同源策略(Same origin policy)

浏览器同源策略:限制来自不同源的“document”或脚本,对当前“document”读取或设置某些属性。

影响“源”的因素:host(域名/IP)、子域名、端口、协议

加载JavaScript页面的域决定JavaScript的origin

跨域加载资源的标签(可发送第三方cookie):<script>、<img>、<iframe>、<link>...

XMLHttpRequest受同源约束,不能跨域,如果能,则CSRF~token(敏感数据泄露)

W3C XMLHttpRequest跨域标准:通过目标返回的HTTP头授权是否允许跨域(前提:JavaScript无法控制该HTTP头)

同源策略限制:DOM、Cookie、XMLHttpRequest ~第三方(各自的):Flash、Java Applet、Silverlight、Google Gears

如果同源策略被绕过,则基于同源策略的安全方案失效。

2.浏览器沙箱

多进程架构、sandbox

chrome:浏览器进程、渲染进程(sandbox)、插件进程(flash、java、pdf)、拓展进程… | 浏览器进程和插件进程严格隔离

插件安全:浏览器加载的第三方插件不受sandbox管辖

3.恶意网址拦截

网址黑名单(挂马、钓鱼) <- Google、微软、PhishTank…
EV SSL证书(Extend Validation SSL Certification)

4.高速发展的浏览器安全

XSS Filter
CSP(Content Security Policy)
扩展和插件的权限高于页面的JavaScript权限


三、跨站脚本攻击(XSS)

1.XSS简介

网页中插入恶意脚本,在用户浏览网页时,控制其浏览器

针对不同场景产生的XSS,要区分情景对待

  1. 反射型XSS(非持久型XSS) 需诱使用户“点击”链接
  2. 存储型XSS(持久型XSS) “存储”在服务端
  3. DOM Based XSS 通过修改页面的DOM节点形成XSS

2.XSS攻击进阶

(1)XSS payload

JavaScript脚本、flash、其他富客户端脚本
读取浏览器cookie(加密保存用户登录凭证…)->cookie劫持

(2)强大的XSS payload

  1. 构造GET与POST请求
  2. XSS钓鱼
  3. 识别用户浏览器(UA/浏览器不同版本差异)
  4. 识别用户安装的软件/浏览器扩展、插件
    IE:ActiveX classid
    Flash: system.capabilities
    Firefox:
    插件(plugins):navigator.plugins
    扩展(Extantion):检测扩展图标(chrome://协议)
  5. CSS history hack,style~visited属性,link访问过,颜色改变(文档中超链接类似)
  6. 获取用户真实IP

(3)XSS攻击平台

AttackAPI、BeEF、XSS-proxy

(4)XSS worm

samy worm ~ mysapce
百度空间worm

(5)调试JavaScript

Firebug、IE Developer tools、Fiddler、HttpWatch

(7)XSS构造技巧

  1. 利用字符编码
    GBK/GB2312 -> Unicode…
  2. 绕过长度限制
    事件(Event)、location.hash、远程JavaScript、注释…
  3. 使用<base>标签
    <base>:定义页面上所有使用“相对路径”标签的hosting地址,可出现在页面任何地方,并作用于位于该标签后的所有标签
    通过<base>劫持当前页面中所有使用“相对路径”的标签
  4. windows.name的妙用
    window对象是浏览器窗体,并非document对象,不受同源策略限制,实现跨域、跨页面传递数据

其他

Apache Expect Header XSS
Anehta的回旋镖
Flash XSS
JavaScript开发框架(Dojo、YUI、jQuery(html()))

(8)XSS防御

1.HttpOnly

禁止页面的JavaScript访问带有httponly属性的cookie

2.输入检查

格式:用户名、电话、邮箱、生日…(白名单)
输入检查逻辑必须放在服务器端代码实现
如果放在客户端,则容易被绕过,但可以阻挡大部分误操作的正常用户,节约服务器资源

XSS Filter(对语境理解不完整):< > ' " <scrip> <javascript>...,过滤/编码

3.输出检查

除富文本输出外,变量输出到HTML,编码、转义
安全编码函数:
HTML->HtmlEncode(OWASP ESAPI)
JavaScript->JavascriptEncode(OWASP ESAPI)
XMLEncode
JSONEncode

HtmlEncode将字符转换成HTMLEntities


正确的地方使用正确的编码方式

4.正确防御XSS

XSS本质:”HTML”注入,用户的数据被当成HTML代码的一部分执行,从而混淆原本语义,产生新语义

变量

  1. 在HTML标签中输出:HTMLEncode
  2. 在HTML属性中输出:HTMLEncode
  3. <script>标签中输出:JavascriptEncode
  4. 在事件中输出:JavascriptEncode
  5. 在CSS中输出:
    尽可能禁止用户可控制的变量在“<style>标签”、“HTML标签的style属性”及“CSS文件”中输出
    如果需要输出,使用OWASP ESAPI的encodeForCSS()函数
  6. 在地址中输出:URLEncode(OWASP ESAPI URLEncode)
    如果变量是整个URL,检查其是否以“http”开头(不是则自动添加),避免伪协议类 XSS

5.处理富文本(Anti-Samy / HTMLPurity)

禁止:“事件”、<iframe>、<script>、<base>、<form>,用户自定义CSS与style(如果需要,过滤CSS)
标签使用白名单:<a>、<img>、<div>

6.防御DOM Based XSS

从JavaScript输出到HTML页面,相当于一次XSS的输出过程,需分语境使用不同的编码函数
HTML -> 事件/脚本:JavascriptEncode
HTML -> 内容/属性:HtmlEncode


四、跨站点请求伪造(CSRF)

1.CSRF简介

Cross Site Request Forgery
XSS利用站点内的信任用户
CSRF通过伪装来自受信任用户的请求来利用受信任的网站

2.CSRF进阶

(1)浏览器的Cookie策略

浏览器Cookie:
Session Cookie(临时Cookie):浏览器关闭,Cookie失效
Third-party Cookie(本地Cookie):服务器在Set-Cookie制定Expire时间

拦截Third-party Cookie的浏览器:IE6、IE7、IE8、safari
不拦截Third-party Cookie:Firefox3、Firefox3、Opera、Chrome、Android…

若CSRF不需要Cookie,则可忽略浏览器的Cookie策略

(2)P3P头的副作用

The Platform for Privacy Preference
网站返回给浏览器的HTTP头中包含有P3P头,则允许浏览器发送第三方Cookie

P3P头主要用于类似广告等需要跨域的页面,但P3P头设置后,对于Cookie的影响将扩大到整个域中的所有页面

P3P策略:~W3C标准

CSRF防御不能依赖于浏览器对第三方Cookie的拦截策略

(3)GET、POST

CSRF不仅能由GET请求发起,也能由POST请求发起

(4)Flash CSRF

POST、URLRequest、getURL、loadVars

(5)CSRF worm

百度用户中心 CSRF worm

3.CSRF的防御

(1)验证码

(2)Referer Check

用于检查请求是否来自合法的“源”

(3)Anti CSRF Token(保密性、随机性)

1.CSRF的本质

重要操作的所有参数都是可以被攻击者猜测到的

增加token参数
保存位置:

  • 用户Session
  • 浏览器Cookie:考虑生成多个有效的token,解决多页面共存场景

2.Token的使用原则

Token生成足够随机
在一个用户有效生命周期,Token消耗前使用同一个,已经消耗重新生成
尽量把Token放在表单中,敏感操作由GET改为POST,以form表单(或AJAX)形式提交,避免Token泄露
其他泄露途径:XSS/跨域漏洞

XSRF
当网站同时存在XSS,攻击者可以请求页面后,读取页面内容里的Token,再构造一个合法请求,成XSRF,此时CSRF的Token方案无效


五、点击劫持(ClickJacking)

1.点击劫持

视觉上的欺骗手段,使用一个透明、不可见的iframe,覆盖在一个网页上,诱使用户在该网页上操作,用户点击iframe,通过调整iframe页面的位置,诱使用户恰好点在iframe页面的一些功能性按钮上

2.Flash点击劫持

Flash游戏

3.图片覆盖攻击

Cross Site Image Overlaying XSIO
利用图片的style或控制CSS,图片覆盖在页面上任意位置

4.拖曳劫持与数据窃取

浏览器支持Drag & Drop 的API
浏览器的拖曳对象可以是一个链接,一段文字,可以从一个窗口到另一个窗口,不受同源策略的限制
诱使用户从隐藏不可见的iframe中“拖曳”出想要的数据,然后放在能控制的另一个页面,从而窃取数据

5.ClickJacking 3.0:触屏劫持

TapJacking

6.防御ClickJacking

禁止跨域的iframe

(1)frame busting(可被绕过)

写一段JavaScript,禁止ifr嵌套

限制iframe页面中的JavaScript执行(绕过):
HTML5中iframe的sandbox属性
IE中iframe的security属性

(2)X-Frame-Options

3个可选值:DENY、SAMEORIGIN、ALLOW-FROM origin


六、HTML 5安全

1.HTML 5新标签

  1. XSS Filter中如果不包括HTML 5的新标签,则可能XSS
  2. iframe的sandbox:
    allow-same-origin:允许同源访问
    allow-top-navigation:允许访问顶层窗口
    allow-forms:允许提交表单
    allow-scripts:允许执行脚本
  3. Link Types:noreferer
    <a>、<area>
  4. Canvas
    <canvas>让JavaScript可以在页面中直接操作图片验证码,也可以操作像素,构造图片区域 ~验证码识别

2.其他安全问题

  1. Cross-Origin Resource Sharing
    Origin Header,可以防范CSRF
  2. postMessage——跨窗口传递消息(不受同源策略限制)
    允许每一个window(包括当前窗口、弹出窗口、iframe等)对象往其他的窗口发送文本消息,从而实现跨窗口的消息传递
    两个安全问题:
  • 必要时,在接收窗口验证Domain,甚至URL,以防止来自非法页面的消息
  • 如果接收的消息写入innerHTML,甚至scrip中,则可能导致DOM Based XSS
  1. Web Storage(Key-value对,类似非关系数据库)
    分为:
  • Session Storage:关闭浏览器失效
  • Local Storage:一直存在
    受同源策略约束,每个域所拥有的信息只会保存在自己的域下

PDF,link

Leave a Reply

Your email address will not be published. Required fields are marked *