听说你是程序员,可以帮我盗个QQ号吗?
听说你是程序员,可以帮我盗个 QQ 号吗?这个段子估计很多朋友都看过,程序员被黑过无数次。
在其他人眼中,仿佛我们需要写得了木马,翻得了围墙,修得了电脑,找得到资源,但凡是跟计算机沾点边的,咱都得会才行。
段子归段子,言归正传,对于咱们程序员来说,多多少少了解一些信息安全的技术知识还是大有裨益的,不仅能了解一些计算机和网络的底层原理,也能反哺我们的开发工作,带着安全思维编程,减少漏洞的产生。
- 网络安全
- SQL注入
- XSS攻击
- CSRF攻击
- DDoS攻击
- DNS劫持
- TCP劫持
- 端口扫描技术
- 系统安全
- 栈溢出攻击
- 整数溢出攻击
- 空指针攻击
- 释放后使用攻击
- HOOK
- 权限提升
- 可信计算
- 密码学
- 对称加密 & 非对称加密
- 秘钥交换技术
- 信息摘要算法
- 数据编码技术
- 多因子认证技术
信息安全大体可分为三个大的分支:
网络安全
系统安全
密码学
下面我就这三个领域分别罗列一些常用的黑客技术,部分技术是存在领域交叉的,就将其划入主要那个类别里去了。
网络安全
①SQL 注入
SQL 注入攻击的核心在于让 Web 服务器执行攻击者期望的 SQL 语句,以便得到数据库中的感兴趣的数据或对数据库进行读取、修改、删除、插入等操作,达到其邪恶的目的。
select name,[...] from t_user where id=$id
GET xx/userinfo?id=1%20or%201=1
select name,[...] from t_user where id=1 or 1=1
其结果是把用户表中的所有数据全部查出,达到了黑客泄露数据的目的。
防御手段:对输入进行检测,阻断带有 SQL 语句特征对输入。
重点关注:前端工程师、Web 后端工程师。
②XSS 攻击
XSS 攻击的核心是将可执行的前端脚本代码(一般为 JavaScript)植入到网页中,听起来比较拗口,用大白话说就是攻击者想让你的浏览器执行他写的 JS 代码。
反射型如上图:
攻击者将 JS 代码作为请求参数放置 URL 中,诱导用户点击,示例:
http://localhost:8080/test?name=<script>alert("you are under attack!")</script>
用户点击后,该 JS 作为请求参数传给 Web 服务器后端。
后端服务器没有检查过滤,简单处理后放入网页正文中返回给浏览器。
浏览器解析返回的网页,中招!
存储型如上图:上述方式攻击脚本直接经服务器转手后返回浏览器触发执行,存储型与之的区别在于能够将攻击脚本入库存储,在后面进行查询时,再将攻击脚本渲染进网页,返回给浏览器触发执行。
常见的套路举例如下:
攻击者网页回帖,帖子中包含 JS 脚本
回帖提交服务器后,存储至数据库
其他网友查看帖子,后台查询该帖子的回帖内容,构建完整网页,返回浏览器
该网友浏览器渲染返回的网页,中招!
防御手段:前后端均需要做好内容检测,过滤掉可执行脚本的侵入。
重点关注:前端工程师、Web 后端工程师。
③CSRF 攻击
核心思想在于,在打开 A 网站的情况下,另开 Tab 页面打开恶意网站 B,此时在 B 页面的“唆使”下,浏览器发起一个对网站 A 的 HTTP 请求。
这个过程的危害在于两点:
这个 HTTP 请求不是用户主动意图,而是 B“唆使的”,如果是一个危害较大的请求操作(发邮件?删数据?等等)那就麻烦了。
因为之前 A 网站已经打开了,浏览器存有 A 下发的 Cookie 或其他用于身份认证的信息,这一次被“唆使”的请求,将会自动带上这些信息,A 网站后端分不清楚这是否是用户真实的意愿。
重点关注:前端工程师、Web 后端工程师。
④DDoS 攻击
常用于攻击对外提供服务的服务器,像常见的:
Web 服务
邮件服务
DNS 服务
即时通讯服务
......
在早期互联网技术还没有那么发达的时候,发起 DoS 攻击是一件很容易的事情:一台性能强劲的计算机,写个程序多线程不断向服务器进行请求,服务器应接不暇,最终无法处理正常的请求,对别的正常用户来说,看上去网站貌似无法访问,拒绝服务就是这么个意思。
后来随着技术对发展,现在的服务器早已不是一台服务器那么简单,你访问一个 www.baidu.com 的域名,背后是数不清的 CDN 节点,数不清的 Web 服务器。
攻击者不再局限于单台计算机的攻击能力,转而通过成规模的网络集群发起拒绝服务攻击。
拒绝服务攻击实际上是一类技术,根据具体实施手段的不同,又可以进一步细分:
SYN Flood
ICMP Flood
UDP Flood
......
防御手段:即便是到现在,面对 DDoS 也没有 100% 打包票的防御方法,只能靠一些缓解技术一定层面上减轻攻击的威力。这些技术包括:流量清洗、SYN Cookie 等等。
重点关注:运维工程师、安全工程师。
⑤DNS 劫持
当今互联网流量中,以 HTTP/HTTPS 为主的 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。而一旦这些“规则”理解错误,事情就变得糟糕起来。
所谓栈溢出攻击,则是通过一些手段输入到栈中的缓冲区中,冲破缓冲区原有的界限,将存储返回地址的位置覆盖为一个数值,使其指向攻击者提前布置的恶意代码位置,劫持了程序的执行流程。
防御手段:现代操作系统针对栈溢出攻击已经有非常成熟的应对方案,像 Linux 平台的 Stack Canary,Windows 平台的 GS 机制等等,程序员需要做的就是充分利用这些机制。
重点关注:C/C++ 工程师。
②整数溢出攻击
我们知道,计算机数值以补码的方式表示和存储。在表示一个有符号数时,最高位是用来表示这是一个正数(0)还是一个负数(1)。
+1: 0000 0000 0000 0001
-1: 1111 1111 1111 1111
32767: 0111 1111 1111 1111
1000 0000 0000 0000
而这正是 -32768 的补码形式!试想一下,如果这个变量名字叫 length 作为 strcpy 参数,或是叫 index 作为数组的下标,整数的溢出将导致可怕的后果,轻则进程崩溃,服务宕机,重则远程代码执行,拿下控制权。
重点关注:所有程序员。
③空指针攻击
而在一些特殊的情况下,部分操作系统允许分配内存起始地址为 0 的内存页面,而攻击者如果提前在该页面准备好攻击代码,则可能出现执行恶意代码的风险。
④释放后使用攻击
释放后使用 Use After Free 意为访问一个已经释放后的内存块。较多的出现在针对浏览器的 JavaScript 引擎的攻击中。
在上面的场景中,如果攻击者在 delete 对象后,马上又 new 一个同样内存大小的对象,在现代操作系统的堆内存管理算法中,会有很大概率将这个新的对象放置于刚刚被 delete 的对象的位置处。
这个时候还通过原来对象的指针去访问,将出现鸠占鹊巢,出现可怕的后果。养成好的编程习惯,对象 delete 后,指针及时置空。
重点关注:C/C++ 工程师。
⑤HOOK
而实现这一功能的技术就是用到了 HOOK 技术,钩到了键盘敲击的事件消息。
除了消息 HOOK,用得更多的是程序执行流程层面的 HOOK。
另外,软件补丁技术中也时常用到 HOOK 技术,软件厂商发现原来程序漏洞后,通过 HOOK,修改既有程序的执行逻辑,从而达到修复漏洞的目的。
重点关注:C/C++ 工程师。
⑥权限提升
现代操作系统都对运行于其中的进程、线程提供了权限管理,因为安全攻击无可避免,而权限的限制作为一道颇为有效的屏障将程序被攻击后的影响减少到最小。
就像一枚硬币总有两个面,有权限限制,自然而然就有权限提升。攻击者想要做更多事情,就得突破操作系统的限制,获取更高的权限。
权限提升的方式五花八门,总体来说,程序执行的时候,所属进程/线程拥有一个安全令牌,用以标识其安全等级,在访问资源和执行动作的时候由操作系统内核审核。
而更改这个安全令牌的惯用伎俩便是利用操作系统内核漏洞(如前面所述的栈溢出、整数溢出、释放后使用等)执行攻击者的代码,实现安全令牌的篡改。
重点关注:安全工程师。
⑦可信计算
安全攻击无处不在,不仅应用程序的环境不可靠,甚至连操作系统内核的环境也充满了风险。
可信计算/可信用计算(Trusted Computing,TC)是一项由可信计算组(可信计算集群,前称为 TCPA)推动和开发的技术。可信计算是在计算和通信系统中广泛使用基于硬件安全模块支持下的可信计算平台,以提高系统整体的安全性 [1] 。签注密钥是一个 2048 位的 RSA 公共和私有密钥对,它在芯片出厂时随机生成并且不能改变。这个私有密钥永远在芯片里,而公共密钥用来认证及加密发送到该芯片的敏感数据。
可信计算中一个非常重要的概念是可信执行环境 TEE(Trusted Execution Environment),简单来说就是在现有的计算机内部的世界里,再构建一个秘密基地,专门用于运行极度机密的程序。
该秘密基地甚至连操作系统都轻易无法访问,更别说操作系统之上的应用程序了。
重点关注:终端系统工程师。
密码学
由于数据传输的过程中会遇到信息泄漏、篡改、伪造的风险,加密技术应运而生。
①对称加密&非对称加密
有加密就有解密,根据加密过程使用的密钥和解密过程使用的密钥是否相同,将加密算法分为了两个大类:对称加密和非对称加密。
最早出现的加密技术是对称加密:加密密钥和解密密钥一致,特点是加密速度快、加密效率高。
常用的对称加密算法有:
DES
AES
RC4
这种加密方式中有一个非常关键的问题是,解密方需要拿到密钥才能进行解密,而密钥钥匙通过网络传输又会面临不安全的风险,这成了一个鸡生蛋,蛋生鸡的问题。
非对称加密:加密密钥与解密密钥不一致,特点是算法较复杂,但安全性高。非对称加密的密钥一般分为公钥和私钥,公钥公开,私钥需保密。常用于数字认证,如 HTTPS 中握手阶段的服务器认证。
常用的非对称加密算法有:
RSA
DH
ECC(椭圆曲线加密)
可以毫不夸张的说,没有了非对称加密,互联网绝不会发展到今天这样的高度。
②秘钥交换技术
回头看看上面提到的非对称加密,它就可以解决这个问题:
服务器负责生成一对公私钥,公钥告诉客户端,私钥自己保存
客户端拿到公钥后,使用它来对后续通信将要使用的对称加密算法密钥进行加密传输
服务端收到后使用私钥解密,拿到这个密钥
以后双方可以通过对称加密进行传输通信
上面这个例子并不只是举例,在早期版本的 HTTPS 中,就是通过这种方式来进行密钥交换。而后来的版本中,另外一种叫 DH 及其变种的密钥交换算法用的越来越多。
DH 全称 Diffie-Hellman,是两位数学家的名称构成,这种算法的核心是完全依靠数学运算实现密钥的交换。
③信息摘要算法
信息摘要算法其实不算是一种加密算法,加密的前提是可以通过解密还原,而信息摘要算法的目的并不是对数据进行保护,也无法解密还原。
在一些语境下,信息摘要我们听得少,听的更多的名词是哈希,信息摘要算法的目的之一是校验数据的正确性,算法公开,数据通过该算法得出一个摘要值,收到数据后通过该算法计算出这个摘要,前后对比就知道是否有被篡改。
常用的信息摘要算法有:
MD5
SHA1
SHA256
④数据编码技术
除了 base64,还有常用于比特币钱包地址编码的 base58。base 家族还有 base85、base92、base128 等众多算法。它们的区别不仅仅在于参与编码的字符集不同,算法执行也是各有千秋。
⑤多因子认证技术
多因子认证技术意为在传统密码认证之外,引入其他认证技术进行补充,使用 2 种及以上的方式共同完成认证。
随着人工智能技术的发展,基于生物特征的认证技术突飞猛进:
指纹认证
虹膜认证
人脸识别
......
这个世界从来不缺先行者,多因子认证看上去很复杂,好在已经有不少头部企业搭建了认证平台,对于绝大多数企业,需要做的只是下载 SDK,调用 API 而已。
目前国内外主流的多因子认证平台有三大派系:
FIDO,国际标准,在国内,翼支付、百度钱包、京东钱包、微众银行等都已经应用。
IFAA,阿里系,凭借阿里在电商领域的优势,也吸引了众多追随者。
TUSI,腾讯系。
总结
作者:轩辕之风
编辑:陶家龙
出处:转载自微信公众号编程技术宇宙(ID:ProgramUniverse)
精彩文章推荐: