UI Redressing 漏洞
UI Redressing,也被称为“点击劫持”(Clickjacking),是一种恶意攻击手段,攻击者通过在用户不知情的情况下,利用透明的或不透明的层来诱骗用户在另一个页面上点击按钮或链接,从而执行非本意的操作。这种攻击通常涉及到在攻击者控制的页面上使用iframe
嵌入目标网站的页面,并精确地对齐这些页面,使得用户在点击攻击者页面上的可见元素时,实际上是在目标网站上执行了操作。
UI Redressing的危害极大,攻击者可以利用这种技术进行信息窃取、网络钓鱼、诈骗等恶意活动。例如,攻击者可以在受害者的银行登录页面上覆盖一个透明的登录表单,以此来获取用户的用户名和密码。
要防止UI Redressing攻击,即点击劫持,可以通过在页面头部添加特定的HTTP头部来实现:
-
X-Frame-Options: 这是一个HTTP响应头,用来告诉浏览器是否应该在frame中加载页面。可以设置为
DENY
或SAMEORIGIN
来防止页面被嵌入到其他网站的frame中。例如,在Apache服务器中,可以通过添加以下配置来设置这个头部:Header always set X-Frame-Options "SAMEORIGIN"
如果是设置为
DENY
,则可以这样配置:Header set X-Frame-Options "DENY"
-
Content Security Policy (CSP): 使用CSP的
frame-ancestors
指令可以控制页面是否可以在frame中被嵌入。例如:Content-Security-Policy: frame-ancestors 'none';
这将阻止任何域嵌入页面。如果只允许相同域的页面嵌入,则可以设置为:
Content-Security-Policy: frame-ancestors 'self';
-
frame-buster脚本: 在页面中添加JavaScript代码,如果检测到页面被嵌入到frame中,则将页面导航到顶层窗口。例如:
if(top !== self) {top.location = self.location; }
这种方法也被称为frame-buster技术。
-
设置Origin headers: 如果你希望你的网站在特定的源(origin)下打开,你可以在HTTP头部中定义这些源。例如,你可以使用CSP的
frame-ancestors
指令来指定允许嵌入你网站的源。 -
iframe destroyer: 在页面头部添加一个iframe destroyer,这是一种JavaScript代码,它会检测页面是否被嵌入到iframe中,如果是,则会从DOM中移除iframe。例如:
if(self === top) {document.documentElement.style.display = 'block'; } else {top.location = self.location; }
这段代码首先隐藏了页面的所有内容,然后检查如果页面是顶层窗口,则显示内容;如果不是,则将顶层窗口的location改为当前页面的location,从而破坏iframe。
-
使用Sandbox属性: 在iframe标签中使用sandbox属性可以限制iframe的行为,例如禁止其加载脚本,从而减少被劫持的风险。