《白帽子讲Web安全》5-6章
5、点击劫持(ClickJacking)
5.1、什么是点击劫持
点击劫持是一种视觉上的欺骗手段。攻击者使用一个透明的、不可见的iframe,覆盖在一个网页上,然后诱使用户在该网页上进行操作,此时用户将在不知情的情况下点击透明的iframe页面。通过调整iframe页面的位置,可以诱使用户恰好点击在iframe页面的一些功能性按钮上。
有些环境下明明点击了对应的内容,却跳转到莫名其妙的地方,应该就是被点击劫持了。
5.2、Flash点击劫持
攻击者制作了一个Flash游戏,诱使用户去点击“CLICK”按钮,每次点击后这个按钮的位置都会发生变化。游戏中的某些点击是有意义的,某些点击是无效的。攻击通过诱导用户鼠标点击的位置,能够完成一些较为复杂的流程。
5.3、图片覆盖攻击
- 一名叫sven.vetsch的安全研究者最先提出了这种Cross Site Image Overlaying攻击,简称XSIO。sven.vestsch通过调整图片的style使得图片能够覆盖在他所指定的任意位置。
- 在防御XSIO时,需要检查用户提交的HTML代码中,
<img>
标签的style属性是否可能导致浮出。
5.4、拖拽劫持与数据窃取
- Drag & Drop的API使得用户的操作更简单,拖拽对象可以是链接,也可以是文字,还可以从一个窗口推拽到另一个窗口,因此拖拽是不受同源策略限制的。
- “拖拽劫持”的思路是诱使用户从隐藏的不可见iframe中“拖拽”出攻击者希望得到的数据,然后放到攻击者能控制的另外一个页面中,从而窃取数据。
Q:书中提到在小球和小海豹头顶都有隐藏的iframe。是把iframe展示为图片吗,因为如果是iframe和图片分开的话,拖到iframe就不能拖到图片了,这样用户会感到奇怪。
A:提示用户使用ctrl+a来选中小球,也就是选中小球和其隐藏的iframe。
5.5、ClickJacking3.0:触屏劫持
到了2010年9月,智能手机上的“触屏劫持”攻击被斯坦福的安全研究者公布,这意味着ClickJacking的攻击方式更进一步。安全研究者将这种触屏劫持称为TapJacking。
5.6、防御ClickJacking
针对传统的ClickJacking,一般是通过禁止跨域的iframe来防范。
5.6.1、frame busting
通过写一段JavaScript代码来禁止iframe的嵌套,但是frame busting也存在一些缺陷。由于它是用JavaScript写的,控制能力并不是特别强,因此有许多方法可以绕过它。比如针对parent.location的frame busting,就可以采用嵌套多个iframe的方法绕过。假设frame busting代码如下:
if (top.location != self.llocation){
parent.location = self.location;
}
那么可以通过以下方式即可绕过上面的保护代码:
Attacker top frame:
<iframe src="attackerr.html">
Attacker sub-frame:
<iframe src="http://www.victim.com">
斯坦福的Gustav Rydstedt等人总结了一篇关于“攻击frame busting”的paper:“Busting frame busting: a study of clickjacking vulnerabilities at popular sites”,详细讲述了各种绕过frame busting的方法。
5.6.2、X-Frame-Options
X-Frame-Options 是一个 HTTP 响应头,用于指示浏览器是否允许一个页面在 <frame>
、<iframe>
、<embed>
或 <object>
中显示。它主要用于防止点击劫持(clickjacking)攻击。
可选值
-
DENY:
- 页面不能在任何框架中显示,无论是同源还是跨源。
-
SAMEORIGIN:
- 页面只能在同源的框架中显示。
-
ALLOW-FROM origin(某些浏览器已弃用):
- 页面可以在指定来源的框架中显示,但现代浏览器已不再支持此指令。
除了X-Frame-Options之外,Firefox 的“Content Security Policy”以及Firefox的NoScript扩展也能够有效防御ClickJacking,这些方案为我们提供了更多的选择。
- Content-Security-Policy HTTP 响应头中的
frame-ancestors
指令可以替代 X-Frame-Options,并提供更强大的控制。
5.7、小结
ClickJacking 相对于XSS 与CSRF来说,因为需要诱使用户与页面产生交互行为,因此实施攻击的成本更高,在网络犯罪中比较少见。但ClickJacking在未来仍然有可能被攻击者利用在钓鱼、欺诈和广告作弊等方面,不可不察。
6、HTML5安全
HTML,全称为超文本标记语言(HyperText Markup Language),是一种用于创建网页的标准标记语言。它通过一系列标签来定义网页的内容和结构。其主要特点包括:
- 简易性:HTML语法简单,易于学习和使用。
- 可扩展性:可以通过添加新的标签和属性来扩展功能。
- 平台无关性:HTML文件可以在不同的操作系统和浏览器中显示。
HTML文档由一系列标签组成,这些标签可以描述文字、图像、链接、表格等内容。例如,<p>
标签用于定义段落,<a>
标签用于创建超链接等。
6.1、HTML5新标签
6.1.1、新标签的XSS
HTML5中新增的一些标签和属性,使得 XSS等Web攻击产生了新的变化,为了总结这些变化,有安全研究者建立了一个HTML5 Security Cheatsheet项目。
6.1.2、iframe的sandbox
在HTML5中,专门为iframe定义了一个新的属性,叫 sandbox。使用sandbox这一个属性后,
<iframe>
标签加载的内容将被视为一个独立的“源”(源的概念请参考“同源策略”),其中的脚本将被禁止执行,表单被禁止提交,插件被禁止加载,指向其他浏览对象的链接也会被禁止。
sandbox有几个属性值:
- allow-same-origin:允许同源访问;
- allow-top-navigation:允许访问顶层窗口;
- allow-forms:允许提交表单;
- allow-scripts:允许执行脚本。
6.1.3、Link Types: noreferrer
Referer
头信息是HTTP请求头的一部分,用于指示当前请求的来源页面。当用户点击一个链接或提交表单时,浏览器会在请求头中包含 Referer
信息,告诉目标服务器用户是从哪个页面跳转过来的。主要用途有:
- 流量分析:网站可以通过
Referer
头信息了解用户的访问路径,进行流量分析和优化。 - 安全性:有些网站会根据
Referer
头信息来限制资源的访问,例如防止图片盗链。 - 调试和日志记录:开发者可以使用
Referer
头信息进行调试和日志记录,了解用户的行为路径。
示例如:
假设用户在 page1.html
上点击了一个链接,跳转到 page2.html
,那么 page2.html
的请求头中会包含如下信息:
Referer: https://example.com/page1.html
虽然 Referer
头信息有很多有用的用途,但它也可能泄露用户的隐私信息。因此,浏览器和开发者可以使用 noreferrer
或 Referrer-Policy
来控制 Referer
头信息的发送。
这里想到了CSRF的防御方法之一是开启Referer头信息验证
6.1.4、Canvas的妙用
<canvas>
标签让JavaScript可以在页面中直接操作图片对象,也可以直接操作像素,构造出图片区域。- Canvas提供的强大功能,甚至可以用来破解验证码。Shaun Friedle 写了一个 GreaseMonkey的脚本通过JavaScript 操作 Canvas 中的每个像素点,成功地自动化识别了 Megaupload提供的验证码。大致过程如:
- 首先将图片导canvas,并进行转换;
- 分隔不同字符;
- 将字符从背景中分离出来,判断背景颜色即可;
- 再将结果重新绘制。
6.2、其他安全问题
6.2.1、Cross-Origin Resource Sharing
Cross-Origin Resource Sharing(CORS)是一种基于HTTP头的机制,允许服务器声明哪些源站可以访问其资源,从而解决了浏览器的同源策略限制。
超文本传输协议(Hyper Text Transfer Protocol, HTTP)用于在Web浏览器和Web服务器之间传输数据。HTTP请求方法定义了Web浏览器如何向Web服务器发送请求,常用的方式有GET与POST:
-
GET
方法- 用途:
GET
方法用于从服务器请求数据。它通常用于获取资源,例如网页内容或API数据。 - 参数传递:
GET
请求的参数通过URL
传递,格式为?key1=value1&key2=value2
。 - 安全性:由于参数包含在
URL
中,GET
请求不适合传输敏感数据(如密码),因为URL
可能会被记录在浏览器历史记录或服务器日志中。 - 缓存:
GET
请求可以被缓存,这意味着相同的请求可以从缓存中获取数据,而不需要每次都向服务器发送请求。 - 长度限制:
GET
请求的URL
长度有限制,通常为2048个字符。 - 幂等性:
GET
请求是幂等的,多次执行相同的GET
请求不会改变服务器的状态。
- 用途:
-
POST
方法- 用途:
POST
方法用于向服务器发送数据,通常用于提交表单或上传文件。 - 参数传递:
POST
请求的参数包含在请求体中,而不是URL
中,这使得它更适合传输大量数据或敏感数据。 - 安全性:
POST
请求比GET
请求更安全,因为参数不会显示在URL
中,但仍需通过HTTPS确保数据传输的安全性。 - 缓存:
POST
请求不会被缓存,每次请求都会发送到服务器并处理。 - 长度限制:
POST
请求对数据长度没有限制,可以传输大量数据。 - 非幂等性:
POST
请求不是幂等的,多次执行相同的POST
请求可能会导致服务器状态的变化,例如创建多个相同的资源。
- 用途:
特性 | GET | POST |
---|---|---|
用途 | 请求数据 | 发送数据 |
参数传递 | URL | 请求体 |
安全性 | 不适合敏感数据传输 | 相对更安全,但需HTTPS |
缓存 | 可以被缓存 | 不会被缓存 |
长度限制 | 有限制(通常2048字符) | 无限制 |
幂等性 | 是 | 否 |
可见性 | 参数在URL中可见 | 参数在请求体中不可见 |
6.2.2、postMessage——跨窗口传递消息
- postMessage 允许每一个 window(包括当前窗口、弹出窗口、iframes等)对象往其他的窗口发送文本消息,从而实现跨窗口的消息传递。这个功能是不受同源策略限制的。
- 在使用postMessage()时,有两个安全问题需要注意。
(1)在必要时,可以在接收窗口验证 Domain,甚至验证URL,以防止来自非法页面的消息。这实际上是在代码中实现一次同源策略的验证过程。
(2)在本例中,接收的消息写入textContent,但在实际应用中,如果将消息写入innerHTML,甚至直接写入script 中,则可能会导致 DOM based XSS的产生。根据“Secure By Default”原则,在接收窗口不应该信任接收到的消息,而需要对消息进行安全检查。
使用 postMessage
的两个窗口需要满足以下要求:
-
窗口引用:发送消息的窗口需要能够引用接收消息的窗口。例如,通过
window.open
打开的窗口,或 iframe 的contentWindow
属性。 -
协议、主机和端口:虽然
postMessage
可以跨域通信,但为了安全起见,通常建议两个窗口使用相同的协议(如 HTTPS)、主机和端口。这有助于确保消息的来源是可信的。 -
目标源(targetOrigin):在调用
postMessage
时,必须指定目标窗口的源(协议、主机和端口)。这可以通过targetOrigin
参数来实现。使用"*"
表示不限制目标源,但这可能会带来安全风险。 -
事件监听:接收消息的窗口需要添加事件监听器来处理
message
事件。 -
安全验证:接收消息时,始终验证
event.origin
以确保消息来自可信任的源,并验证消息内容的格式和数据,以防止恶意代码注入。
新技术的产生势必会带来新的安全问题
6.2.3、Web Storage
Web Storage(网页存储)是一种由HTML5引入的API,用于在用户的浏览器中存储数据。它提供了比传统的cookie更直观和高效的存储方式。Web Storage包括两种主要机制:localStorage
和 sessionStorage
。
-
localStorage
- 持久性:数据会一直保存在浏览器中,直到被显式删除,即使浏览器关闭后数据仍然存在。
- 存储容量:通常比cookie大,约为5MB(不同浏览器可能有所不同)。
- 使用场景:适用于需要长期保存的数据,例如用户设置、偏好等。
-
sessionStorage
- 持久性:数据仅在页面会话期间有效,当浏览器或标签页关闭时,数据会被清除。
- 存储容量:与localStorage相同,约为5MB。
- 使用场景:适用于需要在单个会话中保存的数据,例如临时表单数据、会话状态等。
Web Storage 让 Web开发更加的灵活多变,它的强大功能也为XSS Payload大开方便之门。攻击者有可能将恶意代码保存在Web Storage 中,从而实现跨页面攻击。
Web Storage和Cookie主要区别:
区别 | Web Storage | Cookie |
---|---|---|
大小限制 | 一般为5MB或更多 | 每个Cookie的大小通常限制在4KB以内 |
数据传输 | 数据仅存储在客户端,不会随每次请求发送到服务器 | 每次请求都会将Cookie发送到服务器 |
用途 | 用于存储大量数据,适合需要在客户端持久化存储的数据 | 主要用于会话管理、用户跟踪和存储用户偏好 |
存储位置 | 仅存储在浏览器中,不会自动传输到服务器 | 存储在浏览器中,并且可以通过HTTP头部在客户端和服务器之间传输 |
适用场景 | 适用于需要在客户端存储大量数据的场景,如离线应用数据 | 适用于需要在客户端和服务器之间传递少量数据的场景,如用户登录状态 |