欢迎来到 黑吧安全网 聚焦网络安全前沿资讯,精华内容,交流技术心得!

如何用前端防御XSS及建立XSS报警机制(三)

来源:本站整理 作者:Black-Hole 时间:2017-05-08 TAG: 我要投稿

前言
大家可以去参考如何用前端防御XSS及建立XSS报警机制的前言,至于觉得前端XSS防御没必要那可能此篇文章的思路和你所认为的有所不同,可以认真看完后,再做评论。谢谢。
一、回顾
我这个项目叫做FECM,在之前的功能里,前端只做一件事。就是重写alert方法。接下来就没有了。当时的出发点,是当黑客在进行XSS的时候,会使用alert语法来进行测试。但是现在由于chrome和其他浏览器的壮大,各种针对xss的过滤规则。导致现在很少有人来使用alert来进行测试了,而转到console.log等语法了。我不能让我的FECM变得鸡肋,所以在之前的基础上增加了一些功能。
我们先来看看之前的前端代码:
var backAlert = alert;
window.alert = function(str){
    backAlert(str);
    new Image().src = 'http://fecm_url/Api/addVul/';
}
很简单,只是替换了alert,先弹窗,然后使用img进行发包。
再写完之前的前端防御XSS的时候,无意间发现了知乎上有人说到了这种防御方法,而且发现的时间却是比我的久,而且研究的也比较深。地址:JavaScript函数劫持,原地址已经无法访问了。作者是hkluoluo。有幸看到了这篇文章后,对我的之前写的FECM有很大的触动。大家可以去看看,看完之后再看此篇文章也不迟。因为在本文中会提及到
我之前的代码只是完成alert的Hook,却没有想到反Hook这种情况的存在,于是我基于hkluoluo的文章中开始了本次的开发。
二、前端代码架构
var fecmHook = {
    url : '',    //后端接受的地址
    whiteList : [],     //白名单
    jsLink : [],    //用于存放第三方js的链接
    base64 : {},    //base64编码解码功能方法
    ajax : function(){},    //封装的ajax请求函数
    alertHook : {},    //alert劫持与反"反劫持"
    getJsLink : {},    //获取字符串里所有url为javascript脚本
    checkJsContent : function(){},    //检测javascript文件里的内容
}
我把所有的功能,全部集成在一个Object对象里面了,方便后期维护。
url这里我本地搭建的地址是http://fecm.cn
whiteList存放了各类第三方cdn的url地址:
['libs.baidu.com','ib.sinaapp.com','upcdn.b0.upaiyun.com','cdn.staticfile.org','cdn.bootcss.com','cdnjs.cloudflare.com','ajax.googleapis.com','code.jquery.com','js.cdnbee.com','bdimg.share.baidu.com','assets-cdn.github.com']
jsLink默认是空,是后面代码把js的url,push上去。
后面的代码,我们分章节来介绍吧。
三、反“反劫持”
在JavaScript函数劫持一文中,说到了劫持及反劫持,劫持的代码和我之前写的差不多。所以这里就不说劫持了,而说说反劫持,我们先来看看hkluoluo文章里的反劫持代码:
function checkHook(proc) {
    if (proc.toString().indexOf("[native code]") > 0) {
        return false;
    } else {
        return true;
    }
}
checkHook(alert);
很棒的劫持方法,是不是。由于javascript内置函数,是不会向外公开里面的实现方法,所以内置函数返回函数的时候,都是function proc() { [native code] }这种。然后针对[native code]关键字进行匹配就知道了当前的函数是否被劫持了。我们来看看代码运行后的结果:

我看了下,这个方法,是存在被绕过的情况的,因为检测的时候使用的是indexOf函数,也就是说,我只需要让他返回的结果存在[native code]就行了。代码如下:
function checkHook(proc) {
    if (proc.toString().indexOf("[native code]") > 0) {
        return "没有劫持";
    } else {
        return "函数被劫持了";
    }
}
var backAlert = alert;
window.alert = function(str){
    backAlert(str);
    new Image().src = 'http://fecm_url/Api/addVul/';
    //{ [native code] }
}
checkHook(alert);
我只需要写个注释就可以完全绕过刚刚的checkHook函数,运行结果如下:

[1] [2] [3] [4] [5] [6] [7] [8] [9] [10]  下一页

【声明】:黑吧安全网(http://www.myhack58.com)登载此文出于传递更多信息之目的,并不代表本站赞同其观点和对其真实性负责,仅适于网络安全技术爱好者学习研究使用,学习中请遵循国家相关法律法规。如有问题请联系我们,联系邮箱admin@myhack58.com,我们会在最短的时间内进行处理。
  • 最新更新
    • 相关阅读
      • 本类热门
        • 最近下载