【趣事】用 JavaScript 对抗 DDOS 攻击
继续趣事分享。
上回聊到了大学里用一根网线发起攻击,今天接着往后讲。
不过这次讲的正好相反 —— 不是攻击,而是防御。一个奇葩防火墙的开发经历。
第二学期大家都带了电脑,于是可以用更高端的方法断网了。但设备先进反而没有了 GEEK 的感觉。于是,决定做些其他更有意义的事。
一天,几个好友在吐槽,他们的游戏服务器又被打垮了,接着讨论起各种防护方案。
在过去,每当听到防火墙软件时,就觉得毫无卵用。巨大的流量一来,带宽都堵死了,软件又有何用。
不过,大家仍对其寄以厚望。而且还有不少厂商在做,看来,效果总是有一点的。
讨论讨论着,不免又有些蠢蠢欲动。要不,做个防火墙吧,做一个思路完全不同的!
当然,这不是第一次尝试。
初学那会,没有固定的目标。每看见一个小 demo,就想搞个大程序。比如看了 DirectX 就有做游戏的冲动,但不出几天就不了了之。
有段时间对驱动程序产生了兴趣,琢磨起 Windows DDK 里的 demo。当看见 NDIS 中间件这玩意时,顿时起了精神。这不就是一个最底层的包过滤器吗,用来做防火墙,性能自然是极好的。
于是心血来潮,照着其中的样例,改造出一个最简单的 IP 过滤防火墙。为了凸显高性能,硬着头皮看了本数据结构,依样画葫芦写了个哈希表,来更快查询。
然而快归快,没有实际用途,不过是个玩具罢了。
现实中的防火墙,也不可能这么简单的逻辑。肯定还需更高层的协议分析,复杂的策略判断,大量的数据积累。。。当然还少不了无数次的蓝屏调试。
想到这,立马就没有了继续。
然而这一次,决定不再纠结技术层面,而是做一个“另类”的 —— 用最简单的技术,加上巧妙的想法,配合一些独门绝技,来获得出其不意的效果。
考虑到传统的开发人员,对系统、网络都已经非常熟悉,和他们比拼这些,就毫无优势了。
而当时的我,点满了一个和安全毫不相干的技能 —— 网页脚本特效,以及一堆“前端黑魔法”。
但是。。。这。。和网络防御。。。有什么关系?
没有半点关系~~ 想多了。还是考虑正经的吧。
首先想到的,是改造游戏的服务端程序。
毕竟这是“开源”的,肯定能通过修改程序,来加强那脆弱的网络系统。
然而,当看到那密密麻麻的代码、从未用过的语言、完全不熟的调试器,兴致荡然无存。
没兴趣就没想法,果断放弃。
既然如此,那就从客户端试试。
这一次,抱着探索的心情,打开程序,细细揣摩起来。
正当毫无头绪时,突然传来亲切的嚓嚓声 —— 敏感的神经怎能放过,这不是 ie 的专属声音吗。
这才猛然意识到,登录器中内嵌的,不正是一个大大的网页!
有网页,不就可以运行脚本了!
从没想到,居然打起了这个内嵌框的主意~~ 但总算把脚本扯到一起了。
越想越兴奋。现有的防火墙,几乎都是纯服务端的数据分析,能让客户端参与的,应该还很少吧。
“只要在登录器的网页里引一个脚本,就能...”
大家听了,表示可以接受。
有脚本,就可以尽情发挥了。
我们必须让用户运行脚本,才能连上游戏服务器;没运行过脚本的 IP,就一律阻拦。
于是开始构思、整理:
当脚本运行时,发送一个请求给 “授权服务器”
“授权服务器”验证参数之后,将用户 IP 通知给“游戏服务器”上的防火墙,添加到白名单
“游戏服务器”只允许白名单的 IP 通过(“授权服务器”默认在白名单)
正常用户,这并没影响;但攻击器不会执行脚本,也就无法进入白名单 —— 无论发送什么数据包,都会被拦截。
这样,防火墙的策略,也变得极其简单:仅仅判断数据包的 IP 是否在白名单里。
于是,之前那个简陋的 demo 驱动又被翻了出来。因为功能单一,保证了稳定性。而且是在网卡链路层上拦截,所以有超高的性能。
到此,一个 JavaScript 参与的网络防火墙原型诞生了!
也许你会说,这只是转移了风险而已。把游戏服务器的风险,转移到了网站上。要是网站被打垮,同样无法进游戏。
的确如此。不过相比普通的网络程序,Web 有更多成熟的防御方案,甚至用现成的 CDN,就可以缓解。
因此将普通的 C/S 网络防御,挂靠在了更稳定的 B/S 之上,就无需再造轮子了,节省大量成本。
当然这只是基本雏形。实际应用,还有不少需要考虑的地方。
例如,白名单不能无限增加,得有过期时间;客户端的脚本,也不能只运行一次,得定期触发激活。
....
不过,由于无需考虑兼容性问题,使得开发十分顺利。服务器都是 Win2003;网页运行在 WebBrowser 控件里,都是 ie67 的内核。
几天后功能完成。接着做了个简单的界面程序,将方案进行包装,就开始试用了。
上线后,效果很理想!任何与玩家无关的流量,都进行了拦截。虽然大流量攻击仍无能为力,但各种 CC 攻击就能轻松抵挡住了!
不过,攻击者也绝不会罢休。
况且,前端的一切都是公开的,这个秘密早晚会被发现。
对抗 v1
平静了几个月后,一大波僵尸又来了。
日志显示,短时间内白名单进了大量 IP,这绝不是正常用户的。
显然,已有人发现了这个秘密!
事实上,第一版做的非常简单,甚至连脚本都没混淆。
他们把脚本逻辑,移植到了攻击器里。这样不访问网页,也能变成合法用户了。
至于他们是如何发现的,无从得知。但脑补发现后的心情,一定是这样的:卧槽,原来是在这里,居然这么猥琐~~~~
当然,这是意料之中的事。
新版本早已准备就绪,“前端黑魔法” 也跃跃欲试,决定进行反击。
这次,将脚本进行了加密。
不,不是网上流传的那种加密,而是特殊构造的。虽然看起来差不多:整个程序,套在一个 eval 之中。
懂点 JS 的都知道,把 eval 换成 console.log 之类的,代码就原形毕现了。相信 99% 的人会这么做。
于是,利用大家这个心理,在代码中埋下一陷阱:如果只解密,不 eval,就会出现意外的后果。
eval(
(function() {
...
T = setTimeout(die, 1)
...
code += 'clearTimeout(T)'
...
return code
})()
)
在解密过程中,偷偷开启一个定时器:1 毫秒后,进入自杀模式 —— 死循环内存申请!
正常情况下,这并不会触发 —— 因为随后 eval 的代码里,会解除这个定时器;但如果把 eval 换成其他的,就无法执行解除了 —— 炸弹触发!
当时的主流内存还是 1~2G,这会瞬间被吞光,卡到硬盘吱吱作响。
为满足好奇心,想看看有多少人栽进去,因此在死循环之前,还加了日志上报的功能。
那段时间,正好在琢磨一个短信接口。于是,这日志就成了测试内容。
每当有人试图破解脚本时,手机就立即收到了消息,体验了回“尽在掌控中”的感觉:)
当然,就这样结束了吗?
不,还早着呢。
【趣事】用 JavaScript 对抗 DDOS 攻击的更多相关文章
- 【趣事】用 JavaScript 对抗 DDOS 攻击 (下)
上一篇:http://www.cnblogs.com/index-html/p/js-network-firewall.html 对抗 v2 之前的那些奇技淫巧,纯属娱乐而已,并不能撑多久. 但简单. ...
- 如何使用Nginx对抗DDoS攻击?
时不时的就有客户会被DDoS一下.很多时候攻击很简单也容易封堵,但是攻击的目标是应用的时候就更难防御.在这里云端卫士介绍一下使用Nginx作为代理过滤器来封堵一些这种攻击. Apache DDoS攻击 ...
- JavaScript实现DDoS攻击原理,以及保护措施。
DDos介绍 最普遍的攻击是对网站进行分布式拒绝服务(DDoS)攻击.在一个典型的DDoS攻击中,攻击者通过发送大量的数据到服务器,占用服务资源.从而达到阻止其他用户的访问. 如果黑客使用JavaSc ...
- 知物由学 | 如何利用人工智能来对抗DDoS攻击?
欢迎访问网易云社区,了解更多网易技术产品运营经验. "知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理 ...
- 浅谈 DDoS 攻击与防御
浅谈 DDoS 攻击与防御 原创: iMike 运维之美 什么是 DDoS DDoS 是英文 Distributed Denial of Service 的缩写,中文译作分布式拒绝服务.那什么又是拒 ...
- 破坏之王DDoS攻击与防范深度剖析【学习笔记】
一.DDoS初步印象 1.什么是分布式拒绝服务攻击? 1)首先它是一种拒绝服务攻击 我们可以这么认为,凡是导致合法用户不能访问服务的行为,就是拒绝服务攻击. 注:早期的拒绝服务主要基于系统和应用程序的 ...
- DDOS攻击与防御简单阐述,列出DDOS的攻击方法和防御方法
参考1:https://www.hi-linux.com/posts/50873.html#%E7%BD%91%E7%BB%9C%E5%B1%82-ddos-%E6%94%BB%E5%87%BB 什么 ...
- 前端-DDoS攻击
下面的脚本(略有修改)就会向受害网站发送大量的请求: function imgflood() { var TARGET = 'example.com' var URI = '/index.php?' ...
- 抗D十招:十个方法完美解决DDoS攻击防御难题
可以说,DDoS是目前最凶猛.最难防御的网络攻击之一.现实情况是,这个世界级难题还没有完美的.彻底的解决办法,但采取适当的措施以降低攻击带来的影响.减少损失是十分必要的.将DDoS防御作为整体安全策略 ...
随机推荐
- 关于CryptoJS中md5加密以及aes加密的随笔
最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...
- LeetCode-3LongestSubstringWithoutRepeatingCharacters(C#)
# 题目 3. Longest Substring Without Repeating Characters Given a string, find the length of the longes ...
- ajax异步请求
做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school.c ...
- 史上最详细git教程
题外话 虽然这个标题很惊悚,不过还是把你骗进来了,哈哈-各位看官不要着急,耐心往下看 Git是什么 Git是目前世界上最先进的分布式版本控制系统. SVN与Git的最主要的区别 SVN是集中式版本控制 ...
- Photoshop将普通照片快速制作二次元漫画风格效果
今天为大家分享Photoshop将普通照片快速制作二次元漫画风格效果,教程很不错,对于喜欢漫画的朋友可以参考本文,希望能对大家有所帮助! 一提到日本动画电影,大家第一印象肯定是宫崎骏,但是日本除了宫崎 ...
- 如何优化coding
如何优化coding 前言 最近一直在做修改bug工作,修改bug花费时间最多的不是如何解决问题而是怎样快速读懂代码.如果代码写的好的,不用debug就可以一眼看出来哪里出了问题.实际上,我都要deb ...
- 装饰者模式 Decoration
1.什么是装饰者模式 动态给对象增加功能,从一个对象的外部来给对象添加功能,相当于改变了对象的外观,比用继承的方式更加的灵活.当使用装饰后,从外部系统的角度看,就不再是原来的那个对象了,而是使用一系列 ...
- css_02之盒模型、渐变
1.框模型:盒模型,①对象实际宽度=左右外边距+左右边框+左右内边距 + width:②对象实际高度=上下外边距+上下边框+上下内边距 + height: 2.外边距:margin:取值:①top(上 ...
- 关于javascript中的this关键字
this是非常强大的一个关键字,但是如果你不了解它,可能很难正确的使用它. 下面我解释一下如果在事件处理中使用this. 首先我们讨论一下下面这个函数中的this关联到什么. function doS ...
- python-time 模块
1.时间戳是以秒为单位的浮点小数,时间戳以自1970年1月1日午夜到现在经过了的时间来表示 2.时间模块引入方式:import time 3.返回时间戳 time.time() 4.返回时间元组:ti ...