【趣事】用 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防御作为整体安全策略 ...
随机推荐
- 基于spring注解AOP的异常处理
一.前言 项目刚刚开发的时候,并没有做好充足的准备.开发到一定程度的时候才会想到还有一些问题没有解决.就比如今天我要说的一个问题:异常的处理.写程序的时候一般都会通过try...catch...fin ...
- 【探索】机器指令翻译成 JavaScript
前言 前些时候研究脚本混淆时,打算先学一些「程序流程」相关的概念.为了不因太枯燥而放弃,决定想一个有趣的案例,可以边探索边学. 于是想了一个话题:尝试将机器指令 1:1 翻译 成 JavaScript ...
- CorelDRAW X8 如何破解激活(附国际版安装包+激活工具) 2016-12-15
之前有位搞平面的好友“小瘦”说CDR X8无法破解,只能用X7.呃……呃……呃……好像是的 其实CDR8难激活主要在于一个点“没有离线激活了,只可以在线激活”,逆天不是专供逆向的,当然没能力去破解,这 ...
- iOS逆向工程之Theos
如果你对iOS逆向工程有所了解,那么你对Tweak并不陌生.那么由Tweak我们又会引出Theos, 那么什么是Theos呢,简单一句话,Theos是一个越狱开发工具包,Theos是越狱开发工具的首先 ...
- (一)开篇—杂谈WebGIS
文章版权由作者李晓晖和博客园共有,若转载请于明显处标明出处:http://www.cnblogs.com/naaoveGIS/ 1.前言 我相信大家对百度地图,谷歌地图等相关应用已经是非常熟悉了.通过 ...
- Linux之搭建自己的根文件系统
Hi!大家好,我是CrazyCatJack.又和大家见面了.今天给大家带来的是构建Linux下的根文件系统.希望大家看过之后都能构建出符合自己需求的根文件系统^_^ 1.内容概述 1.构造过程 今天给 ...
- Git小技巧 - 指令别名及使用Beyond Compare作为差异比较工具
前言 本文主要写给使用命令行来操作Git的用户,用于提高Git使用的效率.至于使用命令还是GUI(Tortoise Git或VS的Git插件)就不在此讨论了,大家根据自己的的喜好选择就好.我个人是比较 ...
- [开发笔记] Graph Databases on developing
TimeWall is a graph databases github It be used to apply mathematic model and social network with gr ...
- JDBC增加删除修改
一.配置程序--让我们程序能找到数据库的驱动jar包 1.把.jar文件复制到项目中去,整合的时候方便. 2.在eclipse项目右击"构建路径"--"配置构建路径&qu ...
- H5 canvas的 width、height 与style中宽高的区别
Canvas 的width height属性 1.当使用width height属性时,显示正常不会被拉伸:如下 <canvas id="mycanvas" width=&q ...