浅谈利用JavaScript进行的DDoS攻击原理与防御


Posted in Javascript onJune 04, 2015

分布式拒绝服务攻击(DDoS)攻击是一种针对网站发起的最古老最普遍的攻击。Nick Sullivan是网站加速和安全服务提供商CloudFlare的一名系统工程师。近日,他撰文介绍了攻击者如何利用恶意网站、服务器劫持和中间人攻击发起DDoS攻击,并说明了如何使用HTTPS以及即将到来的名为“子资源一致性(Subresource Integrity,简称SRI)”的Web新技术保护网站免受攻击。

现代网站的大部分交互都来自于JavaScript。网站通过直接向HTML中添加JavaScript代码或者通过HTML元素<script src="">从远程位置加载JavaScript实现交互功能。JavaScript可以发出HTTP(S)请求,实现网页内容异步加载,但它也能将浏览器变成攻击者的武器。例如,下面的代码可以向受攻击网站发出洪水般的请求:

function imgflood() { 
   var TARGET = 'victim-website.com'
   var URI = '/index.php?'
   var pic = new Image()
   var rand = Math.floor(Math.random() * 1000)
   pic.src = 'http://'+TARGET+URI+rand+'=val'
  }
  setInterval(imgflood, 10)

上述脚本每秒钟会在页面上创建10个image标签。该标签指向“victim-website.com”,并带有一个随机查询参数。如果用户访问了包含这段代码的恶意网站,那么他就会在不知情的情况下参与了对“victim-website.com”的DDoS攻击,如下图所示:

浅谈利用JavaScript进行的DDoS攻击原理与防御

许多网站都使用一套通用的JavaScript库。为了节省带宽及提高性能,它们会使用由第三方托管的JavaScript库。jQuery是Web上最流行的JavaScript库,截至2014年大约30%的网站都使用了它。其它流行的库还有Facebook SDK、Google Analytics。如果一个网站包含了指向第三方托管JavaScript文件的script标签,那么该网站的所有访问者都会下载该文件并执行它。如果攻击者攻陷了这样一个托管JavaScript文件的服务器,并向文件中添加了DDoS代码,那么所有访问者都会成为DDoS攻击的一部分,这就是服务器劫持,如下图所示:

浅谈利用JavaScript进行的DDoS攻击原理与防御

这种攻击之所以有效是因为HTTP中缺少一种机制使网站能够禁止被篡改的脚本运行。为了解决这一问题,W3C已经提议增加一个新特性子资源一致性。该特性允许网站告诉浏览器,只有在其下载的脚本与网站希望运行的脚本一致时才能运行脚本。这是通过密码散列实现的,代码如下:

<script src="https://code.jquery.com/jquery-1.10.2.min.js" 
  integrity="sha256-C6CB9UYIS9UJeqinPHWTHVqh/E1uhG5Twh+Y5qFQmYg=" 
  crossorigin="anonymous">

密码散列可以唯一标识一个数据块,任何两个文件的密码散列均不相同。属性integrity提供了网站希望运行的脚本文件的密码散列。浏览器在下载脚本后会计算它的散列,然后将得出的值与integrity提供的值进行比较。如果不匹配,则说明目标脚本被篡改,浏览器将不使用它。不过,许多浏览器目前还不支持该特性,Chrome和Firefox正在增加对这一特性的支持。

中间人攻击是攻击者向网站插入恶意JavaScript代码的最新方式。在通过浏览器访问网站时,中间会经过许多节点。如果任意中间节点向网页添加恶意代码,就形成了中间人攻击,如下图所示:

浅谈利用JavaScript进行的DDoS攻击原理与防御

加密技术可以彻底阻断这种代码注入。借助HTTPS,浏览器和Web服务器之间的所有通信都要经过加密和验证,可以防止第三者在传输过程中修改网页。因此,将网站设为HTTPS-only,并保管好证书以及做好证书验证,可以有效防止中间人攻击。

在回复网友评论时,Nick指出,SRI和HTTPS是相辅相成的,二者同时使用可以为网站提供更好的保护。除了上述方法外,采用一些防DDoS安全产品来加强防护也是一种选择。

Javascript 相关文章推荐
一个网马的tips实现分析
Nov 28 Javascript
JQuery打造省市下拉框联动效果
May 18 Javascript
45个JavaScript编程注意事项、技巧大全
Feb 11 Javascript
javascript弹出窗口中增加确定取消按钮
Jun 24 Javascript
JS清除字符串中重复值的实现方法
Aug 03 Javascript
javascript 动态脚本添加的简单方法
Oct 11 Javascript
js querySelector() 使用方法
Dec 21 Javascript
node.js 核心http模块,起一个服务器,返回一个页面的实例
Sep 11 Javascript
JS构造一个html文本内容成文件流形式发送到后台
Jul 31 Javascript
jQuery实现获取及设置CSS样式操作详解
Sep 05 jQuery
jquery中attr、prop、data区别与用法分析
Sep 25 jQuery
Vue+Node服务器查询Mongo数据库及页面数据传递操作实例分析
Dec 20 Javascript
js动态创建及移除div的方法
Jun 03 #Javascript
JS实现窗口加载时模拟鼠标移动的方法
Jun 03 #Javascript
利用js实现禁止复制文本信息
Jun 03 #Javascript
详解JavaScript中循环控制语句的用法
Jun 03 #Javascript
讲解JavaScript中for...in语句的使用方法
Jun 03 #Javascript
JavaScript中for循环的使用详解
Jun 03 #Javascript
详解JavaScript的while循环的使用
Jun 03 #Javascript
You might like
CPU步进是什么意思?i3-9100F B0步进和U0步进区别知识科普
2020/03/17 数码科技
PHP5新特性: 更加面向对象化的PHP
2006/11/18 PHP
使用GROUP BY的时候如何统计记录条数 COUNT(*) DISTINCT
2011/04/23 PHP
php数组键值用法实例分析
2015/02/27 PHP
Javascript this 的一些学习总结
2012/08/31 Javascript
纯js分页代码(简洁实用)
2013/11/05 Javascript
自己封装的常用javascript函数分享
2015/01/07 Javascript
谈一谈javascript闭包
2016/01/28 Javascript
学习掌握JavaScript中this的使用技巧
2016/08/29 Javascript
js实现交通灯效果
2017/01/13 Javascript
关于javascript作用域的常见面试题分享
2017/06/18 Javascript
jQuery实现手机号正则验证输入及自动填充空格功能
2018/01/02 jQuery
微信小程序左右滚动公告栏效果代码实例
2019/09/16 Javascript
Vue使用富文本编辑器Vue-Quill-Editor(含图片自定义上传服务、清除复制粘贴样式等)
2020/05/15 Javascript
JavaScript实现瀑布流布局的3种方式
2020/12/27 Javascript
浅谈Python中的闭包
2015/07/08 Python
Python语言实现百度语音识别API的使用实例
2017/12/13 Python
python批量设置多个Excel文件页眉页脚的脚本
2018/03/14 Python
Python理解递归的方法总结
2019/01/28 Python
python3中的logging记录日志实现过程及封装成类的操作
2020/05/12 Python
Django model.py表单设置默认值允许为空的操作
2020/05/19 Python
pytorch中的weight-initilzation用法
2020/06/24 Python
深入了解Python enumerate和zip
2020/07/16 Python
python3.7中安装paddleocr及paddlepaddle包的多种方法
2020/11/27 Python
带有css3动画效果的兼容多浏览器简单导航条示例
2014/01/26 HTML / CSS
美国领先的在线邮轮旅游公司:CruiseDirect
2018/06/07 全球购物
如何将无状态会话Bean发布为WEB服务,只有无状态会话Bean可以发布为WEB服务?
2015/12/03 面试题
《充气雨衣》教学反思
2014/04/07 职场文书
个人三严三实对照检查材料思想汇报
2014/09/22 职场文书
蓬莱阁导游词
2015/02/04 职场文书
同意离婚答辩状
2015/05/22 职场文书
企业催款函范本
2015/06/24 职场文书
公司会议开幕词
2016/03/03 职场文书
Web前端:CSS最强总结 附详细代码
2021/03/31 HTML / CSS
粗暴解决CUDA out of memory的问题
2021/05/22 Python
实操Python爬取觅知网素材图片示例
2021/11/27 Python