漏洞描述
今天大嘴收到360网站安全邮件报告,发现网站存在高危漏洞:使用存在漏洞的JQuery版本
即攻击者可以根据站点使用的jquery版本来判断是否存在XSS漏洞,从而构造恶意代码插入目标页面,当用户浏览该页面时,嵌入的恶意代码就会执行,可能造成Cookie被盗取进而引发更多损失。
对此博主也到网上查阅了一下,发现jquery由于自身的设定,可以快速动态地更新DOM的同时,也包括接受html和脚本内容,jquery很可能错误的识别一个包含html片段的选择器并尝试解析创建相关的元素,对于不受信任的内容引入到jquery时,DOM (innerHTML 、document.write)等可能被修改,这里低版本的jquery无法有效的对其进行阻止,也就是可能会执行一些恶意代码。
事实上,定时更新jquery版本,可以很大程度上限制这种漏洞,如XSS漏洞bug 9521,即可以执行以“#”开头的恶意代码,其在jquery-1.6.1版本中存在,但是升级到1.6.3版本后便可以组织这种bug,XSS漏洞bug 11290 漏洞在jquer-1.6.3版本中存在,但是升级到1.12.4版本后,则此漏洞被修复。
可以看到这些恶意代码都是带有特殊字符或是特殊的html片段,所以想要从根本上解决问题,就需要严格控制输入和输出。
解决方案
这里我们首先看一下360给出的三个方案,最后再看一下如何升级jquery版本。
①、定义过滤用户输入的内容,如评论、留言、针对性的添加黑名单
通过检查用户输入的内容中是否有非法内容。如<>(尖括号)、"(引号)、 \'(单引号)、%(百分比符号)、;(分号)、()(括号)、&(& 符号)、+(加号)、#(井号)等。
②、严格控制站点输出,可以利用函数对出现的XSS漏洞的参数惊醒过滤:
- htmlspecialchars() 函数,用于转义处理在页面上显示的文本。
- htmlentities() 函数,用于转义处理在页面上显示的文本。
- strip_tags() 函数,过滤掉输入、输出里面的恶意标签。
- header() 函数,使用header("Content-type:application/json"); 用于控制 json 数据的头部,不用于浏览。
- urlencode() 函数,用于输出处理字符型参数带入页面链接中。
- intval() 函数用于处理数值型参数输出页面中。
- 自定义函数,在大多情况下,要使用一些常用的 html 标签,以美化页面显示,如留言、小纸条。那么在这样的情况下,要采用白名单的方法使用合法的标签显示,过滤掉非法的字符。
其中不同语言的站点,可有不同的函数进行控制,如php的htmlentities()或是htmlspecialchars()、Python的cgi.escape()、ASP的Server.HTMLEncode()、ASP.NET的Server.HtmlEncode()或功能更强的Microsoft Anti-Cross Site Scripting Library、Java的xssprotect(Open Source Library)、Node.js的node-validator。
注意:以上两个方法都需要有一定的编程功底,事实上博主在这方面很薄弱,这里也只提供了方向,具体的案例,可以到网上找下,如果有操作的朋友欢迎留言。
③、使用360开源的漏洞修复插件
具体可以参考:http://webscan.360.cn/group/topic/tid/4571
这里博主采用了这种方法,linux的操作系统,下载了zip的压缩包,上传到站点根目录,解压出来:
[root@Moni htdocs]# unzip 360safe.zip
[root@Moni htdocs]# find 360safe/
360safe/
360safe/360webscan.php
360safe/webscan_cache.php
然后在站点的wp-config.php文件中加入以下代码,如果放到config文件中,则不需要添加<?php ?>了,当然我是放在了主题目录下的head.php文件中:
<!--360漏洞安全扫描-->
<?php if(is_file($_SERVER['DOCUMENT_ROOT'].'/360safe/360webscan.php')){
require_once($_SERVER['DOCUMENT_ROOT'].'/360safe/360webscan.php');
} ?>
添加完毕后,你需要一个360账号,然后到:http://webscan.360.cn/protect 、可以查看是否安装成功以及黑客攻击记录统计!
④、升级JQuery版本
这个当然方法虽然可行,但是升级的过程总会出现很多蛋疼的问题,所以没有把握不推荐使用,务必要做好备份工作哦。
这里针对DOMXSS漏洞的,一般都是早期的版本,这里建议升级到jQuery1.9.x或1.x最新版本,如jquery-1.12.0。
升级jquery是很蛮烦的,因为你的主题或是站点样式等等很多功能插件都是基于原先的低版本jquery编写的,升级新版本很多功能和函数是被弃用的,所以如果你是编程高手,可以整站升级一下。
当然博主目前是没有那个能力的,这里退而求次,使用jquery官方提供的一种向下兼容插件,并直接升级到了当前最新版本jQuery-3.2.1;
首先我们先下载需要的jQuery的js文件:
Download the compressed, production jQuery 3.2.1
Download the uncompressed, development jQuery 3.2.1
而jQuery Migrate plugin有两个版本,第一种就是把jquery升级到最新了版本,但站点的功能代码不变,以此向下兼容;
Download the compressed, production jQuery Migrate 1.4.1
Download the uncompressed, development jQuery Migrate 1.4.1
第二个版本站点新增了在jQuery 3.0或更高版本上运行的代码,但jquery版本仍3.0以下时向上兼容使用;
Download the compressed, production jQuery Migrate 3.0.0
Download the uncompressed, development jQuery Migrate 3.0.0
注意,上面jquery和migrate插件均有压缩和不压缩的两种版本,不压缩的为开发版本,使用时可以F11检查详细的错误报告,建议升级时先使用不压缩的js,升级确认无误后,在替换为压缩版本,即带有min的版本。
下面是详细的升级步骤:
1、首先找到站点使用的jquery文件,一般博客站点放在主题目录下,备份一下。
2、把上面新下载的文件,如jquery-3.2.1.min.js和jquery-migrate-1.4.1.min.js文件上传到相同目录下。
3、修改主题目录下的head.php文件找到加载jquery的位置然后删除,并添加两行新的代码:
<script type="text/javascript" src="<?php bloginfo('template_directory'); ?>/lightbox/jquery-3.2.1.min.js"></script>
<script type="text/javascript" src="<?php bloginfo('template_directory'); ?>/lightbox/jquery-migrate-1.4.1.min.js"></script>
4、测试网页是否正常运行,F11检查是否有错误信息,如果无误,则恭喜你升级成功。
5、当然升级成功后,为了安全我们可以把jquery-3.2.1.min.js文件名修改成jquery.min.js,head.php也要修改与之对应。
并把文件中第一行关于版本的说明修改或删除,避免直接暴露jquery版本信息,增加破坏难度。
(好的今天就分享到这里,如果您有高见或好的分享,记得留言哦!)
介绍的很不错,支持原创,比那些抄袭的强多了!
@芋头
介绍得很不错
@flash_cai
博客不错,大爱哦!