责编 | 屠敏
上面这个段子估计很多朋友都看过,程序员被黑过无数次,在其他人眼中,仿佛我们须要写得了木马,翻得了围墙,修得了电脑,找得到资源,但凡是跟打算机沾点边的,咱都得会才行。
段子归段子,言归正传,对付咱们程序员来说,多多少少理解一些信息安全的技能知识还是大有裨益的,不仅能理解一些打算机和网络的底层事理,也能反哺我们的开拓事情,带着安全思维编程,减少漏洞的产生。

信息安全大体可分为三个大的分支:
网络安全
系统安全
密码学
下面轩辕君就这三个领域分别罗列一些常用的黑客技能,部分技能是存在领域交叉的,就将其划入紧张那个种别里去了。
网络安全
▐ SQL注入
Web安全三板斧之首,大名鼎鼎的SQL注入。
SQL注入攻击的核心在于让Web做事器实行攻击者期望的SQL语句,以便得到数据库中的感兴趣的数据或对数据库进行读取、修正、删除、插入等操作,达到其邪恶的目的。
而如何让Web做事器实行攻击者的SQL语句呢?SQL注入的常规套路在于将SQL语句放置于Form表单或要求参数之中提交到后端做事器,后端做事器如果未做输入安全校验,直接将变量取出进行数据库查询,则极易中招。
举例如下:
对付一个根据用户ID获取用户信息的接口,后真个SQL语句一样平常是这样:
select name,[...] from t_user where id=$id
个中,$id便是前端提交的用户id,而如果前真个要求是这样:
GET xx/userinfo?id=1%20or%201=1
个中要求参数id转义后便是1 or 1=1,如果后端不做安全过滤直接提交数据库查询,SQL语句就变成了:
select name,[...] from t_user where id=1 or 1=1
其结果是把用户表中的所有数据全部查出,达到了黑客透露数据的目的。
以上只是一个极大略的示例,在真实的SQL注入攻击中参数布局和SQL语句远比这繁芜得多,不过事理是同等的。
防御手段:对输入进行检测,阻断带有SQL语句特色对输入
重点关注:前端工程师、Web后端工程师
▐ XSS攻击
Web安全三板斧之二,全称跨站脚本攻击(Cross Site Scripting),为了与重叠样式表CSS区分,换了另一个缩写XSS。
XSS攻击的核心是将可实行的前端脚本代码(一样平常为JavaScript)植入到网页中,听起来比较拗口,用大口语说便是攻击者想让你的浏览器实行他写的JS代码。那如何办到呢?一样平常XSS分为两种:
反射型
1、攻击者将JS代码作为要求参数放置URL中,勾引用户点击 示例:
http://localhost:8080/test?name=<script>alert(\"大众you are under attack!\"大众)</script>
2、用户点击后,该JS作为要求参数传给Web做事器后端
3、后端做事器没有检讨过滤,大略处理后放入网页正文中返回给浏览器
4、浏览器解析返回的网页,中招!
存储型
上述办法攻击脚本直接包办事器转手后返回浏览器触发实行,存储型与之的差异在于能够将攻击脚本入库存储,在后面进行查询时,再将攻击脚本渲染进网页,返回给浏览器触发实行。常见的套路举例如下:
1、攻击者网页回帖,帖子中包含JS脚本
2、回帖提交做事器后,存储至数据库
3、其他网友查看帖子,后台查询该帖子的回帖内容,构建完全网页,返回浏览器
4、该网友浏览器渲染返回的网页,中招!
防御手段:前后端均须要做好内容检测,过滤掉可实行脚本的侵入
重点关注:前端工程师、Web后端工程师
▐ CSRF攻击
Web安全三板斧之三,攻击示意图如下:
核心思想在于,在打开A网站的情形下,其余打开Tab页面打开恶意网站B,此时在B页面的“指导”下,浏览器发起一个对网站A的HTTP要求。这个过程的危害在于2点:
1、这个HTTP要求不是用户主动意图,而是B“指导的”,如果是一个危害较大的要求操作(发邮件?删数据?等等)那就麻烦了
2、由于之前A网站已经打开了,浏览器存有A下发的Cookie或其他用于身份认证的信息,这一次被“指导”的要求,将会自动带上这些信息,A网站后端分不清楚这是否是用户真实的意愿
重点关注:前端工程师、Web后端工程师
▐ DDoS攻击
DDoS全称Distributed Denial of Service:分布式谢绝做事攻击。是谢绝做事攻击的升级版。谢绝攻击做事顾名思义,让做事不可用。常用于攻击对外供应做事的做事器,像常见的:
Web做事
邮件做事
DNS做事
即时通讯做事
......
在早期互联网技能还没有那么发达的时候,发起DoS攻击是一件很随意马虎的事情:一台性能强劲的打算机,写个程序多线程不断向做事器进行要求,做事器应接不暇,终极无法处理正常的要求,对别的正常用户来说,看上去网站貌似无法访问,谢绝做事便是这么个意思。
后来随着技能对发展,现在的做事器早已不是一台做事器那么大略,你访问一个www.baidu.com的域名,背后是数不清的CDN节点,数不清的Web做事器。
这种情形下,还想靠单台打算机去试图让一个网络做事满载,无异于鸡蛋碰石头,对方没趴下,自己先趴下了。
技能从来都是一柄双刃剑,分布式技能既可以用来供应高可用的做事,也能够被攻击方用来进行大规模杀伤性攻击。攻击者不再局限于单台打算机的攻击能力,转而通过成规模的网络集群发起谢绝做事攻击。
谢绝做事攻击实际上是一类技能,根据详细履行手段的不同,又可以进一步细分:
SYN Flood
ICMP Flood
UDP Flood
......
防御手段:即便是到现在,面对DDoS也没有100%打包票的防御方法,只能靠一些缓解技能一定层面上减轻攻击的威力。这些技能包括:流量洗濯、SYN Cookie等等。
重点关注:运维工程师、安全工程师
▐ DNS挟制
当今互联网流量中,以HTTP/HTTPS为主的Web做事产生的流量霸占了绝大部分。Web做事发展的风起云涌,这背后离不开一个默默无闻的大元勋便是域名解析系统:
如果没有DNS,我们上网须要影象每个网站的IP地址而不是他们的域名,这切实其实是灾害,好在DNS默默在背后做了这统统,我们只须要记住一个域名,剩下的交给DNS来完成吧。
也正是由于其主要性,别有用心的人自然是不会放过它,DNS挟制技能被发明了出来。
DNS供应做事用来将域名转换成IP地址,然而在早期协议的设计中并没有太多考虑其安全性,对付查询方来说:
我去要求的真的是一个DNS做事器吗?是不是别人伪装的?
查询的结果有没有被人修改过?这个IP真是这个网站的吗?
DNS协议中没有机制去担保能回答这些问题,因此DNS挟制征象非常泛滥,从用户在地址栏输入一个域名的那一刻起,一起上的凶险防不胜防:
本地打算机中的木马修正hosts文件
本地打算机中的木马修正DNS数据包中的应答
网络中的节点(如路由器)修正DNS数据包中的应答
网络中的节点(如运营商)修正DNS数据包中的应答
......
后来,为了在客户端对收到对DNS应答进行校验,涌现了DNSSEC技能,一定程度上可以办理上面的部分问题。但限于一些方面的缘故原由,这项技能并没有大规模用起来,尤其在海内,鲜有支配运用。
再后来,以阿里、腾讯等头部互联网厂商开始推出了httpDNS做事,来了一招釜底抽薪,虽然这项技能的名字中还有DNS三个字母,但实现上和原来但DNS已经是大相径庭,通过这项技能让DNS变成了在http协议之上的一个运用做事。
重点关注:安全工程师、后端工程师、运维工程师
▐ TCP挟制
TCP是TCP/IP协议族中非常主要的成员,位于传输层。协议本身并没有对TCP传输的数据包进行身份验证,以是我们只要知道一个TCP连接中的seq和ack后就可以很随意马虎的假造传输包,假装任意一方与另一方进行通信,我们将这一过程称为TCP会话挟制(TCP Session Hijacking)
TCP挟制技能是一种很老的技能,1995年被提出来后深受黑客青睐。不过近些年来,随着操作系统层面的安全机制增强和防火墙软件的检测能力提升,这种根本的攻击办法越来越随意马虎被创造,逐步的淡出了人们的视野。
重点关注:安全工程师、运维工程师
▐ 端口扫描技能
端口扫描是黑客常常利用的一种技能,它一样平常是作为网络攻击的前期阶段,用于探测目标开启了哪些做事,以便接下来发起针对该做事的攻击。
记得刚刚学习网络安全的时候,大家总会没事拿出工具来扫一扫,虽然扫了之后就没有了下文,也总是乐此不疲,在不懂的人面前秀一把自己的“黑客”能力。
以TCP/IP协议族构建的互联网,网络做事总是离不开端口这个观点,不管是TCP也好,UDP也罢,运用层都须要一个端口号来进行网络通信。而我们常见的做事端口有:
21: FTP文件传输做事
25: SMTP邮件做事
53: DNS域名解析系统做事
80: HTTP超文本传输协议做事
135: RPC远程过程调用做事
443: HTTPS
3389: MSRDP微软远程桌面连接做事
......
端口扫描都事理,对付基于UDP的做事,发送对应做事都要求包,查看是否有应答;对付基于TCP的做事,考试测验发起三次握手发送TCP SYN数据包,查看是否有应答。
如果远端做事器进行了相应,则表明对端做事器上运行了对应的做事,接下来则是进一步探知对端做事器利用的操作系统、运行的做事器程序类型、版本等等,随即针对对应的漏洞程序发起网络攻击。
由此可见,为安全着想,在互联网上应该尽可能少暴露信息,关闭不须要的做事端口。
防御手段:利用防火墙等安全产品,即时创造和阻断造孽的扫描探测行为。
重点关注:运维工程师、安全工程师
系统安全
系统安全版块中的技能,一样平常是指攻击发生在终端之上,与操作系统息息相关。
▐ 栈溢出攻击
栈溢出攻击历史悠久,也是发生在系统侧最根本的攻击。
当代打算机基本上都是建立在冯-诺伊曼体系之上,而这一体系有一个最大的问题便是数据和指令都保存在存储器中。
在打算机的内存中,既包含了程序运行的所有代码指令,又包含了程序运行的输入输出等各种数据,并没有一种逼迫的机制将指令和数据区分。由于对付打算机来说它们都是一样的二进制0和1,大部分时候都是靠程序按照既定的“规则”去阐明理解内存中的这些0和1。而一旦这些“规则”理解缺点,事情就变得糟糕起来。
详细到我们当代CPU和OS,不管是x86/x64处理器,还是ARM处理器,均采取了寄存器+堆栈式的设计,而这个堆栈中,既包含了程序运行各个函数栈帧中的变量数据等信息,还保存了函数调用产生的返回地址。
所谓栈溢出攻击,则是通过一些手段输入到栈中的缓冲区中,冲破缓冲区原有的界线,将存储返回地址的位置覆盖为一个数值,使其指向攻击者提前支配的恶意代码位置,挟制了程序的实行流程。
防御手段:当代操作系统针对栈溢出攻击已经有非常成熟的应对方案,像Linux平台的Stack Canary,Windows平台的GS机制等等,程序员须要做的便是充分利用这些机制。
重点关注:C/C++工程师
▐ 整数溢出攻击
和栈溢出攻击一样,整数溢出攻击也是属于溢出类攻击,不一样的是溢出的目标不是栈中的缓冲区,而是一个整数。
我们知道,打算机数值以补码的办法表示和存储。在表示一个有符号数时,最高位是用来表示这是一个正数(0)还是一个负数(1),比如对付一个16位的short变量而言,+1和-1的表示方法如下:
+1: 0000 0000 0000 0001-1: 1111 1111 1111 1111
一个16位的short变量表示的范围是-32768~32767,现在思考一个问题,如果一个short变量的值现在是32767:
32767: 0111 1111 1111 1111
如果现在对其实行+1操作,将变成:
1000 0000 0000 0000
而这正是-32768的补码形式!
试想一下,如果这个变量名字叫length作为strcpy参数,或是叫index作为数组的下标,整数的溢出将导致恐怖的后果,轻则进程崩溃,做事宕机,重则远程代码实行,拿下掌握权。
重点关注:所有程序员
▐ 空指针攻击
空指针一样平常涌如今指针没有初始化,或者利用new进行工具创建/内存分配时失落败了,而粗心的程序员并没有检讨指针是否为空而进行访问导致的攻击。
大多数情形下,这将导致内存地址访问非常,程序会崩溃退出,造成谢绝做事的征象。
而在一些分外的情形下,部分操作系统许可分配内存起始地址为0的内存页面,而攻击者如果提前在该页面准备好攻击代码,则可能涌现实行恶意代码的风险。
▐ 开释后利用攻击
开释后利用Use After Free意为访问一个已经开释后的内存块。较多的涌如今针对浏览器的JavaScript引擎的攻击中。
正常情形下,一个开释后的工具我们是没法再访问的,但如果程序员粗心大意,在delete工具后,没有即时对指针设置为,在后续又连续利用该指针访问工具(比如通过工具的虚函数表指针调用虚函数),将涌现内存访问非常。
在上面的场景中,如果攻击者在delete工具后,立时又new一个同样内存大小的工具,在当代操作系统的堆内存管理算法中,会有很大概率将这个新的工具放置于刚刚被delete的工具的位置处。这个时候还通过原来工具的指针去访问,将涌现鸠占鹊巢,涌现恐怖的后果。
养成好的编程习气,工具delete后,指针及时置空。
重点关注:C/C++工程师
▐ HOOK
HOOK原意钩子的意思,在打算机编程中时常用到,用来改变原有程序实行流程。
在那个互联网充斥着泼皮软件的年代,盛行着一种键盘记录器的木马,用于记录用户键盘的输入,从而盗取密码,这个中QQ曾经是重灾区。
而实现这一功能的技能便是用到了HOOK技能,钩到了键盘敲击的事宜。
除了HOOK,用得更多的是程序实行流程层面的HOOK。恶意代码被注入目标程序后,在函数入口处添加跳转指令,导致实行到此处的线程转而实行攻击者的代码,实现修正参数、过滤参数的目的。
HOOK技能不仅为黑客利用,安全软件用的更多,安全软件须要守护全体系统的安全防线,通过HOOK技能在各处敏感API处设立检讨,从而抵御造孽调用攻击行为。
其余,软件补丁技能中也时常用到HOOK技能,软件厂商创造原来程序漏洞后,通过HOOK,修正既有程序的实行逻辑,从而达到修复漏洞的目的。
重点关注:C/C++工程师
▐ 权限提升
当代操作系统都对运行于个中的进程、线程供应了权限管理,由于安全攻击无可避免,而权限的限定造为一道颇为有效的樊篱将程序被攻击后的影响减少到最小。
换句话说,即便我们的程序由于漏洞缘故原由被攻击实行了恶意代码,但由于操作系统的权限掌握,恶意代码能干的事情也有限。
就像一枚硬币总有两个面,有权限限定,自然而然就有权限提升。攻击者想要做更多事情,就得打破操作系统的限定,获取更高的权限。
在Windows上,常常叫得到管理员权限。
在Linux上,常常叫得到Root权限,手机Root也是这个意思。
在iOS上,常常叫“越狱”。
权限提升的办法五花八门,总体来说,程序实行的时候,所属进程/线程拥有一个安全令牌,用以标识其安全等级,在访问资源和实行动作的时候由操作系统内核审核。
权限提升的目标便是将这个安全令牌变动为高档级的令牌,使其在后续访问敏感资源和实行敏冲动作时,凭借该令牌可以通过系统的安全审核。
而变动这个安全令牌的惯用伎俩便是利用操作系统内核漏洞(如前面所述的栈溢出、整数溢出、开释后利用等)实行攻击者的代码,实现安全令牌的修改。
重点关注:安全工程师
▐ 可信打算
安全攻击无处不在,不仅运用程序的环境不可靠,乃至连操作系统内核的环境也充满了风险。
如果一段程序(比如支付)必须在一个极度绝密的环境下实行,该怎么办?
可信打算的观点被安全研究者提了出来,根据百科的阐明:
可信打算/可信用打算(Trusted Computing,TC)是一项由可信打算组(可信打算集群,前称为TCPA)推动和开拓的技能。可信打算是在打算和通信系统中广泛利用基于硬件安全模块支持下的可信打算平台,以提高系统整体的安全性 [1] 。签注密钥是一个2048位的RSA公共和私有密钥对,它在芯片出厂时随机天生并且不能改变。这个私有密钥永久在芯片里,而公共密钥用来认证及加密发送到该芯片的敏感数据。
可信打算中一个非常主要的观点是可信实行环境TEE(Trusted Execution Environment),大略来说便是在现有的打算机内部的天下里,再构建一个秘密基地,专门用于运行极度机密的程序。该秘密基地乃至连操作系统都轻易无法访问,更别说操作系统之上的运用程序了。
在移动端,ARM芯片霸占了主流市场,ARM芯片供应了名为TrustZone技能的技能,在硬件层面新增一个可信打算环境,包含一个可信OS,和一些可信APP,和普通环境在硬件层面隔离,处理器内部进行通信完成两个天下的交互。
重点关注:终端系统工程师
密码学
由于数据传输的过程中会碰着信息泄露、修改、假造的风险,加密技能应运而生。
▐ 对称加密 & 非对称加密
有加密就有解密,根据加密过程利用的密钥和解密过程利用的密钥是否相同,将加密算法分为了两个大类:对称加密和非对称加密。
最早涌现的加密技能是对称加密
对称加密:加密密钥和解密密钥同等,特点是加密速率快、加密效率高。常用的对称加密算法有:
DES
AES
RC4
这种加密办法中有一个非常关键的问题是,解密方须要拿到密钥才能进行解密,而密钥钥匙通过网络传输又会面临不屈安的风险,这成了一个鸡生蛋,蛋生鸡的问题。
于是通信技能上一个划时期的技能被发明了出来,这就是非对称加密!
非对称加密:加密密钥与解密密钥不一致,特点是算法较繁芜,但安全性高。非对称加密的密钥一样平常分为公钥和私钥,公钥公开,私钥需保密。常用于数字认证,如HTTPS中握手阶段的做事器认证。常用的非对称加密算法有:
RSA
DH
ECC(椭圆曲线加密)
可以绝不夸年夜的说,没有了非对称加密,互联网绝不会发展到本日这样的高度。
▐ 秘钥交流技能
在互联网通信中,有加密就有解密,解密自然就须要密钥,那如何把这个密钥见告对方呢?密钥交流算法便是要办理这个问题:如何安全的将密钥传输给对方?
转头看看上面提到的非对称加密,它就可以办理这个问题:
做事器卖力天生一对公私钥,公钥见告客户端,私钥自己保存
客户端拿到公钥后,利用它来对后续通信将要利用的对称加密算法密钥进行加密传输
做事端收到后利用私钥解密,拿到这个密钥
往后双方可以通过对称加密进行传输通信
上面这个例子并不但是举例,在早期版本的HTTPS中,便是通过这种办法来进行密钥交流。而后来的版本中,其余一种叫DH及其变种的密钥交流算法用的越来越多。
DH全称Diffie-Hellman,是两位数学家的名称构成,这种算法的核心是完备依赖数学运算实现密钥的交流。
▐ 信息择要算法
信息择要算法实在不算是一种加密算法,加密的条件是可以通过解密还原,而信息择要算法的目的并不是对数据进行保护,也无法解密还原。
在一些语境下,信息择要我们听得少,听的更多的名词是哈希
信息择要算法的目的之一是校验数据的精确性,算法公开,数据通过该算法得出一个择要值,收到数据后通过该算法打算出这个择要,前后比拟就知道是否有被修改。
常用的信息择要算法有:
MD5
SHA1
SHA256
▐ 数据编码技能
严格来说,数据编码技能也不算是加密算法,由于其目的同样不是为了加密,而只是为了将数据编码以便传输。
最常见的编码算法便是base64了,多用于编码二进制的数据,将不可见的字符编码后转换成64个常见字符组成的文本,便于打印、展示、传输、存储。如邮件eml格式中,将附件文件通过base64编码。
除了base64,还有常用于比特币钱包地址编码的base58。base家族还有base85、base92、base128等浩瀚算法。它们的差异不仅仅在于参与编码的字符集不同,算法实行也是各有千秋。
▐ 多因子认证技能
说到认证,最常涌现的莫过于登录、支付等场景。传统的认证技能便是密码技能,但随着网络攻击的日益专横獗以及互联网渗透到人们生活的方方面面,传统密码技能的安全性不敷以知足互联网的发展。
多因子认证技能意为在传统密码认证之外,引入其他认证技能进行补充,利用2种及以上的办法共同完成认证。随着人工智能技能的发展,基于生物特色的认证技能突飞年夜进:
指纹认证
虹膜认证
人脸识别
......
这个天下从来不缺先行者,多因子认证看上去很繁芜,好在已经有不少头部企业搭建了认证平台,对付绝大多数企业,须要做的只是下载SDK,调用API而已。
目前国内外主流的多因子认证平台有三大派系:
FIDO,国际标准,在海内,翼支付、百度钱包、京东钱包、微众银行等都已经运用
IFAA,阿里系,凭借阿里在电商领域的上风,也吸引了浩瀚追随者。
TUSI,腾讯系
总结
本文罗列了一些常见的信息安全技能,紧张分网络安全、系统安全和密码学三个领域展开。
信息安全技能不仅仅是安全工程师的事情,作为一位程序员,理解这些技能将帮助我们更好的Build The World!
知识在于分享,欢迎转发这篇文章,让更多的人看到。