最近读了吴翰清的《白帽子讲Web安全》,学到了不少东西。现把书中的知识点梳理一遍,以便记忆。以下内容是我根据《白帽子讲Web安全》和自己的理解整理的,如有不够清晰或误导的地方,可以查看原书。
随着网页技术的飞速发展,越来越多的黑客把攻击的目光投向网页。因而,Web安全也愈发显得重要。
评判一个网页是否安全,可以分析网站是否具有具备安全三要素:机密性(Confidentiality)、完整性(Integrity)、可用性(Availability)。我们也可以对网站进行风险分析,一般可使用公式:Risk = Probility * Damage Potential
。建立一个风险评估模型也很有必要,这里有一个简单的模型:DREAD(Damage Potential,Reproducibility,Exploitability,Affected Users,Discoverability),通过加权求值再排序可以大致确定风险的高低和要优先处理的安全问题。
Web安全应该遵循以下原则:
- Secure By Default(白名单、最小权限)
- Defense in Depth(纵深防御)
- 数据与代码分离
- 不可预测性
Web攻击按场景可分为客户端攻击和服务端攻击。客户端的攻击手段主要有跨站脚本攻击(XSS)、跨站请求伪造(CSRF)、点击劫持(Click Jacking),服务端的攻击手段主要有注入攻击和利用文件上传漏洞进行攻击。
一、XSS
常指黑客通过“HTML注入”篡改网页,插入恶意的脚本,从而在用户浏览网页时,控制用户浏览器的一种攻击。
分类
(1) 反射型:非持久型XSS。将用户输入的数据“反射”给浏览器,往往需要诱使用户“点击”一个恶意链接。
(2)存储型:持久型XSS。把用户输入的数据“存储”在服务器。
(3) DOM Based XSS:一种特殊的反射型XSS。通过修改页面的DOM节点形成的,不需要经过服务器。
攻击方法
(1)植入恶意脚本(XSS Payload)。
类型 | 实现 | 对策 |
---|---|---|
Cookie劫持 | 插入空图片,利用onerror方法获取用户Cookie | 1.Set-Cookie头增加HttpOnly属性; 2.cookie与IP绑定 |
构造GET和POST请求 | 诱使或获取用户信息并发起请求(form、XHR) | 1.POST表单要求输入验证码 2.修改密码时要求输入旧密码 |
(2)XSS钓鱼:与钓鱼结合,伪造输入框获取信息。
(3)XSS收集用户信息:识别用户浏览器(利用UserAgent或浏览器的特性);识别用户安装的软件(ActiveX、Flash、Thunder、FireFox插件)。
(4)CSS History Hack: 利用style的visited属性,用户曾访问过某个链接,链接颜色会不同,从而获取用户的访问信息。
(5)获取用户的真实IP:借助第三方软件如Java Applet、ActiveX。
(6)XSS蠕虫。
如何构造XSS
(1)利用字符编码。
(2)绕过长度限制:利用点击事件、location.hash、注释符、window.name等。
(3)使用base标签:图片路径为相对路径的<img>
标签前加<base>
标签可以修改其域名。
(4)利用window.name:利用该对象实现跨域、跨页面传递数据,也可以缩短XSS Payload的长度。
(5)利用第三方插件:如Apache Expect Header XSS,可修改Expect头实现注入js;Anehta回旋镖;Flash XSS,动态脚本ActionScript的allowScriptAccess
和allowNetworking
属性。
(6)利用js开发框架的安全漏洞:Dojo、YUI、jQuery等都有安全漏洞。
防御方法
(1)HttpOnly:浏览器会禁止页面的js访问带有HttpOnly属性的Cookie。
(2)输入检查:根据语境进行XSS过滤。
(3)输出检查:根据输出环境(HTML标签中、HTML属性中、<script>
标签中、事件中、CSS中、地址中)使用安全的编码函数(HtmlEncode、JavascriptEncode)。
(4)处理富文本:使用输入检查和遵循白名单原则,过滤掉<iframe>
、<script>
、<base>
、<form>
等标签。
(5)DOM Based XSS防御:针对DOM Based XSS产生所经过的路径,建立checklist,对不同途径可能需要多次HtmlEncode或JavascriptEncode。
二、CSRF
攻击者伪造请求,诱使用户触发请求。
攻击方法
(1)某些浏览器如FireFox默认允许在<iframe>
、<script>
、<img>
、<link>
等标签中发送第三方Cookie。
(2)P3P头允许跨域访问隐私数据,所以可以跨域Set-Cookie成功,从而使<iframe>
、<script>
等标签在IE中不再拦截第三方Cookie的发送。
(3)Flash CSRF:利用URLRequest、getURL、loadVars等方式发起请求。
防御方法
(1)验证码。
(2)Referer检查。
(3)Anti CSRF Token:放在Session和表单的隐藏input中,保证随机性和保密性(不放在url中)。
三、点击劫持
视觉上的欺骗手段。攻击者使用一个透明的、不可见的iframe,覆盖在网页上,诱使用户在该网页上进行操作,并通过调整iframe页面的位置,可以诱使用户恰好点在iframe页面的一些功能性按钮上。
攻击方法
(1)普通页覆盖。
(2)Flash点击劫持。
(3)图片覆盖攻击(XSIO)。
(4)拖拽劫持与数据窃取:不受同源策略限制。
(5)触屏劫持。
防御方法:
(1)frame busting:通过js代码禁止iframe的嵌套。
(2)X-Frame-Options头:控制是否允许加载Frame及其权限,值可以是DENY、SAMEORIGIN或ALLOW-FROM。
四、注入攻击
攻击方法
(1)SQL注入:用户控制数据输入,并将输入拼接到了要执行的SQL语句中。
- 盲注:根据服务器错误辉县判断是否注入成功。如果服务器关闭了错误回显,可以根据返回页面是否发生了变化,来判断SQL语句是否已经执行。
- 盲注中的Timing Attack:利用数据库总一些有用的函数如MySQL中的BENCHMARK函数让同一函数执行多次。通过返回时间的长短,可以判断注入语句是否执行完成。
- 通过SQL注入猜解出数据库版本、表名、用户名和密码,获取读写文件的权限。
- 利用用户自定义函数(UDF)来执行命令。
- 攻击存储过程:执行CALL或EXECUTE。
- 基于字符集注入:数据库、操作系统、Web应用所使用的的字符集不同,可能在解析SQL时引发问题。
- SQL Column Truncation:数据库数据插入时对字段处理存在逻辑问题。
(2)其他注入方式:XML、代码、CRLF。
防御方法:
(1)使用预编译语句,绑定变量。
(2)使用安全的存储过程。
(3)检查数据类型及数据格式。
(4)使用安全的函数,可以参考OWASP ESAPI。
五、文件上传漏洞
用户上传可执行的脚本文件,并通过该脚本获得执行服务端命令的能力。
攻击方法
(1)上传的文件可能是Web脚本语言、Flash的策略文件crossdomain.xml、病毒、木马、钓鱼图片或包含了脚本的图片。
防御方法
(1)文件上传的目录设置为不可执行。
(2)判断文件类型。
(3)使用随机数改写文件名和文件路径。
(4)单独设置文件服务器的域名。
除了以上5种传统的Web攻击手段之外,HTML5的出现对Web安全造成的影响也不容忽视。一方面,HTML5的一些新特性给黑客提供了更多的攻击手段:
- H5新标签
<video>
、<audio>
等新标签可能引发XSS; - Canvas可用来破解验证码;
- Access-Control-Allow-Origin允许跨域;
- postMessage可以跨窗口发送消息;
- Web Storage有可能被用来实现跨域攻击。
但同时,HTML5也可以给Web安全提供了新的保护措施:
- iframe的sandbox属性恪尽职iframe内的脚本执行、表单提交、插件加载以及指向其他浏览器对象的链接;
- 新的Link Types:
noreferrer
可以禁止浏览器向<a>
、<area>
标签指定的地址发送referer,保护敏感信息。如<a href="xxx" rel="noreferrer">test</a>
。