2014年4月7号被曝光的“心脏滴血”漏洞,就是很好的证明。黑客可以利用该漏洞对后台的网站服务器进行攻击,每次最多可以获取服务器中的64KB数据(每KB包含1024个字符),这样持续攻击,就能获取源码、用户http原始请求、用户cookie甚至明文帐号密码等敏感信息。全世界大概有三分之一的网站受影响,包括我们常用的淘宝、京东、网易邮箱,中国银联等。
同学们肯定很好奇,这个漏洞到底是怎么造成的?
说起来其实很简单!
我们用手机或者电脑上网时,首先要和网站后台服务器建立联系,建立联系的过程就是发一串字符过去,然后后台服务器收到以后再把字符返回来,这样一来一回就可以建立连接了。就像走在路上,碰到个熟人,我们会跟对方打招呼,说“hello”,对方也会回 “hello”。
听起来没啥问题,你发啥我回啥,能有啥问题,对吧
接下来我们看具体实现。
具体实现的时候,客户端(我们上网的设备统称客户端)会发两个要素给服务器,一个是长度,一个是实际发送的字符信息;服务器收到后呢,根据长度再把收到的数据发回去。
到这里,同学们有没有发现什么不对的地方?
有同学可能发现了,如果长度和实际发送的字符信息长度不一致怎么办?
比如实际我实际发了hello,5个字符,但是我长度标注1000,这样会发生什么?
服务器除了把我发的5个字符返给我,另外还会多返给我995个字符。
这样循环不停的操作,总能找到一些有用的信息。网站的信息就这样泄漏了!
那这个坑怎么填上呢?
也很简单!服务器判断一下收到的实际字符长度,收到0个不回,收到非0个的,按实际长度回。
这个例子就是前面我们介绍霸哥(bug)的时候提到的“设计缺陷”。如果设计方案不够周全、安全性可靠性考虑不周全,在特定的执行逻辑下就会暴露错误。同学们我们不管是编程还是任何小事,都要多思考,考虑周全,不给自己和别人挖坑留漏洞。
扫码参与评论与作者和更多用户交互