记一次安全事故排查

来源:互联网 发布:商丘seo 编辑:程序博客网 时间:2024/04/30 16:06

项目组有个项目管理网站wss,搭建在公网之上,今天上班的时候发现访问网站时会跳转到一个广告页面(原地跳转,而不是打开一个新的页面)。
嗯,这就是现象。

下面记录一下整个排查过程。

  1. 使用Chrome查看网络数据是如何交互的,但是这个方法无效,因为在原地跳转的一瞬间,chrome中网络的数据就已经更新了,而我们希望看到的是如何跳转到这个广告页面的。
  2. 使用wireshark,过滤,抓包,终于看到,在获取到style.css文件之后,跳转到了一个其他域的请求,其HTTP报头中写着:host:**(广告域);referer:www.wssys.net。也即是从wssys.net中跳转到这个广告里面的。
  3. 把style.css屏蔽掉,因为我不知道这个向wssys.net的请求是谁发起的,只能按照请求的顺序依次排查,所幸需要排查的不多。style.css如果有个连接(比如图片)是指向wssys.net那么就可能会出现这个refer情况。
  4. 把style.css屏蔽掉并不work,然后只能去排查代码,在user_upload.php文件中发现了如下一个iframe
<iframe id="frame_content" name="main_frame" frameborder="0" height="1px" width="1px" src="http://www.wssys.net/analytics<?php if ($language == "en") { echo "_en";}?>.html" scrolling="no"></iframe>//终于发现了wssys.net的影子,把这个请求放到浏览器中就会出现刚刚的跳转。因此,应该是这个域名过期了,或者其服务器出现了些什么问题所导致的。

解决方法也就简单了,直接把这个iframe删除即可。

更进一步

接下来的问题很惊心啊,一个iframe中的内容竟然可以去影响外部窗口的location。这个实在是太可怕了,试想,如果一个访问量很大的网站中有个小小的iframe嵌入了某个网站的信息,然后这个网站被人篡改了,这样将会直接导致这个大型网站被跳转到一个什么乱七八糟,甚至是钓鱼页面上。
而更可怕的是如果这个被嵌入的网站是类似于google-analysis的网站(当然google的技术肯定是没问题的),那么全球可能会有很多很多网站都会受到影响。

为此,做了个小小的实验:

index.html<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head><body>    这是main body窗口    <iframe src="http://******(某个域名下)/iframe.html" width="100px" height="100px"/></body></html>
iframe.html<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /><script type="text/javascript">    window.parent.location.replace("http://www.baidu.com");</script> </head><body>    这是iframe窗口</body></html>

就这个小小的代码window.parent.location.replace就会发生 我们上面说的问题。

措施

有时候,对于页面中的iframe并不能简单粗暴的删掉,但是我们又不能完全的信任它是非常安全。我查询了MDN的iframe属性,发现了sandbox这个属性,当然了只支持html5.
iframe属性

通过使用sandbox可以限制iframe中所允许做的操作。
sandbox包含如下四个属性:

  • allow-same-origin: 允许将内容作为普通来源对待。如果未使用该关键字,嵌入的内容将被视为一个独立的源。
  • allow-top-navigation:嵌入的页面的上下文可以导航(加载)内容到顶级的浏览上下文环境(browsing context)。如果未使用该关键字,这个操作将不可用。
  • allow-forms: 允许嵌入的浏览上下文可以提交表单。如果该关键字未使用,该操作将不可用。
  • allow-scripts: 允许嵌入的浏览上下文运行脚本(但不能window创建弹窗)。如果该关键字未使用,这项操作不可用。

所以,我们可以将index.html改为如下:

index.html<!DOCTYPE html><html><head><meta http-equiv="Content-Type" content="text/html; charset=utf-8" /></head><body>    这是main body窗口    <iframe src="http://******/iframe.html" width="100px" height="100px" sandbox="allow-scripts"/></body></html>
2 0
原创粉丝点击