本次 Chat 的内容主要是讲解网站安全的攻防知识。正所谓道高一尺魔高一丈,有对应的安全问题就有对应的预防手段。针对目前存在的网络安全问题,我们可以提前预知并在开发过程中有所准备。在编码过程中就预防可能出现的网站安全问题。
常见的网络攻击手段分析
Web 网站常见的攻击手段主要有 XSS 攻击、CSRF 攻击、SQL 注入、DDoS 等攻击。一般常见的 XSS、CSRF、SQL 注入等攻击相对于 DDoS 攻击来说比较容易预防,在自己日常编码过程中需要多加注意,避免产生漏洞,给黑客可乘之机。
如果是 DDoS 攻击,攻击手段多样,产生的影响和危害很大,需要持续性的防御演练,做好应急备案,保持有效的监控。
XSS 攻击
XSS 全称是跨站脚本攻击(Cross Site Scripting),为了避免缩写和样式表 CSS 同名,所以改叫 XSS。该攻击是通过利用网页开发时留下的漏洞,能够使得攻击者嵌入恶意脚本代码到正常用户会访问到的页面中,当正常用户访问该页面时,则可导致嵌入的恶意脚本代码的执行,从而达到恶意攻击用户的目的。
XSS 的攻击原理
一种是反射型 XSS 攻击,攻击者主要是通过在 URL 中使用 URLEncode 对路径加密。通过特定的方式来诱惑受害者去访问一个包含恶意代码的 URL。当受害者点击恶意链接 URL 的时候,恶意代码会直接在受害者的主机上的浏览器执行。
主要的攻击步骤为:
制作恶意链接,对一些有需要传参的路径加入 JS 脚本代码进行攻击。后端人员没有针对路径的参数进行转义过滤,导致被注入攻击。
通过恶意链接,加入一些诱导性词诱导用户进行点击,从而获取用户的信息。
用户打开页面后,会触发链接中带的脚本代码,从而实行攻击。
例如攻击者仿造一些中奖网站,然后发送如下的链接到你的邮箱,诱导你打开进行攻击。假设有如下的一个路径参数被 URLEncode() 方法加密了,导致看不出是个攻击链接。用户点击时,触发脚本弹出用户的 Cookie 信息。这样就达到攻击的目的。这里主要是演示攻击获取用户 Cookie,黑客可以编写其他相关的 JS 代码进行攻击,获取用户的信息发送指定的邮箱等获取用户信息。
https://www.hiyd.com/dongzuo/?name=%3Cscript%3Ealert(document.cookie);%3C/script%3E
此种攻击主要针对的是前端攻击,实际的更改并没有对网站的核心逻辑进行更改。
除了反射型 XSS 攻击外,还有一种叫做存储型 XSS 攻击。它的攻击手段比反射型 XSS 攻击更严重。
它是指发现网站中存在某个漏洞,可以把 HTML 或 JS 的代码直接保存到数据库,后端没有对标签过滤,当取出到界面展示时,浏览器直接解析运行这部分 HTML 或 JS 代码,实行攻击。由于该部分代码是存储在数据库的,只要访问到该代码的人,都会被成为攻击的主体,从而窃取访问者的信息。
一般的攻击步骤为:
攻击者将恶意代码提交到目标网站的数据库保存,能够完整保存这部分 HTML、JS 的代码,是因为后端没有对 HTML、JS 相关代码转义。
用户访问到这部分从数据库中取出的恶意代码的网页;
这部分恶意代码被执行,间接盗取用户相关信息,攻击者可以冒充该用户在平台进行相关操作。
XSS 的预防
首先我们要知道产生 XSS 攻击的根本原因,是因为用户输入的数据中存在代码时,我们没有针对性的过滤,进行转义处理。导致浏览器以为是正常的 HTML、JS 代码而被运行。所以我们需要对用户提交过来的数据转义处理,将其中的“尖括号”、“单引号”、“引号”等特殊字符进行转义。前端也可以对后端展示的数据做一下处理,比如对 script 标签,将特殊字符替换成 HTML 编码这些等。前端获取浏览器的参数时,要对参数过滤,当然大多数浏览器都会对从 URL 中获取的内容进行编码,这也可以阻止执行任何注入的 JavaScript 代码。
例如:
<
符号转义为 HTML 的<
>
符号转义为 HTML 的>
'
符号转义为 HTML 的&
"
符号转义为 HTML 的"
CSRF 攻击
CSRF 攻击中文全称是跨站请求伪造,它和 XSS 攻击的不同是,XSS 是利用站点内的信任用户进行攻击,而 CSRF 是通过伪装来自受信任用户的请求来利用受信任的网站。CSRF 攻击利用的是盗用你的身份,通过你的名义向第三方网站发送恶意请求,CSRF 能做的事情包括利用你的身份发邮件,发短信,进行交易转账等,甚至盗取你的账号。这利用了 Web 中用户身份验证的一个漏洞:简单的身份验证只能保证请求发自某个用户的浏览器,却不能保证请求本身是用户自愿发出的。
XSRF 的攻击原理
首先用户 A 访问服务器 B,响应请求回来带有 Cookie 信息到用户 A 的电脑上,用户 A 没有登出服务器 B 的服务,如果 Cookie 这时还是有效的。用户 A 去请求服务器 C,服务器响应后返回了带有恶意脚本的页面给用户 A 加载,这时服务器通过恶意脚本伪造请求访问服务器 B,模拟用户 A 对服务器 B 进行攻击,服务器 C 可以响应得到带有用户 A 在服务器 B 的 Cookie 信息。从而实现了 XSRF 攻击。
受害者只需要做下面的两件事,攻击者就能够完成 CSRF 攻击:
登录受信任的服务器 B,在本地生成未过期的 Cookie;
在不登出站点 B 的情况下(未清空服务器 B 的 Cookie),服务器 C 窃取用户 Cookie 恶意访问服务器 B。
很多情况下,恶意站点可能是一个存在其他漏洞(入 XSS)的受信任并且被很多人访问的站点,这时用户可能在不知不觉中成为受害者。
XSRF 的防御
1. 使用 Token
Token 是使用得比较多的预防 XSRF 攻击的方法,开发人员可以再 HTTP 请求中以参数的形式加入一个随机产生的 Token,在服务端校验 Token,如果请求中没有 Token 或者 Token 不正确,那么可以认为是 CSRF 攻击,而拒绝请求。Token 主要是在请求中放入攻击者无法伪造的信息,避免了攻击者进行攻击。
2. 将 Cookie 设置为 HttpOnly
根据前面介绍的 XSRF 的攻击原理知道,XSRF 的攻击上很大程度是利用了用户的 Cookie,为了防止站内的 XSS 漏洞被盗取 Cookie,可以在 Cookie 中设置为“HttpOnly”属性,这样别人就无法通过程序读取到该站点的 Cookie 信息,避免攻击者伪造 Cookie 的情况出现。
3. 使用验证码
增加验证码类似于通过 Token 进行访问判断,但是这样的体验一般不是很好,所以验证码一般用于留言、评论、登录这种地方。
4. 通过 Referer 识别
HTTP 协议中有一个 Referer 字段,它表示的是访问来源,服务器端可以根据该字段判断,判断该来源的域名是否是本地网站,如果不是的话,可以直接认为是危险链接,拒绝访问。但是如果我们把网站页面分享出去给别人,例如微信、QQ,其他人从微信朋友圈点击进来,那么该 Referer 也不是本地域名网站的。
SQL 注入攻击
SQL 注入是指通过把 SQL 命令伪装成正常的 HTTP 请求参数,传递到服务端,欺骗服务器最终执行恶意的 SQL 命令,达到入侵目的。攻击者可以利用 SQL 注入漏洞,查询非授权信息,修改数据库服务器的数据,改变表结构,甚至是获取服务器 root 权限。一般情况下,后端开发人员对用户所输入的数据或 Cookie 等内容不进行过滤或验证(即存在注入点)就直接传输给数据库,就可能导致拼接的 SQL 被执行,获取对数据库的信息以及提权,发生 SQL 注入攻击。
攻击原理
假设前端有一个简单的登录界面:
<html> <title>测试</title> <body> <form action="" method="post"> 用户名:<input type="text" name="username" > <br/> 密码:<input type="text" name="password" > <br/> <input type="submit" value="登录"> </form> </body></html>
用户输入用户名“lisi”,密码为 ' or '1'='1
时,后台的查询 SQL 为:
select * from user where username='{$name}' and password=‘{$password}’
如果后端获取前端输入的参数后,没有对参数进行过滤,而是直接拼接原生 SQL 让数据库执行,也就是上面的 SQL 变成下面的格式:
select * from user where username='lisi' and password=‘' or '1'='1’
这时就会出现,不管用户名和密码是什么,是否正确,该 SQL 中的 1=1 都是满足条件的,查出来的用户列不会为空,攻击者绕开密码而实现攻击。以上只是简单的一个示例。但是如果攻击者在密码框输入的是 drop table 表名 --
,那么就会出现删除某张表的危险。SQL 注入甚至还有其他比这种更加危险的攻击手法。所以对于 SQL 注入的危险程度来说,要加以重视,严加防范。
SQL 注入预防
预防 SQL 注入的办法是,使用预编译语句,这样即使使用 SQL 语句伪造参数进行攻击,到了服务端的时候,这个伪造的 SQL 语句参数也只是简单的字符串,这样就不能起到攻击的作用了。其次存储在数据库的重要信息,例如密码等不要明文存储,避免数据库数据泄露后,用户的密码一并被暴露。其次对数据库的操作相关语句,做好异常处理,避免数据库执行的 SQL 语句编写暴露在用户访问页面中,泄露表的结构字段。
DDoS 攻击
DDoS 叫做分布式拒绝服务攻击,是目前最为强大、最难以防御的攻击方式之一。它指的是攻击者借助公共网络,将数量庞大的计算机设备联合起来作为攻击平台,对一个或多个目标发动攻击,从而达到瘫痪目标主机的目的。通常在攻击开始前,攻击者会提前控制大量的用户计算机,称之为“肉鸡”,并通过指令使大量的肉鸡在同一时刻对某个主机进行访问,从而达到瘫痪目标主机的目的。
DDoS 常见的攻击手段
SYN Flood
要介绍 SYN Flood 攻击原理,要先知道 TCP 协议的通信流程。TCP 协议为了保证数据传输的可靠性,在三次握手的过程中新增了异常处理机制。在第三次握手中如果服务器没有收到客户端的 ACK 报文,服务端会尝试重试,即再次发送 SYN +ACK 报文给客户端响应,状态一直是 SYN_RECV 状态,然后将客户端加入等待列表。重发的次数一般在 3~5 次,每隔 30 秒左右会再轮询一遍等待队列,重新重试所有客户端;另一面,服务器在发出 SYN + ACK 报文后,对应的预分配一部分资源给即将建立的 TCP 连接使用,这个资源在等待重试期间会一直保留,最重要的是,服务器资源本身是有限的,可以维护的等待列表超过极限后就不能再接收新的 SYN 报文,就会出现拒绝建立新的 TCP 连接的情况。
而 SYN Flood 的攻击原理正是利用了 TCP 协议三次握手的这个过程达成攻击目的。攻击者进行伪造大量的 IP 地址向服务器发送 SYN 报文,因为伪造的 IP 地址基本不存在,客户端也就不可能有响应,服务端就需要维护一个非常大的半连接等待列表,不断的对这个列表的 IP 地址遍历和尝试,服务器的大量资源就会被占用。大量的恶意客户端信息占满服务器的等待队列后,服务器会不再接收新的 SYN 请求,正常的用户就无法完成三次握手与服务器通信,从而达成攻击目的。
CC 攻击
CC 攻击是基于应用层 HTTP 协议发起的 DDoS 攻击,也称为 HTTP Flood。CC 攻击发起容易,防范困难,影响广泛。它使用的是 HTTP 代理使攻击者能够发起持续高强度的攻击。攻击在应用层发起,往往和网站的业务紧密相连,使得防守的一方很难在不影响业务的情况下对攻击请求进行过滤,大量的误杀会影响正常访问的用户,间接的达成攻击者的目的。
攻击原理:利用代理服务器向受害者发起大量 HTTP Get 请求;主要请求动态页面,涉及到数据库访问操作;数据库负载以及数据库连接池负载极高,无法响应正常请求。
DNS Query Flood
DNS Query Flood 是 UDP Flood 攻击的一种变形,DNS 服务再互联网中具有不可替代性作用,一旦 DNS 服务器瘫痪,影响很大。它的攻击原理是通过发起大量的 DNS 请求,导致 DNS 服务器无法响应正常用户的请求,正常用户不能解析 DNS,从而不能获取服务。
除了上面的三种常见的 DDoS 攻击方式外,还有其他的 DDoS 攻击,在这里就不进行讲解介绍。
DDoS 的防御
目前针对 DDoS 的防御方法主要有以下三个。
1. 对异常流量的清洗过滤
它主要是通过 DDoS 硬件防火墙对异常流量的清洗过滤,通过数据包的规则过滤、数据流指纹检测过滤、及数据包内容定制过滤等顶尖技术能准确判断外来访问流量是否正常,进一步将异常流量禁止过滤。单台负载每秒可防御 800-927 万个 syn 攻击包。
2. 分布式集群防御
这是目前网络安全界防御大规模 DDoS 攻击的最有效办法。分布式集群防御的特点是在每个节点服务器配置多个 IP 地址,并且每个节点能承受不低于 10G 的 DDoS 攻击,如一个节点受攻击无法提供服务,系统将会根据优先级设置自动切换另一个节点,并将攻击者的数据包全部返回发送点,使攻击源成为瘫痪状态,从更为深度的安全防护角度去影响企业的安全执行决策。
3. 高防智能 DNS 解析
高智能 DNS 解析系统与 DDoS 防御系统的完美结合,为企业提供对抗新兴安全威胁的超级检测功能。它颠覆了传统一个域名对应一个镜像的做法,智能根据用户的上网路线将 DNS 解析请求解析到用户所属网络的服务器。同时智能 DNS 解析系统还有宕机检测功能,随时可将瘫痪的服务器 IP 智能更换成正常服务器 IP,为企业的网络保持一个永不宕机的服务状态。
常用的网络防御手段有哪些?
接下来我们简单聊聊一些安全方法,例如摘要算法、数字签名、非对称加密算法等。
数字摘要
数字摘要也叫消息摘要,它是将任意长度的消息变成一个唯一对应固定长度的值,它由一个单向 Hash 函数对消息进行计算而产生。它将需要加密的明文“摘要”成一串固定长度(128 位)的密文,这一串密文又称为数字指纹,它有固定的长度。不同的明文摘要成密文,它的结果总是不同的,而同样的明文它的摘要一定是一样的。
消息在传递的过程中,如果改变了,接收者通过接收到的消息采用相同的 Hash 重新计算,新产生的摘要与原摘要进行比较,就知道消息是否被篡改了。因此消息摘要可以验证消息的完整性。
一个 Hash 函数的好坏是通过碰撞的概率决定的,如果攻击者能够通过构造两个消息具有相同的 Hash 值,这样的 Hash 函数是很危险的。正常来说,安全 Hash 标准的输出长度至少为 160 位,这样才能保证它足够的安全。 现在使用的安全 Hash 编码法有 SHA、MD5 等方法。
消息摘要的主要特点有:
无论输入的消息有多长,计算出来的消息值啊要的长度总是固定的。例如,MD5 算法计算的摘要消息由 128 个比特位,而 SHA-1 算法计算出来的摘要消息由 160 个比特位。
只要输入的消息不同,对其进行摘要以后产生的摘要消息也不相同,但相同的输入必会产生相同的输出。消息摘要算法具备的性质是:输入改变了,输出也就会改变,两条看似的消息摘要却会大相径庭。
消息摘要并不包含原文的完整信息,只能进行正向的信息摘要,而无法从摘要中恢复出原来的消息,甚至根本就找不到任何与原信息相关的信息。
它的工作原理为:
首先对要发送的文件使用 SHA 编码加密产生 128bit 的数字摘要。
然后发送方用自己的私用密钥对摘要再次加密,形成数字签名。
最后将原文和加密的摘要一起传给对方。
接收方用发送方的公共密钥对数字签名解密,与此同时对收到的文件用 SHA 编码加密产生又一个摘要。
将解密后的摘要和收到的文件在接收方中重新加密产生的摘要相互对比。如两者一致,则说明传送过程中信息没有被破坏或篡改过。否则说明存在被人篡改破坏过。
对称加密方法
对称密钥加密(Symmetric-Key Encryption)指的是加密和解密使用同一密钥。在对称加密算法中,数据发送方将明文(原始数据)和加密密钥一起经过特殊加密算法处理后,生成复杂的加密密文进行发送,数据接收方收到密文后,若想读取原文,则需要使用加密使用的密钥及相同算法的逆算法对加密的密文进行解密,才能使其恢复成可读明文。它的优点是运算速度快;缺点是无法安全地将密钥传输给通信方。
使用对称密钥加密的通信过程:
在对称密钥通信过程中,发送端和接收端要共享相同的密钥(key)才能进行通信。发送端用共享的密钥来加密报文,并将得到的密文发送给接收端。接收端收到密文,需要对密文应用解密函数和相同的共享密钥,恢复成原来的明文。
因为编、解码算法是公开的,只有密钥是唯一保密的东西,那么就有可能出现使用枚举攻击破解密钥的可能。如果是想要保证密钥不那么容易被枚举攻击暴力破解,目前也就只有增加密钥长度,密钥长度越长,破解所花费的时间也呈几何增加。
非对称加密方法
非对称密钥加密,又称公开密钥加密(Public-Key Encryption),加密和解密使用不同的密钥。公开密钥所有人都可以获得,通信发送方获得接收方的公开密钥之后,就可以使用公开密钥进行加密,接收方收到通信内容后使用私有密钥解密。
非对称密钥除了用来加密,还可以用来签名。因为私有密钥无法被其他人获取,因此通信发送方使用其私有密钥进行签名,通信接收方使用发送方的公开密钥对签名进行解密,就能判断这个签名是否正确。它的优点是可以更安全地将公开密钥传输给通信发送方;它的缺点是运算速度慢。
使用非对称密钥加密的过程:
非对称加密算法中,加密和解密使用了不同的密钥。发送明文前,需要先使用公开密钥(PK)对明文加密,再通过公开的通道传输密文,接收方在接收到密文后,需要使用私钥(SK)对密文解密,从而得到明文。公开密钥是大家都知道的,但是私有的解密密钥只有接收方的主机知道。因此每个人都能够找到某个特定主机的公开密钥,密钥的建立变得简单,而解码密钥是保密的,只有接收端才能对发送给它的报文进行解密,从而提高了加密算法安全性。
如何防止通信过程中被第三方监听和截获?
依托 SSL 协议,使用 HTTPS 协议可以确保整个通信过程是经过加密的,密钥随机生成,并且能够通过数字证书验证双方的身份,以此来保障信息安全,可以有效防止通信过程中被第三方监听和截获。其中证书中包含了证书所代表一端的公钥,以及一些其所具有基本信息,如机构名称、证书所作用域名、证书的数字签名等,通过数字签名能校验证书的真实性。通信的内容使用对称加密方式进行加密,通信两端约定好通信密码后,通过公钥对密码进行加密传输,只有该公钥对应的私钥,也就是通信的另一端能够解密获得通信密码,这样既保证了通信的安全,也使加密性能和时间成本可控。
HTTPS 在传输层上多了一层 安全层 SSL(遵循常见用法,使用 SSL 来统称 TLS 和 SSL),所有请求和响应数据在经过网络传输前,都会先加密,再传输。SSL 是为网络通信提供安全和数据完整性性保障的一种安全协议,利用加密技术,以维护互联网数据传输的安全,验证通信双方的身份,防止数据在网络传输的过程中被拦截和窃听。
HTTPS 采用混合的加密机制通讯,首先使用非对称密钥加密用于传输时使用的对称密钥,保证了传输过程的安全性,然后使用获得的对称密钥加密信息进行通信,保证通信过程的效率。 HTTPS 同时支持单双向认证,单向认证是指只校验服务端证书的有效性,而双向认证则表示既校验服务端证书的有效性,又需要校验客户端证书的有效性。
那么 HTTPS 是加密通讯保证通讯安全的步骤是怎样的?
HTTPS 加密通讯的过程步骤主要有以下几个步骤。
1. 浏览器将自己支持的一套加密规则发送给网站。
2. 网站从中选出一组加密算法和 HASH 算法,并将自己的身份信息以证书的形式发回给浏览器。证书里面包含了网站地址,加密公钥,以及证书的颁发机构等信息。
3. 浏览器获得网站证书之后浏览器要做以下工作:
验证证书的合法性(颁发证书的机构是否合法,证书中包含的网站地址是否与正在访问的地址一致等),如果证书受信任,则浏览器栏里面会显示一个小锁头,否则会给出证书不受信的提示。
如果证书受信任,或者是用户接受了不受信的证书,浏览器会生成一串随机数的密码,并用证书中提供的公钥加密。
使用约定好的 HASH 算法计算握手消息,并使用生成的随机数对消息进行加密,最后将之前生成的所有信息发送给网站。
4. 网站接收浏览器发来的数据之后要做以下的操作:
使用自己的私钥将信息解密取出密码,使用密码解密浏览器发来的握手消息,并验证 HASH 是否与浏览器发来的一致。
使用密码加密一段握手消息,发送给浏览器。
5. 浏览器解密并计算握手消息的 HASH,如果与服务端发来的 HASH 一致,此时握手过程结束,之后所有的通信数据将由之前浏览器生成的随机密码并利用对称加密算法进行加密。
以上的通讯流程步骤流程图如下:
至此简单分享完毕,主要分享了网站常见的攻击手段,以及针对这些网站漏洞如何有效预防攻击。简单介绍了目前使用的网络安全防御手段,以及使用 HTTPS 协议传输数据,避免数据被窃听篡改。
相关文章
本站已关闭游客评论,请登录或者注册后再评论吧~