最近读了吴翰清的《白帽子讲Web安全》,学到了不少东西。现把书中的知识点梳理一遍,以便记忆。以下内容是我根据《白帽子讲Web安全》和自己的理解整理的,如有不够清晰或误导的地方,可以查看原书。
随着网页技术的飞速发展,越来越多的黑客把攻击的目光投向网页。因而,Web安全也愈发显得重要。
评判一个网页是否安全,可以分析网站是否具有具备安全三要素:机密性(Confidentiality)、完整性(Integrity)、可用性(Availability)。我们也可以对网站进行风险分析,一般可使用公式:Risk = Probility * Damage Potential
。建立一个风险评估模型也很有必要,这里有一个简单的模型:DREAD(Damage Potential,Reproducibility,Exploitability,Affected Users,Discoverability),通过加权求值再排序可以大致确定风险的高低和要优先处理的安全问题。
Web安全应该遵循以下原则:
Web攻击按场景可分为客户端攻击和服务端攻击。客户端的攻击手段主要有跨站脚本攻击(XSS)、跨站请求伪造(CSRF)、点击劫持(Click Jacking),服务端的攻击手段主要有注入攻击和利用文件上传漏洞进行攻击。
常指黑客通过“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蠕虫。
(1)利用字符编码。
(2)绕过长度限制:利用点击事件、location.hash、注释符、window.name等。
(3)使用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属性中、标签中、事件中、CSS中、地址中)使用安全的编码函数(HtmlEncode、JavascriptEncode)。
(4)处理富文本:使用输入检查和遵循白名单原则,过滤掉、
、
、等标签。
(5)DOM Based XSS防御:针对DOM Based XSS产生所经过的路径,建立checklist,对不同途径可能需要多次HtmlEncode或JavascriptEncode。
攻击者伪造请求,诱使用户触发请求。
(1)某些浏览器如FireFox默认允许在、
、
、
等标签中发送第三方Cookie。
(2)P3P头允许跨域访问隐私数据,所以可以跨域Set-Cookie成功,从而使、
等标签在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语句中。
(1)使用预编译语句,绑定变量。
(2)使用安全的存储过程。
(3)检查数据类型及数据格式。
(4)使用安全的函数,可以参考OWASP ESAPI。
用户上传可执行的脚本文件,并通过该脚本获得执行服务端命令的能力。
(1)上传的文件可能是Web脚本语言、Flash的策略文件crossdomain.xml、病毒、木马、钓鱼图片或包含了脚本的图片。
(1)文件上传的目录设置为不可执行。
(2)判断文件类型。
(3)使用随机数改写文件名和文件路径。
(4)单独设置文件服务器的域名。
除了以上5种传统的Web攻击手段之外,HTML5的出现对Web安全造成的影响也不容忽视。一方面,HTML5的一些新特性给黑客提供了更多的攻击手段:
、
等新标签可能引发XSS;但同时,HTML5也可以给Web安全提供了新的保护措施:
noreferrer
可以禁止浏览器向
、
标签指定的地址发送referer,保护敏感信息。如test
。