零、前言
《白帽子讲Web安全》确实是一本Web安全方面的好书,前前后后大概读了3遍,决定写一个简单笔记。这个笔记记得很简单,有些章节就简单的几句话,但都是我认为值得去记或者我之前一直没有深入理解的知识点。根据个人情况不同,仁者见仁智者见智。当然,其他地方也是很棒的,值得一读。
第二章:浏览器安全
同源策略:浏览器的同源策略,限制了来自不同源的“document”或脚本,对当前“document”读取或设置某些属性。
Document:HTML中的每一个属性都是一个DOM(Document Object Model)界点,所有的节点统称为Document对象。
XMLHttpRequest:可以在后台(页面加载完毕后)与服务器交互的“组件”。
总结:浏览器安全重在同源策略,当一个页面(Document)插入一个其他源的Document 或脚本时,浏览器会限制其执行权限。很多时候攻击的思路就是要利用某些元素或标签的属性绕过同源策略,用刺总的话说就是:现在浏览器的安全是基于对同源策略的信任,当这种策略被绕过时,安全性也就出了问题。
第三章:跨站脚本攻击(XSS)
XSS攻击:通常是指黑客通过“HTML代码注入”篡改了网页,插入了恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。
MVC架构:MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(controller)的缩写,一种业务逻辑、数据、界面显示分离的方法组织代码。
DOM Based XSS:动态的生成DOM,经过一次渲染后新生产的js代码,常规的过滤是渲染前的过滤或编码。
防御:
l HttpOnly:当某条Cookie被标记为HttpOnly时它无法被JavaScript脚本读取。
l 输入检查:检查用户输入的内容是否包含危险字符—-XSS Filter
l 输出检查:在变量输出到HTML页面时,对其进行编码或转义。
Ø 在HTML标签中输出:对输出变量进行HTMLEncode
Ø 在HTML属性中输出:对输出变量进行HTMLEncode
Ø 在<script>标签中输出:对输出变量进行JavaScriptEncode
Ø 在事件中输出:对输出变量进行JavaScriptEncode
Ø 在CSS中输出:使用encodeForCSS()函数
Ø 在地址中输出:使用URLEncode()函数
l 防御DOM Based XSS:在变量输出到<script>时,执行一次JavaScriptEncode;其次,在document.write输出到HTML页面时,如果是输出到事件或脚本,则要再做一次JavaScriptEncode;如果是输出到HTML内容或者属性,则要做一次HtmlEncode。
第四章:跨站点请求伪造(CSRF)
概念:通过伪装来自受信任用户的请求来利用受信任的网站从而进行一些操作,受害者是用户而不是网站或服务器。
与XSS的区别:XSS是将payload插入到有漏洞的页面,然后执行一些非法操作;而CSRF是在用户不知情的情况下执行一些逻辑上正常的操作,使用户受到损失。
利用关键:1、浏览器默认发送第三方Cookie;2、操作所需的参数都可以被猜到。
防御:
l 验证码,简洁有效
l Referer Check,检测Http Header中的Referer
l Anti CSRF Token,加入新参数Token,使其足够随机,无法被猜到。
第五章:点击劫持(ClickJacking)
本质:点击劫持本质上是一种视觉上的欺骗手段,攻击者使用一个不透明的、不可见的iframe,覆盖在网页上,当用户正常使用时会在不知情的情况下点击透明的iframe,执行一些未知的非法操作。
防御:禁止iframe跨域访问、禁止iframe嵌套、X-Frame-Options(禁止当前界面加载任何frame界面)
第六章:HTML5安全
新标签与API:HTML5中的新标签与API会影响到XSS的防御与浏览器同源策略的绕过。
第七章:注入攻击
本质:把用户输入的数据当做代码执行。(与数据库的交互)
关键条件:1、用户能够控制输入;2、原本程序要执行的代码拼接了输入的数据。
攻击技巧:SQL注入攻击时基于数据库的攻击,不同的数据库有不同的特性,要区别对待。
存储过程:存储过程是一组完成特定功能的SQL语义集,它编译一次后放在数据库中,用户指定名字并给定参数来调用它。(例如“xp_cmdshell)
防御:
l 过滤与转义
l 最佳方式:使用预编译语句(或者叫参数化语句)
l 使用安全的存储过程
l 检查数据类型
第八章:文件上传漏洞
重点:本章介绍了几种常见的上传、解析漏洞,不在累赘。其中PHP CGI 路径解析问题没有遇到过,在此漏洞下http://www.xxx.com/path/test.jpg/123.php,test.jpg会被当成代码执行,而123.php是不存在的文件。
防御:
l 上传文件目录设置为不可执行
l 判断文件类型
l 使用随机数改写文件名和文件路径
l 单独设置文件服务器的域名
第九章:认证与会话管理
SessionID:用户登陆凭证,一旦在生命周期内被窃取则等同于账户失窃
窃取SessionID:构造url,诱使用户访问,在链接的服务端中查看http中的Referer查看SsssionID。(前提是SessionID保存在url中而不是cookie中)
第十一章:加密算法与随机数
流密码:基于异或的加密解密方式,每次只操作一个字节。
如果使用的密匙多次加解密,那么明文破解就会变得很容易。书中的公式:
E(A) = A xor C
E(B) = B xor C
相同的数执行xor结果为0,所以
E(A) xor E(B) = (A xor C) xor (B xor C) = A xor B xor C xor C = A xor B
从而得到
E(A) xor E(B) = A xor B
也就是说只要知道其中的3个数据,就能推算另一个。
伪随机数:通过数学算法生成的随机数,并非真正的随机数。
l 时间的不随机性!
l 破解伪随机数算法的种子
伪随机数真正随机的地方在于种子,种子一旦确定以后,再通过同一伪随机数算法计算出来的随机数是固定的,多次计算所得的值也是固定的。
比如如下代码
<?php mt_srand(1); echo mt_rand()."\n"; echo mt_rand()."\n"; echo mt_rand()."\n"; echo mt_rand()."\n"; echo mt_rand()."\n"; ?>
1244335972
15217923
1546885062
2002651684
2135443977
每次产生的结果都是一样的,如果将mt_srand(1)中的1换成其他数会产生另一组固定的值,所以这种随机是伪随机。
第十二章:Web框架安全
MVC框架安全:在正确的地方做正确的事!(比如sql注入发生在Model层,数据处理的地方,在View进行过滤或转义是无法从本质解决问题的,例如magic_quotes_gpc)
第十三章:应用层拒绝服务攻击
CC攻击:应用层DDOS
第十四章:PHP安全
文件包含利用技巧:
l 包含日志文件
l 包含上传的临时文件(时间竞争)
l 包含其他应用上传的文件,比如数据库文件、缓存文件
变量覆盖利用技巧:
l 注入”GLOBALS[a]”覆盖全局变量,绕过变量被unset
l Extract()导致变量覆盖
l $$k变量赋值方式可能导致变量覆盖