前端时间在微信上上了一节曹政大佬的网课,讲的是关于信息安全的基础培训课。虽然上面说的是面向非技术岗位的安全常识培训和安全意识培养,不涉及具体的研发管理,但是一节课听了下来,作为一个研发人员,我觉得还是收获颇多。
虽然在平时的工作中,对于安全方面的知识和防护,会比非技术人员还要熟悉和了解,但是毕竟缺乏比较系统和全面的认知,刚好趁着这个机会,也好好重新梳理以下, 因此本篇文章更多的是作为一个课后的听后感,并且结合自己的经验的一个简单的总结,当然如果内容有涉及到侵权的话,那么请邮件联系我,或者在下方留言,我会删除掉涉及侵权的内容,并道歉。
还有就是对之前我写的一篇关于web安全的文章的进行再补充:web安全系列(1) - web 安全攻击和防护。
基础的东西我这边就不说了,主要还是介绍各种入侵和攻击行为的原理和基本防范常识。
- 彩虹库及密码碰撞
- 嗅探侦听
- 劫持,钓鱼
- 木马植入,蠕虫
- 拒绝服务
- SQL注入与跨站脚本
- 溢出攻击
- 架构耦合问题
1. 彩虹库及密码碰撞
至于什么是彩虹库,我觉得可以参照知乎的这一篇:什么是彩虹表,我觉得讲的还是比较清楚的,通俗来说就是就是一个很大的数据库,把常见加密方式的常用密码都做好密文,这样一旦能获得某些网站的数据库文件,就可以拿来做碰撞,看这些密文对应的明文是什么。但是他不是直接存储 密文 - 明文的hash映照,而是存放hash链集,然后根据计算去碰撞,最后得到明文。
而一个很典型的彩虹库就是 http://www.cmd5.com/ 而且支持多种算法,md5,sha1 等,实时查询记录超过24万亿条,成功率95以上。这个数字很可怕,这个意味着如果你的密码不够健壮的话,别人只要拿到你加密后的字符串,那么就可以通过这个反向查询出密码明文出来。
一个很典型的例子就是,为什么会有撞库的发生,其实基本上数据库存放的还是密码非对称加密后的hash密码。但是一旦这个库被黑客给拖了。黑客得到这个密文之后,通过彩虹库查询得到真正的密码明文。假设这个用户很多网站共用一个用户名和密码的话,黑客只要再去其他的网站,比如微博之类的,用同样的用户名和密码登陆之后,就有可能登陆进去了。
至于怎么防护:
- 添加随机salt,当然更好的办法就是再加上自己的算法,比如 md5+salt+自己的算法,这种杂揉的方式,这样就基本上很难被碰撞出来明文密码,因为没有一个彩虹库会去兼容你的算法,除非你的应用做的特别大
- 为了防护撞库攻击,那么就是加上验证码校验,因为基本都是攻击者通过脚本来模拟大量的登陆操作,因此如果有验证码的话,可以很大程度来防止脚本登陆。
- 对用户来说,设置高强度密码,防止拖库后彩虹库碰撞,同时做到一站一密,防止撞库攻击。
2. 嗅探侦听
简单来说就是你的信息在互联网传输中,被人截获信息。也叫嗅探攻击。一般嗅探攻击,都需要安装嗅探工具,嗅探工具就是在某一台电脑上安装一个窃听器,然后把附近电脑发送的信息截获下来,这个方法也通常被网管用于分析网络状况,而黑客则会使用这个方法,来窃取用户的资料,即使对方的电脑已经打了补丁,安装了防火墙和杀毒软件,也不能抵挡住嗅探攻击。
说到嗅探攻击其实它和我们使用的以太网的原理是有关的,我们传统的以太网,是使用技术手段,建立一个共享的网络通道,打个比方说就是,当甲的电脑要发送一个数据包给乙的时候,丙和丁也能接受到这样的数据包,并且丙和丁还可以查看数据包的MAC地址是谁,如果你自己的地址不符合就可以得到这个数据包或者不理会。这是建立这个基础的初衷,但现在又有很多的黑客,使用这个技术来窃取他人的信息。
举个例子,比如我在电脑上装来一个嗅探工具sniffer,这时候就会收到同一个局域网内的其他电脑的数据包,这时候如果是使用明文传输的协议,比如http之类的,那么是可以直接将里面的数据包直接抓出来,这时候你交互的信息,输入的密码,都可以被看到。
至于怎么防护:
- 尽可能使用安全加密的传输协议,能用ssl加密,就一定要加密
- 在不安全的网络环境,比如公共Wi-Fi,尽量不要登陆比较敏感的站点或者系统,比如跟钱有关系的
3. 劫持,钓鱼
一般我们所说的劫持,指的都是流量劫持,劫持其实有很多种,而且劫持可以从客户端的浏览器(浏览器插件劫持,主页配置劫持),到操作系统的配置文件(比如hosts文件),到内网的交换机(ARP欺骗),到dns服务(DNS劫持),到路由器, 再到服务端,等等这些环节都有可能出现劫持。
而且劫持的形态也是多种多样的,可以是域名的劫持,也可以是内容的替换。
常见的劫持有:
- DNS劫持
- CDN入侵
- 网关劫持
- ARP攻击
- Hub嗅探
- MAC地址欺骗
- 移动端劫持 - 假基站
其中DNS劫持又叫域名劫持,通过劫持掉域名的DNS解析结果,将HTTP请求劫持到特定IP上,使得客户端和攻击者的服务器建立TCP连接,而不是和目标服务器直接连接,这样攻击者可以对内容进行窃取或篡改。在极端的情况下甚至攻击者可能伪造目标网站页面进行钓鱼攻击。
如果劫持,再配合上钓鱼的话,那么就有可能造成严重的财产损失。
举个典型的dns劫持事件,就是用户访问的域名是正确的,但是进入了一个钓鱼网站,这个钓鱼网站跟原站几乎一摸一样,用户输入了正确的账号密码,然后黑客的程序就转走了用户的资产了。
至于怎么防护,其实真的很难防,各个环节都会可能会出现劫持的情况,想要彻底防范特别难:
- 使用加密协议传输数据,比如 https,因为SSL协议提供了对服务器的身份认证,所以DNS劫持导致连接错误服务器的情况将会被发现进而被终止,最终导致DNS挟持攻击无法实现;而SSL协议提供的数据加密和完整性校验,也解决了关键信息被嗅探以及数据内容被修改的问题。
- 设置安全的DNS
4.木马植入,蠕虫
木马(Trojan),也称木马病毒,是指通过特定的程序(木马程序)来控制另一台计算机。木马通常有两个可执行程序:一个是控制端,另一个是被控制端。
至于更详细的介绍,可以查看百度百科-木马病毒, 早期的邮件附件那些充满诱惑的文件,其实就是木马。
还有就是国内的某些下载站,里面有一些资源也都有被植入木马。前两年有一个可怕的案例就是,苹果Xcode编译器的木马植入事件,那时候国内所有的主流的互联网公司几乎都中招了。具体的这样的, 因为Xcode 的下载源在国外,再加上体积又大,导致在中国下载特别慢,那时候很多的国内程序员就从迅雷那边下载,结果迅雷下的这个版本是被植入木马的版本,然后他们的产品代码没问题,用这个编译器编译之后,木马就被植入进去了,而且苹果也没有发现,就这样发布出去了。后来终于被互联网公司分析出来了,还好没有造成大损失,不然苹果估计得血崩。所以木马的来源不仅仅是别人给你的文件,还包含你从其他地方下载的不明来源的软件和文件。
如果说木马是隐藏在正常文件和软件的恶性代码,那么蠕虫则是指传播形式,借助宿主或主动搜索传播。
蠕虫病毒是一种常见的计算机病毒。它是利用网络进行复制和传播,传染途径是通过网络和电子邮件。最初的蠕虫病毒定义是因为在DOS环境下,病毒发作时会在屏幕上出现一条类似虫子的东西,胡乱吞吃屏幕上的字母并将其改形。蠕虫病毒是自包含的程序(或是一套程序),它能传播自身功能的拷贝或自身的某些部分到其他的计算机系统中(通常是经过网络连接)。 具体看百度百科 – 蠕虫病毒
所谓的主动传播,其实就是他会利用你的网络去扫描附近的机器,看是不是开了特定的服务,然后利用漏洞把自己和木马植入进去。所以现在很多的木马病毒的传播,真的不需要用户去操作什么,它就可以让你感染到。
至于怎么防护:
- 不要打开来源不清楚的文件或附件
- 对外来的u盘要做一些安全防范,比如安全工具检测之类的
- 电脑安全补丁要及时升级
- 常见的工具,一定要从源站点下载,如果是从第三方下载站下的,也要去源站点中对应版本的md5值进行核对,防止被植入木马
还有就是这边要注意的一点就是: 非源地址下载的软件,如果被植入了木马和后门,大多数情况下,杀毒软件和安全工具都没法识别出来!!!
5.拒绝服务 DOS
拒绝服务攻击即是攻击者想办法让目标机器停止提供服务,是黑客常用的攻击手段之一。其实对网络带宽进行的消耗性攻击只是拒绝服务攻击的一小部分,只要能够对目标造成麻烦,使某些服务被暂停甚至主机死机,都属于拒绝服务攻击。拒绝服务攻击问题也一直得不到合理的解决,究其原因是因为网络协议本身的安全缺陷,从而拒绝服务攻击也成为了攻击者的终极手法。攻击者进行拒绝服务攻击,实际上让服务器实现两种效果:一是迫使服务器的缓冲区满,不接收新的请求;二是使用IP欺骗,迫使服务器把非法用户的连接复位,影响合法用户的连接。更多直接查看百度百科 - 拒绝服务
举个例子就是:你开了一家餐馆,一群人占着位置不点餐也不走,你的客人就没有办法进来,你是生意就做不下去了。
拒绝服务分为很多种:
1. 基于协议层,比如 syn flood
SYN Flood是当前最流行的DoS(拒绝服务攻击)与DDoS(Distributed Denial Of Service分布式拒绝服务攻击)的方式之一,这是一种利用TCP协议缺陷,发送大量伪造的TCP连接请求,使被攻击方资源耗尽(CPU满负荷或内存不足)的攻击方式。
举个例子就是:你发现今天排号的人很多,手中的号都发出去了还不够,但是当你请他们来入座的时候,却发现叫不到人,留的电话都是假的。
2. 基于负载能力的
比如连通性攻击指用大量的连接请求冲击计算机,使得所有可用的操作系统资源都被消耗殆尽,最终计算机无法再处理合法用户的请求。
举个例子就是:来了一堆客人,也入桌了,点菜了,你厨师去忙活了,结果客人借尿遁跑了。
常见的CC就是充分利用了这个特点,模拟多个用户(多少线程就是多少用户)不停的进行访问(访问那些需要大量数据操作,就是需要大量CPU时间的页面).这一点用一个一般的性能测试软件就可以做到大量模拟用户并发。
3. 基于网络传输层的
带宽攻击指以极大的通信量冲击网络,使得所有可用网络资源都被消耗殆尽, 最后导致合法的用户请求无法通过。
举个例子就是:你发现今天没客人,出去门口一看,门口的路出车祸路,全部被堵死路,客人过不来路。
常见的 UDP flood 就是,攻击者利用简单的TCP/IP服务,如Chargen和Echo来传送毫无用处的占满带宽的数据。通过伪造与某一主机的Chargen服务之间的一次的UDP连接,回复地址指向开着Echo服务的一台主机,这样就生成在两台主机之间存在很多的无用数据流,这些无用数据流就会导致带宽的服务攻击。
至于怎么防护:
- 有效完善的设计
- 带宽限制
- 及时给系统安装补丁
- 运行尽可能少的服务
- 只允许必要的通信
- 封锁敌意IP地址
- 安装入侵检测系统
6.SQL注入与跨站脚本
跨站脚本又分为XSS 和 CSRF,同 SQL注入一样是属于 web 安全攻击的,我的另一篇文章:web安全系列(1) - web 安全攻击和防护 有比较详细的描述和防护,这边就不细说了。
SQL注入主要的原因是应用开发工程师没有对用户交互内容做校验,并直接将相关内容插入到查询语句,而被入侵者精心构造的字符串修改了查询逻辑,获得更高的权限,或者更可怕的是,改写,删除关键数据,关键数据表,甚至是通过数据库的进程进入系统层面,获得服务端系统控制权。
跨站脚本和SQL有一点逻辑是一样的,都是对用户交互的信息没有做足够的确认和校验。但和SQL注入最大的区别是,SQL注入发生于服务端应用脚本数据库的处理,而跨站脚本往往发生于客户端的脚本执行。在跨站脚本中,最出风头的是XSS攻击。
举个跨站脚本的例子:比如说有个留言板,你可以输入内容,别人可以看到内容,这似乎没什么不对的,但如果服务端没有对你输入的内容做任何处理,而直接输出到客户端展示,那么当黑客精心构造一些内容的时候,就存在一个这样的可能,这个内容其实是一段可以在浏览器执行的代码,比如js, 这时候别人一浏览这个留言板,那么就会执行这一段脚本,而这段代码执行的结果,比如自动跳转到一个钓鱼网站,那么你在A网站打开一个帖子,突然跳转到一个B网站,但是页面风格和A一模一样,域名也看不出区别,然后说你登陆过期了,让你重新输入账号密码,于是你的账号密码就被偷了,或者更粗暴的是,直接将你本地的cookie截获,然后发送到黑客控制的服务器,然后黑客再利用这个cookie登陆你在A网站的账号,这样你的账号就被偷了。
还有就是基于上面的基础,XSS还可以以蠕虫的形式传播,当他得到你的账号之后,就可以以你身份,向其他站内人发送消息,这样子就会传播开来。
7.缓冲区溢出攻击
缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上。理想的情况是:程序会检查数据长度,而且并不允许输入超过缓冲区长度的字符。但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区,又被称为“堆栈”,在各个操作进程之间,指令会被临时储存在“堆栈”当中,“堆栈”也会出现缓冲区溢出。具体可以看百度百科-溢出攻击
如果这是一个无意识的覆盖,系统就会抛出一个溢出错误,用户就会发现遇到了一个系统崩溃的提示。本地系统可能就是蓝屏,core dump,远程可能也会出现一个异常崩溃的提示,不同系统提示可能不同。如果有人利用栈中分配的缓冲区写溢出,悄悄地将一段恶意代码的首地址,作为返回地址覆盖写到原先的正确的返回地址处。那么程序在执行的时候会悄悄地转移到这个恶意代码段处执行,从而可以轻易获得系统特权,进而进行各种非法操作,造成缓冲区溢出的原因就是系统没有对作为缓冲区的数组进行越界检查。
缓冲溢出攻击目前依然是很多安全专家主攻的方向,漏洞挖掘产业和地下漏洞交易市场,里面有很高比例都是可以被用来实现溢出攻击的高危安全漏洞。对研发来说,其实最核心的依然是,对交互信息的严格校验和控制。
至于怎么防护,普通用户没有什么防御手段,这个主要是入侵服务端和系统层面的。
8.架构耦合问题
这个安全攻击网上找不到比较完整的资料,以下的内容大部分摘抄自曹政大大在网课上的内容:
什么是架构耦合问题呢,就是我们现在使用一些服务,一些典型的应用场景,并不是针对单一服务,单一应用去使用,可能有很多不同的应用,不同的服务,不同的产品组合提供给我们来使用,从每个单一产品或应用来说,可能从它的业务逻辑来说,是没有什么安全问题的,但是组合在一起,面对更复杂的业务目标和诉求的时候,可能就出现设计者意想不到的问题了。
举个比较经典的例子:说来15年以前的事情了。当时windows操作系统的中文版本,绿盟科技发现一个安全漏洞,不管你怎么设置口令,都可以不通过账号密码登陆操作系统,获得系统权限。在登陆界面,由于存在中文账户,是有中文输入法的,也就是可以加载默认的中文输入法。那么中文输入法里面,有个链接,叫做帮助。你点了帮助,会看到很多不同的内容,其中部分内容是远程链接,比如一些远程的参考资料,点击后,会加载浏览器,当然,也许你电脑还没有联网,那么加载浏览器也出现无法链接,这不重要,关键是,浏览器开启了。然后你在浏览器地址栏输入系统盘符c:\,嗯,你看到了整个目录和文件,然后,你已经可以为所欲为了,如果你对windows的各种系统文件熟悉的话。这就是一个典型的架构耦合问题,这些组合在一起,问题就出现了。
架构耦合很重要的一个安全提示,其实主要是关于社交信息和一些信息泄露的话题,很多信息可能你觉得单独放在那里是不敏感,不危险的,但是如果有些不同类型的这种信息组合一起,可能就会带来非常危险的境地。
以上是属于入侵的方式,当然还有一些是属于安全隐患的类型,比如:
- 云泄露及云穿透
- 社交工程及隐私安全
- 智能硬件的常见问题
这边就不细说了,本篇只要是讨论信息安全的入侵方式和防范。
参考的一些资料:
什么是流量劫持,如何防止流量劫持?
嗅探攻击入侵局域网