抓住他们!每个程序员都应该知道的黑客技术摘要如果你有一台计算机,你可以找到资源,但你必须擅长任何与计算机有关的事情。笑话归笑话,言归正传,对于我们程序员来说,多多少少了解一些信息安全的技术知识是有好处的,不仅可以了解计算机和网络的一些底层原理,还可以反哺我们的开发工作,用安全思维编程减少了漏洞的发生。信息安全大致可以分为三大分支:网络安全系统安全密码学下面,轩辕君列举了这三个领域中一些常用的黑客技术,有些技术在领域上是交叉的,因此归入主要类别中。1.网络安全1.SQL注入网络安全三大工具中的第一个就是大名鼎鼎的SQL注入。SQL注入攻击的核心是让Web服务器执行攻击者预期的SQL语句,从而获取数据库中感兴趣的数据或对数据库进行读、修改、删除、插入等操作,从而实现它的邪恶目的。以及如何让Web服务器执行攻击者的SQL语句呢?SQL注入的常规套路是将SQL语句放在表单或请求参数中,提交给后端服务器。如果后端服务器不进行输入安全校验,直接发送变量取出来进行数据库查询,就很容易被骗。举例如下:对于一个根据用户ID获取用户信息的接口,后端的SQL语句一般是这样的:selectname,[...]fromt_userwhereid=$id其中$id为用户id前端提交,如果前端请求是这样:GETxx/userinfo?id=1%20or%201=1其中请求参数id为1或者转义后1=1,如果后端直接提交没有进行安全过滤的数据库查询,SQL语句变为:selectname,[...]fromt_userwhereid=1or11=1结果是查出user表中的所有数据,达到黑客泄露数据的目的。上面只是一个很简单的例子。在真正的SQL注入攻击中,参数构造和SQL语句要比这复杂得多,但原理是一样的。Attack"title="SQLInjectionAttack">防御方法:检测输入,阻断SQL语句的特征重点关注输入:前端工程师,Web后端工程师跨站脚本(CrossSiteScripting),为了为了和重叠样式表CSS区分开来,换了一个缩写XSS,XSS攻击的核心是在网页中植入可执行的前端脚本代码(通常是JavaScript),听起来比较啰嗦,说白了,攻击者想要你的浏览器执行他写的JS代码,怎么办?一般XSS分为两种:反射型:攻击者将JS代码作为请求参数放在URL中,诱导用户点击的例子:http://localhost:8080/test?name=用户点击后,JS作为请求参数传递给web服务器,后台服务器不勾选Filtering,经过简单的处理,放入正文中网页并将其返回给浏览器。将攻击脚本存储在库中,后面查询时将攻击脚本渲染到网页中,返回给浏览器触发执行。常见套路示例如下:攻击者在网页上发帖,帖子中包含JS脚本。到其他网友查看帖子的数据库,后台查询帖子的回复内容,构建完整的网页,返回浏览器。脚本入侵主要针对:前端工程师、Web后端工程师3.CSRF攻击是Web安全三大策略中的第三种。这时,在页面B的“怂恿”下,浏览器向网站A发起HTTP请求。这个过程的危害在于两点:这个HTTP请求不是用户主动的,而是B“教唆”的,如果是危害更大的请求操作(发邮件?删除数据?等),就麻烦了因为之前A打开过网站,浏览器中保存着A下发的用于身份认证的cookie或者其他信息,这个时候被“策动”的请求会自动带上这些信息。A的网站后台无法判断这是不是关注用户的真实意愿:前端工程师、web后端工程师4、DDoS攻击DDoS全称DistributedDenialofService:分布式拒绝服务攻击。它是拒绝服务攻击的升级版。顾名思义,拒绝服务攻击会使服务不可用。常用于攻击对外提供服务的服务器,如:Web服务、邮件服务、DNS服务、即时通讯服务……在互联网技术还不发达的早期,发起DoS攻击是非常容易的攻击方式:一台性能强大的电脑写了一个多线程的程序不断向服务器请求,服务器不堪重负,最终无法处理正常的请求。对于其他正常用户来说,网站似乎无法访问,这就是拒绝服务的意思。后来随着技术的发展,现在的服务器不再是服务器那么简单了。当你访问一个www.baidu.com的域名时,背后有无数的CDN节点和无数的Web服务器。在这种情况下,如果还想依靠单台计算机来尝试让网络服务满载,无异于以卵击石。对方不下来,你先下去。技术从来都是一把双刃剑。分布式技术可以用来提供高可用的服务,也可以被攻击者用来进行大规模杀伤性攻击。攻击者不再局限于单台计算机的攻击能力,而是通过大规模的网络集群发起拒绝服务攻击。拒绝服务攻击其实是一类技术,根据实现方式的不同还可以进一步细分:SYNFloodICMPFloodUDPFlood...防御方式:即使是现在,也没有100%DDoS有保证的防御方式只能靠关于一些缓解技术,以在一定程度上降低攻击的力量。这些技术包括:流量清洗、SYNCookie等关注点:运维工程师、安全工程师5、DNS劫持在当今的互联网流量中,以HTTP/HTTPS为主的Web服务产生的流量占绝大多数。Web服务的发展如火如荼,而这背后还有一个不为人知的大功臣,那就是域名解析系统:如果没有DNS,我们上网时需要记住的是每个网站的IP地址,而不是他们的域名。互联网。这是一场灾难,幸好DNS默默无闻这一切都是在幕后完成的,我们只需要记住一个域名,剩下的就由DNS来做。也正是因为它的重要性,别有用心的人不会放过它,发明了DNS劫持技术。DNS提供将域名转换为IP地址的服务。但是在早期协议的设计中,并没有过多考虑其安全性。对于查询方:我请求的真的是DNS服务器吗?难道是别人冒充DNS服务器?查询结果是否被篡改?这个IP真的是网站吗?DNS协议中没有机制保证这些问题能够得到解答,所以DNS劫持猖獗,从用户在地址栏输入域名的那一刻起,一路上的危险就让人防不胜防:木马在本机修改hosts文件,木马在本机修改DNS数据包中的回复节点(如路由器)修改DNS数据包中的回复节点(如运营商)修改DNS数据包中的响应...后来为了在客户端验证收到的DNS响应,出现了DNSSEC技术,可以在一定程度上解决上面的一些问题。但由于某些原因,这项技术一直没有大规模使用,尤其是在中国,很少部署。后来,阿里、腾讯等互联网大厂开始推出httpDNS服务,想出了一招灭火。虽然这项技术的名字还有DNS这三个字母,但是实现方式却和原来的DNS不同。不是,通过这项技术,DNS成为了http协议之上的应用服务。关注对象:安全工程师、后端工程师、运维工程师6、TCP劫持TCP是TCP/IP协议族中非常重要的一员,位于传输层。协议本身并不对TCP传输的数据包进行认证,所以我们只要知道一个TCP连接中的seq和ack就可以很容易地伪造传输包,假装任何一方与另一方通信,我们将这个过程已知如TCP会话劫持(TCPSessionHijacking)TCP劫持技术是一项非常古老的技术,自1995年提出后就受到了黑客的青睐。但是近年来,随着操作系统层面安全机制的增强以及随着防火墙软件检测能力的提高,这种基本的攻击方式越来越容易被发现,逐渐淡出了人们的视野。关注对象:安全工程师、运维工程师7.端口扫描技术端口扫描是黑客经常使用的一种技术。服务攻击。记得刚学网络安全的时候,大家总会拿出一个工具来扫一扫。虽然扫描后没有更多内容,但他们总是乐此不疲,在不懂的人面前炫耀自己的“黑客”本领。在以TCP/IP协议族构建的Internet中,网络服务总是离不开端口的概念。无论是TCP还是UDP,应用层都需要一个端口号来进行网络通信。我们常用的服务端口有:21:FTP文件传输服务25:SMTP邮件服务53:DNS域名解析系统服务80:HTTP超文本传输??协议服务135:RPC远程过程调用服务443:HTTPS3389:MSRDP微软远程桌面连接服务...端口扫描的原理。对于基于UDP的服务,发送相应的服务请求包,看是否有响应;对于基于TCP的服务,尝试发起三次握手发送TCPSYN包,看是否有应答。如果远程服务器有响应,则说明对端服务器上正在运行相应的服务。下一步是进一步检测对端服务器使用的操作系统、运行的服务器程序的类型和版本等,然后针对相应的易受攻击的程序发起网络攻击。可见,为了安全起见,应该尽可能少的信息暴露在Internet上,关闭不必要的服务端口。防御手段:使用防火墙等安全产品,即时发现并阻断非法扫描检测行为。关注方向:运维工程师、安全工程师2.系统安全系统安全部分的技术一般是指发生在终端上,与操作系统密切相关的攻击。1.栈溢出攻击栈溢出攻击历史悠久,也是系统端最基本的攻击方式。现代计算机基本上建立在冯诺依曼系统之上,而这个系统最大的问题之一是数据和指令都存储在内存中。在计算机的内存中,不仅包含程序运行的所有代码指令,还包含程序运行的输入输出等各种数据。没有强制性机制来区分指令和数据。因为它们对于计算机来说是相同的二进制0和1,所以很多时候都是由程序按照既定的“规则”去解释和理解内存中的这些0和1。而当这些“规则”被误解时,事情就会变得更糟。具体到我们现代的CPU和OS,无论是x86/x64处理器还是ARM处理器,都采用了寄存器+栈的设计,而这个栈包含了程序运行的各个函数栈帧中的变量数据等信息,还有保存函数调用生成的返回地址。所谓栈溢出攻击就是通过某种手段进入栈中的缓冲区,突破缓冲区原来的边界,将存放返回地址的位置改写为一个值,使其指向恶意代码攻击者事先安排的位置。劫持程序的执行流程。防御手段:现代操作系统对于栈溢出攻击都有非常成熟的解决方案,比如Linux平台的StackCanary、Windows平台的GS机制等,程序员需要做的就是充分利用这些机制。重点:C/C++工程师2.整数溢出攻击和栈溢出攻击是一样的。整数溢出攻击也是溢出攻击。不同的是,溢出的目标不是栈中的缓冲区,而是一个整数。我们知道,计算机的值是用补码来表示和存储的。在表示有符号数时,最高位用来表示是正数(0)还是负数(1)。例如,对于一个16位的短型变量,+1和-1表示如下:+1:0000000000000001-1:111111111111111一个16位的短型变量所表示的范围是-32768~32767,现在想一个问题,如果一个short变量的值现在是32767:32767:0111111111111111如果现在对它进行+1运算,它将变成:1000000000000000而这正是-32768的补码形式!试想一下,如果变量名调用length作为strcpy的参数,或者index作为数组的下标,整数溢出会导致很严重的后果,轻则进程崩溃,服务宕机,远程代码执行控制。重点关注:所有程序员3.空指针攻击空指针一般发生在指针未初始化,或者使用new进行对象创建/内存分配时,粗心的程序员没有检查指针是否为空就访问。攻击。大多数情况下,这会导致内存地址访问异常,程序崩溃退出,导致拒绝服务。在某些特殊情况下,一些操作系统允许分配内存起始地址为0的内存页,如果攻击者提前在该页准备攻击代码,则可能存在执行恶意代码的风险。4.UseAfterFreeAttacksUseAfterFree是指访问一个已经被释放的内存块。它们中的大多数出现在针对浏览器的JavaScript引擎的攻击中。一般情况下,我们不能再访问一个被释放的对象,但是如果程序员粗心,删除对象后,并没有立即将指针置为NULL,后面继续使用该指针访问对象(例如,通过对象的虚函数表指针调用虚函数),会出现内存访问异常。在上面的场景中,如果攻击者删除对象后立即创建了一个内存大小相同的新对象,在现代操作系统的堆内存管理算法中,新对象很有可能会被放到新的删除的对象。对象的位置。这时候还是用原来对象的指针来访问,就会有鸽子占鹊巢,后果很可怕。养成良好的编程习惯。对象被删除后,指针会及时清空。重点关注:C/C++工程师5.HOOKHOOK钩子的本义,常用于计算机编程中,改变原有的程序执行过程。在互联网充斥流氓软件的年代,流行一种键盘记录器木马,用于记录用户的键盘输入以窃取密码。其中,QQ一度是重灾区。实现该功能的技术是使用HOOK技术,将键盘敲击的事件消息进行hook。除了消息HOOK之外,程序执行过程层面的HOOK使用较多。将恶意代码注入目标程序后,在函数入口处添加跳转指令,使此处执行的线程转而执行攻击者的代码,从而达到修改和过滤参数的目的。HOOK技术不仅被黑客使用,安全软件也使用。安全软件需要守护整个系统的安全防线。通过HOOK技术,在各种敏感API处设置校验,抵御非法调用攻击。另外,软件补丁技术中也经常用到HOOK技术。软件厂商发现原程序漏洞后,通过HOOK修改现有程序的执行逻辑,从而达到修复漏洞的目的。重点关注:C/C++工程师6.权限提升现代操作系统为运行在其中的进程和线程提供权限管理,因为安全攻击是不可避免的,而权限限制作为一个相当有效的屏障将程序攻击的后续影响降到最低。也就是说,即使我们的程序因为漏洞被攻击执行了恶意代码,由于操作系统的权限控制,恶意代码能做的事情也是有限的。就像硬币总是有两面的,有权限限制,自然会有权限升级。如果攻击者想要做更多的事情,就必须突破操作系统的限制,获得更高的权限。在Windows上,通常称为获得管理员权限。在Linux上,常被称为root权限,这也是手机Root的意思。在iOS上,它通常被称为“越狱”。有多种特权升级方法。一般来说,当程序执行时,其所属的进程/线程都有一个安全令牌来标识其安全级别,操作系统内核在访问资源和执行动作时对其进行审计。提权的目的是将这个安全令牌变成一个高级别的令牌,以便在以后访问敏感资源和执行敏感动作时能够通过系统的安全审计。更改此安全令牌的常用技巧是利用操作系统内核漏洞(如堆栈溢出、整数溢出、释放后使用等)来执行攻击者的代码来篡改安全令牌。重点关注:安全工程师7.可信计算安全攻击无处不在,不仅应用程序的环境不可靠,就连操作系统内核的环境也充满风险。如果一个程序(比如支付)必须在极其绝密的环境中执行怎么办?可信计算的概念是由安全研究人员提出的。根据维基百科的解释:可信计算/可信计算(TrustedComputing,TC)是由可信计算组(TrustedComputingCluster,原名TCPA)推动和发展的一项技术。可信计算是一种由硬件安全模块支持的可信计算平台,广泛应用于计算和通信系统,以提高系统的整体安全性[1]。背书密钥是一对2048位的RSA公私钥,在芯片出厂时随机生成,不可更改。这个私钥始终在芯片上,公钥用于验证和加密发送到芯片的敏感数据。可信计算中一个非常重要的概念是可信执行环境(TEE)。简单的说,就是在现有的电脑内部建立一个世界秘密基地,专门用来运行极其机密的程序。即使操作系统也很容易无法访问秘密基地,更不用说其上的应用程序了。在移动端,ARM芯片占据主流市场。ARM芯片提供了一种叫做TrustZone技术的技术,在硬件层面增加了一个可信计算环境,包括一个可信OS,以及一些可信APP,在硬件层与公共环境隔离,处理器内部进行通信,完成它们之间的交互两个世界。关注方向:终端系统工程师3.密码学由于数据传输过程中存在信息泄露、篡改、伪造等风险,加密技术应运而生。1.对称加密&非对称加密有加密就有解密。根据加密过程中使用的密钥和解密过程中使用的密钥是否相同,加密算法分为对称加密和非对称加密两类。最早的加密技术是对称加密。对称加密:加密密钥与解密密钥相同,特点是加密速度快,加密效率高。常用的对称加密算法有:DESAESRC4这种加密方式一个很关键的问题是解密方需要获取密钥才能解密,而密钥密钥在通过网络传输时会面临不安全的风险。这是一个先有鸡还是先有蛋的问题。于是发明了一种通信技术中划时代的技术,这就是非对称加密!非对称加密:加密密钥与解密密钥不一致,特点是算法比较复杂,但安全性高。非对称加密的密钥一般分为公钥和私钥,公钥是公开的,私钥需要保密。常用于数字认证,如HTTPS握手阶段的服务器认证。常用的非对称加密算法有:RSADHECC(EllipticCurveEncryption)可以毫不夸张地说,如果没有非对称加密,互联网不可能发展到今天的高度。2.密钥交换技术在互联网通信中,有加密就有解密。解密自然需要一个密钥,那么这个密钥怎么告诉对方呢?密钥交换算法就是为了解决这个问题:如何将密钥安全地共享给对方?回过头来看上面提到的非对称加密,可以解决这个问题:服务端负责生成一对公私钥,公钥告诉客户端,私钥由客户端保存。客户端得到公钥后,用它来加密后续通信中要用到的对称加密算法密钥,服务器端接收后用私钥解密。双方得到密钥后,就可以通过对称加密进行传输和通信了。上面的例子不仅仅是一个例子。在早期版本的HTTPS中,密钥交换是通过这种方式进行的。在后来的版本中,越来越多地使用另一种称为DH及其变体的密钥交换算法。DH的全称是Diffie-Hellman,由两位数学家的名字组成。该算法的核心是完全依靠数学运算来交换密钥。3.信息摘要算法信息摘要算法实际上并不是一种加密算法。加密的前提是可以通过解密来恢复,但是信息摘要算法的目的不是为了保护数据,也不能解密和恢复。在某些情况下,我们听到的信息摘要较少,我们听到的名词更多。哈希信息汇总算法的目的之一是验证数据的正确性。算法是公开的,数据通过算法得到一个汇总值。收到数据后,通过算法计算摘要,通过前后对比可以知道是否被篡改。常用的信息摘要算法有:MD5SHA1SHA2564。数据编码技术严格来说,数据编码技术并不是一种加密算法,因为它的目的不是为了加密,而是为了对数据进行编码以便传输。最常见的编码算法是base64,多用于对二进制数据进行编码,将不可见的字符转换为由64个常用字符组成的文本,便于打印、显示、传输和存储。例如邮件eml格式,将附件文件进行base64编码。除了base64,还有base58,常用来对比特币钱包地址进行编码。base家族还有base85、base92、base128等多种算法。它们的区别不仅在于编码所涉及的字符集不同,算法执行也各有优势。5.多因素认证技术说到认证,最常见的场景就是登录和支付。传统的认证技术是加密技术,但是随着网络攻击的日益猖獗,互联网渗透到人们生活的方方面面,传统的加密技术的安全性已经不足以适应互联网的发展。多因素认证技术是指在传统的密码认证之外,引入其他认证技术进行补充,使用两种或两种以上的方法共同完成认证。随着人工智能技术的发展,以生物识别为基础的认证技术突飞猛进:指纹认证、虹膜认证、人脸识别……世界上从来不乏先行者。多因素认证看似复杂,好在有很多龙头企业搭建了认证平台。对于大多数公司来说,他们需要做的就是下载SDK并调用API。目前国内外主流的多因素认证平台主要有三大派系:国际标准FIDO。在中国,易宝、百度钱包、京东钱包、微众银行等都应用了IFAA,也吸引了众多追随者。TUSI,腾讯系摘要本文列举了一些常用的信息安全技术,主要分为三个方面:网络安全、系统安全和密码学。信息安全技术不仅仅适用于安全工程师。作为一名程序员,了解这些技术将有助于我们更好地建设世界!
