前情回顾:

经过黑衣人和老周的合作,终于清除了入侵Linux帝国的网页病毒,并修复了漏洞。不曾想激怒了幕后的黑手,一场新的风雨即将来临。

详情参见:一条SQL注入引出的惊天大案

 

风云再起

小Q是Linux帝国网络部负责TCP连接的公务员。

一直以来工作都很轻松,加班也少,但自从小马哥到Linux帝国开设了nginx公司,小Q的工作量一下就大了起来,经常加班,为此小Q背后没少抱怨。

一大早,nginx按时启动,绑定了80端口监听,开始了今天的营生。

没过多久,今天的第一个客户来了。

小Q还是如往常一样,收到这个带有SYN标记的数据包后,创建了一个连接请求块,然后将其放入80端口归属的连接请求队列中,回复了一个带有SYN和ACK标记的数据包后,开启了一个定时器,等待第三次握手的完成。

没等多久,这个客户就发来了回信,三次握手完成。小Q把这个连接请求块转移到了80端口对应的连接就绪队列中,并按下了铃铛。

听到铃声的nginx线程从epoll_wait函数中醒来,调用accept函数,从队列中拿到了这个新来的客户,开始服务。

这就是小Q的日常,他已经干这份工作太久了,轻车熟路。

很快到了深夜,小Q准备打个盹儿,这么晚估计是没有活干了。

没想到刚躺下,就来了一个连接请求,小Q揉揉惺忪的睡眼,准备来处理,然后接着很快来了第二个,第三个,第四个······

奇怪的是,每一个客户只发送了一个SYN就没了音讯,眼看着连接请求队列里的请求块越来越多,最后实在没有空间安放新的请求块,小Q开始意识到情况不妙,拉响了帝国安全警报······

全军出击

十分钟前······

“快醒醒,有消息来了“,还在sleep的阿D被唤醒了。

“上峰总算想起我了,我来到Windows帝国都快一个月了,一直没有指示,只是让我保持静默,我都憋坏了。”,阿D伸了伸懒腰,起身调用recv函数取到了消息:

读完消息后,阿D使用原始套接字构造了一个TCP数据包,将SYN标记点亮,伪造了一个源IP地址,将其发送了出去。

经过一通路由转发,这个数据包终于来到Linux帝国,却迟迟没有人来接待,侧目望去,原来,已经有数不清的TCP包堵在门口,还有无数类似的TCP包正在源源不断的涌入……

SYN Flood

此刻,帝国高层正在召开紧急会议。

防火墙:“现在有无数的网络连接进来,为了帝国的安全,我只好先关闭了网络,把那些数据包挡在外面。”

小马哥:“需要赶紧采取措施,恢复正常,我们nginx公司每秒钟都在丢失大量的客户,这是一笔巨额损失!”

帝国安全部长:“小Q,你把当前的形势介绍一下,大家一起来出谋划策。”

小Q:“好的。TCP的三次握手想必诸位都有所了解,收到SYN数据包后,我需要准备一个数据块来存储客户端的信息,敌军正是瞄准了这一点,给我发送大量SYN数据包,我就需要分配大量的数据块,直到把帝国空间耗尽。”

小马哥:“抱歉,我打断一下,你为何不及时把无效的数据块释放掉,腾出空间呢?”

小Q:“当然有,我有一套超时机制,超时以后第三次握手还没来,我就会给释放掉。但现在问题是敌军声势浩大,刚刚腾出的空间马上又会被挤占。”

小马哥:“那简单,你把超时时间调小一点,尽快释放无效的数据块不就行了!”

小Q:“要是太小了,正常的用户因为网络原因,时延比较大的,这不就误伤了吗?”

小马哥:“嗯,这个你们自己权衡一下,取一个合适的值,如今也没有其他办法,赶紧恢复生产才是!”

安全部长:“小Q,先这样试试看”

小Q:“行吧,我这就去”


······半小时后······


小Q:“大人,我已经按照指示执行,不过网络连接越来越多,这一招恐怕支撑不了太久,还是早做打算才是。”

安全部长:“WAF公司呢,你们有什么办法没有?”

WAF公司黑衣人:“大人,我们关注的业务在于web应用安全,此次的SYN Flood,实非我等擅长。”

现场陷入了久久的沉默……

良久,防火墙打破了沉默:“小Q,为何非得在收到第一次握手SYN数据包后就建立数据块?如果把数据块的建立时间放在第三次握手之后呢?”

小Q:“如果一开始不用建立数据块占用空间,那确实解决了大麻烦!不过,不建立数据块,那如何把客户端的信息保存起来呢?”

防火墙:“保存什么信息?”

小Q:“客户端的IP、端口、序列号这些啊。”

防火墙:“这些信息在第三次握手来的数据包中也有啊,不用提前存起来嘛!”

小Q:“说的也是,唉,还是不对,第三次握手我得校验对方发来的ACK是不是我在第二次发给他的序列号+1,如果我提前不分配数据块把我发给他的序列号存起来,到时候就没办法校验了呀!不行,还是得提前存下来!”

防火墙:“有没有什么办法,不用提前存,也能做校验呢?”

小Q:“这,这怎么做?”

防火墙:“有了!第二次发给客户端的序列号,如果不是一个随机值,而是根据客户端信息和其他信息综合计算出来的一个哈希值,收到第三次握手的时候,我们拿到客户端答复的ACK,再重新计算一次哈希值,如果哈希值+1=ACK,那就能对得上,反之就是错误的包,直接丢弃!”

还没等小Q回过神,安全部长起身鼓掌:“妙哉!这真是一个绝妙的点子!小Q,就按这个办法,赶紧去办!”

绝处逢生

小Q回到工作岗位,按照防火墙提供的思路修改了策略。随后,通知防火墙重新打开网络码头,但究竟效果如何,小Q心里还是捏了一把汗。

网络恢复的一刹那,无数TCP SYN数据包涌了进来,这一次,小Q不再分配数据块,只是快速计算了一个哈希值作为序列号,回复给了客户端。小Q忙的满头大汗,但看到存储空间总算没有疯狂增长,小Q心里长舒了一口气。

收到消息的会议室里响起了热烈的掌声!

安全部长:“本次经历值得牢记,我们给这个方案取个名字吧,告知比特宇宙其他的帝国,帮助大家一起抵抗黑暗势力的侵扰。”
 

WAF黑衣人抢先发言:“我觉得这个方式关键点在于把校验信息的存储从服务器放到了客户端,有点类似web技术中的Cookie。要不咱们就叫做SYN Cookie吧!”

防火墙:“嗯,这个名字好,总结的很到位”

一个小时后,疯狂的TCP SYN数据包潮水逐渐退去,Linux帝国终于恢复了往日的宁静,nginx公司的业务也恢复了正常。小Q抬头一看,天边已经微亮,这漫长的夜晚总算是熬过去了。

未完待续·······

彩蛋

“大人,Linux帝国有防火墙、WAF一帮人守卫,我们的攻击没有起到什么效果。”

“你以为他们真的是靠自己的本事胜利的吗?这次只是给他们点教训,我们的游戏才刚刚开始。”

欲知后事如何,请关注后续精彩......

 

精彩回顾:

一条SQL注入引出的惊天大案

一条SQL注入引出的惊天大案2:无限战争的更多相关文章

  1. 一条SQL注入引出的惊天大案

    前情回顾: WAF公司拦截到一个神秘的HTTP数据包,在这个包的表单字段中发现了SQL语句.目标指向80端口,而这正是nginx公司的地盘.详情参见:一个HTTP数据包的奇幻之旅 虚拟机的世界 一个安 ...

  2. 【挖洞经验】如何在一条UPDATE查询中实现SQL注入

    直奔主题 跟往常一样,在喝完我最爱的果汁饮料之后,我会习惯性地登录我的Synack账号,然后选择一个应用来进行渗透测试,此时我的“黑客之夜”便正式开始了. 我与很多其他的安全研究人员的习惯一样,我会在 ...

  3. 利用“参数赋值”防范SQL注入漏洞攻击

    <<年轻,无权享受>————送给每一个看到此文的同僚们 在这无精打采的炎夏 我躺在阳台上房东的旧沙发 回想几个月来遇到的问题 我不禁内心开始慌张喘着粗气 还有大把时间去打拼 没有到只 ...

  4. 从c#角度看万能密码SQL注入漏洞

    以前学习渗透时,虽然也玩过万能密码SQL注入漏洞登陆网站后台,但仅仅会用,并不理解其原理. 今天学习c#数据库这一块,正好学到了这方面的知识,才明白原来是怎么回事. 众所周知的万能密码SQL注入漏洞, ...

  5. 浅谈SQL注入风险 - 一个Login拿下Server

    前两天,带着学生们学习了简单的ASP.NET MVC,通过ADO.NET方式连接数据库,实现增删改查. 可能有一部分学生提前预习过,在我写登录SQL的时候,他们鄙视我说:“老师你这SQL有注入,随便都 ...

  6. 深入理解SQL注入绕过WAF和过滤机制

    知己知彼,百战不殆 --孙子兵法 [目录] 0x0 前言 0x1 WAF的常见特征 0x2 绕过WAF的方法 0x3 SQLi Filter的实现及Evasion 0x4 延伸及测试向量示例 0x5 ...

  7. 防止sql注入和sqlmap介绍

    sql注入问题从WEB诞生到现在也一直没停过,各种大小公司都出现过sql注入问题,导致被拖库,然后存在社工库撞库等一系列影响. 防止sql注入个人理解最主要的就一点,那就是变量全部参数化,能根本的解决 ...

  8. SQL注入攻防入门详解

    =============安全性篇目录============== 本文转载 毕业开始从事winfrm到今年转到 web ,在码农届已经足足混了快接近3年了,但是对安全方面的知识依旧薄弱,事实上是没机 ...

  9. XPath注入跟SQL注入差不多,只不过这里的数据库走的xml格式

    SQL注入这块不想细聊了,相信很多朋友都听到耳朵长茧,不外乎是提交含有SQL操作语句的信息给后端,后端如果没有做好过滤就执行该语句,攻击者自然可以随意操纵该站点的数据库. 比如有一个图书馆站点book ...

随机推荐

  1. SVG和canvas画图,js求数组最大最小值

    windows命令行的内容怎么复制,右键选择标记,选中内容后再点击鼠标右键就复制了. 安装Node.js后再用npm install命令会出现如下warn:saveError ENOENT: no s ...

  2. HTML静态网页--图片热点

  3. Python--day67--Django的路由系统

    原文:https://www.cnblogs.com/liwenzhou/articles/8271147.html Django的路由系统 Django 1.11版本 URLConf官方文档 URL ...

  4. zoj 2338 The Towers of Hanoi Revisited

    The Towers of Hanoi Revisited Time Limit: 5 Seconds Memory Limit: 32768 KB Special Judge You all mus ...

  5. java方法特点

    它可以实现独立的功能; 必须定义在类里面; 它只有被调用才会执行; 它可以被重复使用; 方法结束后方法里的对象失去引用; 如何定义一个功能,并通过方法体现出来: ① 明确该功能运算后的结果.明确返回值 ...

  6. python编程之操作系统基础

    操作系统发展史: 最早的计算机没有操作系统的概念:是使用打孔机和打孔卡片来进行计算的.只能一个一个处理. 后来产生了批处理系统,可以批量处理,进而加快计算的速度. 批处理系统:串行 数据处理速度加快 ...

  7. vue v-for循环中key属性的使用

    <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8&quo ...

  8. element ui 批量删除

    <el-table :data="tableData" stripe border style="width: 100%" @selection-chan ...

  9. H3C端口状态

  10. addEventListener() 方法,事件监听(去哪儿网用到过)

    addEventListener() 方法,事件监听 你可以使用 removeEventListener() 方法来移除事件的监听. 语法 element.addEventListener(event ...