继续趣事分享。

上回聊到了大学里用一根网线发起攻击,今天接着往后讲。

不过这次讲的正好相反 —— 不是攻击,而是防御。一个奇葩防火墙的开发经历。

第二学期大家都带了电脑,于是可以用更高端的方法断网了。但设备先进反而没有了 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 攻击的更多相关文章

  1. 【趣事】用 JavaScript 对抗 DDOS 攻击 (下)

    上一篇:http://www.cnblogs.com/index-html/p/js-network-firewall.html 对抗 v2 之前的那些奇技淫巧,纯属娱乐而已,并不能撑多久. 但简单. ...

  2. 如何使用Nginx对抗DDoS攻击?

    时不时的就有客户会被DDoS一下.很多时候攻击很简单也容易封堵,但是攻击的目标是应用的时候就更难防御.在这里云端卫士介绍一下使用Nginx作为代理过滤器来封堵一些这种攻击. Apache DDoS攻击 ...

  3. JavaScript实现DDoS攻击原理,以及保护措施。

    DDos介绍 最普遍的攻击是对网站进行分布式拒绝服务(DDoS)攻击.在一个典型的DDoS攻击中,攻击者通过发送大量的数据到服务器,占用服务资源.从而达到阻止其他用户的访问. 如果黑客使用JavaSc ...

  4. 知物由学 | 如何利用人工智能来对抗DDoS攻击?

    欢迎访问网易云社区,了解更多网易技术产品运营经验. "知物由学"是网易云易盾打造的一个品牌栏目,词语出自汉·王充<论衡·实知>.人,能力有高下之分,学习才知道事物的道理 ...

  5. 浅谈 DDoS 攻击与防御

    浅谈 DDoS 攻击与防御 原创: iMike 运维之美  什么是 DDoS DDoS 是英文 Distributed Denial of Service 的缩写,中文译作分布式拒绝服务.那什么又是拒 ...

  6. 破坏之王DDoS攻击与防范深度剖析【学习笔记】

    一.DDoS初步印象 1.什么是分布式拒绝服务攻击? 1)首先它是一种拒绝服务攻击 我们可以这么认为,凡是导致合法用户不能访问服务的行为,就是拒绝服务攻击. 注:早期的拒绝服务主要基于系统和应用程序的 ...

  7. 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 什么 ...

  8. 前端-DDoS攻击

    下面的脚本(略有修改)就会向受害网站发送大量的请求: function imgflood() { var TARGET = 'example.com' var URI = '/index.php?' ...

  9. 抗D十招:十个方法完美解决DDoS攻击防御难题

    可以说,DDoS是目前最凶猛.最难防御的网络攻击之一.现实情况是,这个世界级难题还没有完美的.彻底的解决办法,但采取适当的措施以降低攻击带来的影响.减少损失是十分必要的.将DDoS防御作为整体安全策略 ...

随机推荐

  1. 关于CryptoJS中md5加密以及aes加密的随笔

    最近项目中用到了各种加密,其中就包括从没有接触过得aes加密,因此从网上各种查,官方的一种说法: 高级加密标准(英语:Advanced Encryption Standard,缩写:AES),在密码学 ...

  2. LeetCode-3LongestSubstringWithoutRepeatingCharacters(C#)

    # 题目 3. Longest Substring Without Repeating Characters Given a string, find the length of the longes ...

  3. ajax异步请求

    做前端开发的朋友对于ajax异步更新一定印象深刻,作为刚入坑的小白,今天就和大家一起聊聊关于ajax异步请求的那点事.既然是ajax就少不了jQuery的知识,推荐大家访问www.w3school.c ...

  4. 史上最详细git教程

    题外话 虽然这个标题很惊悚,不过还是把你骗进来了,哈哈-各位看官不要着急,耐心往下看 Git是什么 Git是目前世界上最先进的分布式版本控制系统. SVN与Git的最主要的区别 SVN是集中式版本控制 ...

  5. Photoshop将普通照片快速制作二次元漫画风格效果

    今天为大家分享Photoshop将普通照片快速制作二次元漫画风格效果,教程很不错,对于喜欢漫画的朋友可以参考本文,希望能对大家有所帮助! 一提到日本动画电影,大家第一印象肯定是宫崎骏,但是日本除了宫崎 ...

  6. 如何优化coding

    如何优化coding 前言 最近一直在做修改bug工作,修改bug花费时间最多的不是如何解决问题而是怎样快速读懂代码.如果代码写的好的,不用debug就可以一眼看出来哪里出了问题.实际上,我都要deb ...

  7. 装饰者模式 Decoration

    1.什么是装饰者模式 动态给对象增加功能,从一个对象的外部来给对象添加功能,相当于改变了对象的外观,比用继承的方式更加的灵活.当使用装饰后,从外部系统的角度看,就不再是原来的那个对象了,而是使用一系列 ...

  8. css_02之盒模型、渐变

    1.框模型:盒模型,①对象实际宽度=左右外边距+左右边框+左右内边距 + width:②对象实际高度=上下外边距+上下边框+上下内边距 + height: 2.外边距:margin:取值:①top(上 ...

  9. 关于javascript中的this关键字

    this是非常强大的一个关键字,但是如果你不了解它,可能很难正确的使用它. 下面我解释一下如果在事件处理中使用this. 首先我们讨论一下下面这个函数中的this关联到什么. function doS ...

  10. python-time 模块

    1.时间戳是以秒为单位的浮点小数,时间戳以自1970年1月1日午夜到现在经过了的时间来表示 2.时间模块引入方式:import time 3.返回时间戳 time.time() 4.返回时间元组:ti ...