安全工程师的核心竞争力不在于拥有多少个0day,掌握多少种安全技术,而是在于他对安全理解的深度,以及由此引申的看待安全问题的角度和高度。
站在白帽子的视角,除了剖析攻击原理,更加需要关注如何防范这些漏洞。
第一章 我的安全世界观
数据从高等级的信任域流向低等级的信任域,是不需要经过安全检查的,反之则需要。
安全问题的本质是信任的问题。
安全三要素(CIA):
- 机密性(Confidentiality):数据内容不能泄漏
- 完整性(Integrity):数据内容完成,没有被篡改 ==> 数字签名
- 可用性(Availability):拒绝服务攻击的是可用性
安全评估:
1. 资产等级划分
划分信任域和信任边界
互联网安全的核心问题,是数据安全的问题。
2. 威胁分析
威胁建模
书中提到的了TRIDE,不过现在ATT&CK应该更加全面。
3. 风险分析
Risk = Probability * Damage Potential
4. 确定解决方案
有效解决问题
用户体验好
高性能
低耦合
易于拓展和升级
白帽子兵法:
1. Secure By Default 原则:
使用白名单优于黑名单
最小权限原则
2. 纵深防御原则:在各个不同层次实施安全方案。
3. 数据与代码分离原则
4. 不可预测原则:
有效对抗基于篡改,伪造的攻击。
token防御CSRF。
第二章 浏览器安全
同源策略(Same origin Policy):
限制来自不同源的“document”或脚本,对当前“document”读取或设置某些属性。
影响“源”的因素:host、子域名、端口、协议。
页面存放文件的域并不重要,重要的是加载文件所在的域。
<script>、<img>、<iframe>等标签可以跨域加载资源
XMLHttpRequest受同源策略的约束,需要通过目标域返回的HTTP头来授权是否允许跨域访问。
对浏览器而言,除了DOM、Cookie、XMLHttpRequest受到同源策略的限制,浏览器第三方插件也有自己的同源策略(Flash、Java Applet、Google Gears)
浏览器沙箱:
Sandbox的设计的目的是为了让不可信任的代码运行在一定环境中,限制不可信任的代码访问隔离区之外的资源。如果需要跨越Sandbox边界交换数据,只能通过封装的API完成。
CSP(Content Security Policy):
内容安全策略,是一个附加的安全层,有助于检测并缓解某些类型的攻击,包括跨站脚本(XSS)和数据注入攻击。
通过服务器端返回一个HTTP头,描述其中描述页面应该遵守的安全策略。
第三章 跨站脚本攻击(XSS)
-
反射型XSS:
需要诱导用户点击恶意链接才能成功。
-
存储型XSS:
恶意数据存储到了服务端。
-
DOM Based XSS
效果上也是反射性XSS,形成原因有所不同,通过修改页面DOM节点形成XSS。
XSS防御 ==> 认清XSS产生的本质原因
XSS的本质是一种“HTML注入”,用户的数据呗当成了HTMl代码一部分来执行。
MVC架构的网站,XSS发生在View层,在拼接变量到HTML页面时产生,此时对用户提交数据进行检查的方案,并不是真正在真正发生攻击的地方防御。
HtmlEncode()
JavascriptEncode()
富文本限制白名单
......
第四章 跨站点请求伪造(CSRF)
CSRF:Cross Site Request Forgery
主要利用了用户Cookie进行伪造操作 ==> 不同浏览器的Cookie策略不同。
作为开发者应该在开发中主动规避而不是交给浏览器。
防御:
1. 敏感操作加上验证码
2. 敏感路由验证referer
3. SameSite头
Set-Cookie: foo=1; SameSite=Strict
Set-Cookie: bar=2; SameSite=Lax
Set-Cookie: baz=3
详细参考 https://cnblogs.com/ziyunfei/p/5637945.html
4. Anti CSRF Token
CSRF攻击的本质:攻击者可以猜测重要参数的所有参数
真随机 ==> token
每次刷新后,token放在Session和需要敏感操作的表单里,提交请求时,服务器验证表单中的token和用户session中token是否一致。
利用xss获取token再进行csrf ==> XSRF
第五章 点击劫持(ClickJacking)
多用做🎣,🪧,欺诈
防御:
1. frame busting
禁止iframe嵌套
2. X-Frame-Options
更多是在浏览器层面防御
第六章 HTML 5 安全
第七章 注入攻击
注入的本质:把用户输入的数据当作代码执行。
数据库攻击:
- LOAD_FILE() INTO DUMPFILE 读写文件
- Mysql UDF(User-Defined Functions) 执行命令
- MS SQL Server ”xp_cmdshell“执行系统命令
- 字符集导致的编码问题
防御:预处理最佳
post :name=' or 1=1#&password=
不使用预处理:
select * from users where username ='' or 1=1#' and password = ''
使用预处理:
select * from users where username = ''' or 1=1#' and password = ''
第八章 文件上传
文件上传漏洞问题:
- 上传的是web脚本语言,服务器的web容器解析上传的脚本,导致代码执行。
- 上传的是策略文件(.htaccess、),以控制该目录或者容器的相关规则。
- 上传的是木马、病毒文件,黑客诱导管理员下载。
- 无法直接被解析的病毒文件,被其他漏洞组合解析。
设计安全的文件上传功能:
1. 文件上传目录不可执行。
2. 白名单判断文件类型。
3. 压缩函数破坏文件内容。
4. 随机数改写文件名和文件路径。
5. 设置单独的文件服务器域名。