sisterAn/blog

除了CSRF,你还知道其它的攻击方式吗?

Opened this issue · 0 comments

我所了解的,除了 CSRF ,还有:

  • XSS 攻击
  • SQL 注入攻击
  • DDoS 攻击
  • 上传文件漏洞
  • DNS 查询攻击

XSS 攻击

什么是 XSS 攻击

XSS 是跨站脚本攻击(Cross Site Scripting),为了与 CSS 区别开来,故简称 XSS

XSS 攻击是指往页面恶意的注入脚代码本。当用户浏览该页时,嵌入其中的 Script 代码会被执行,从而达到恶意攻击用户的目的。

当页面被注入了恶意 JavaScript 脚本时,浏览器是无法区分这些脚本是否是被恶意注入的还是正常的页面脚本,所以恶意注入 JavaScript 脚本也拥有所有的脚本权限。它可以拿到:

  • Cookie 信息

    document.cookie 获取 Cookie 信息,然后通过 XMLHttpRequest 或 Fetch 加上 CORS 功能将数据发送给恶意服务器

  • 监听用户行为

    通过 addEventListener 监听用户行为,获取用户输入的银行卡支付密码等信息

  • 更改 DOM 结构

    伪造登录、输入支付秘密等窗口,获取用户私密信息

  • 在页面内生成浮窗广告

  • 劫持流量实现恶意跳转

    例如在网页中恶意注入以下语句:

    <script>window.location.href="https://www.pzijun.cn/";</script>

    当网站被访问时就会自动跳到瓶子君的官网首页。早在2011年新浪就曾爆出过严重的 XSS 漏洞,导致大量用户自动关注某个微博号并自动转发某条微博。具体各位可以自行百度

黑客一旦拿到这些信息,就可以对用户进行攻击,例如模拟用户登录、进行转账等,所以我们应该学习并避免黑客对我们的网站进行攻击,维护网站安全,从以下方面切入:

  • XSS 是如何注入的
  • 如何阻止 XSS 攻击

XSS 是如何注入的

其中常见的 XSS 攻击主要分为:存储型 XSS 攻击 、反射型 XSS 攻击 、基于 DOM 的 XSS 攻击

1. 存储型 XSS 攻击

存储型 XSS 攻击是指黑客利用站点漏洞将一段恶意 JavaScript 代码提交到网站的数据库中 存储 ,当用户访问网站的时候,网站将恶意脚本同正常页面一起返回,浏览器解析执行了网站中的恶意脚本,将用户的 Cookie 信息等数据上传到恶意服务器

存储型 XSS 攻击经常出现在个人信息或发表文章等地方,插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种 XSS 比较危险,容易造成蠕虫,盗窃 cookie 等

2. 反射型 XSS 攻击

反射型 XSS 一般是黑客通过特定的手段(例如电子邮件等),诱导用户去访问一个包含恶意脚本的 URL,当用户访问这个带有恶意脚本的 URL 时,网站又把恶意 JavaScript 脚本返回给用户执行

反射型 XSS 通常出现在网站的搜索栏、用户登录口等地方,常用来窃取客户端 Cookies 或进行钓鱼欺骗

3. 基于 DOM 的 XSS 攻击

基于 DOM 的 XSS 攻击是指通过恶意脚本修改页面的 DOM 结构,是纯粹发生在客户端的攻击。

DOM 型 XSS 攻击中,取出和执行恶意代码由浏览器端完成,属于前端 JavaScript 自身的安全漏洞。

总结

存储型 XSS: 持久化,代码是存储在服务器中的

反射型 XSS: 非持久化,需要欺骗用户自己去点击链接才能触发 XSS 代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面

基于 DOM 的 XSS: 不经过后端,纯粹发生在客户端的攻击,属于前端 JavaScript 自身的安全漏洞

如何阻止 XSS 攻击

无论是上面的哪种 XSS 攻击,都是恶意的向浏览器注入脚本,然后通过恶意脚本将用户信息发送到恶意服务器上,所以我们要阻止 XSS 攻击,就要阻止恶意脚本的注入与恶意信息的发送

常见的阻止 XSS 的策略有:

1. 过滤特殊字符,或对特定字符进行编译转码

例如对 <script>alert(document.cookie)</script> 进行过滤为 ,或直接转码成 &lt;script&gt;alert(&#39;document.cookie&#39;)&lt;/script&gt; ,这样就不会在页面执行了

2. 对重要的 cookie 设置 httpOnly

HttpOnly 最早由微软提出,至今已经成为一个标准。

通过对重要的 Cookie 设置 httpOnly ,防止客户端通过 document.cookie 读取 cookie ,也就是说,JavaScript 读取不到此条 Cookie ,也就无法提交给恶意服务器了

注意:此 HTTP 头由服务端设置

3. URLEncode 操作

将不可信的值输出 URL参数之前,进行 URLEncode操作。对于从 URL 参数中获取值一定要进行格式检测(比如你需要的时URL,就判读是否满足URL格式)

4. Web 安全头支持

浏览器自带的防御能力,一般是通过开启 Web 安全头生效的。具体有以下几个:

  • CSP :W3C 的 Content Security Policy,简称 CSP,主要是用来定义页面可以加载哪些资源,减少 XSS 的发生。要配置 CSP , 需要对 CSP 的 policy 策略有了解,具体细节可以参考 CSP 是什么
  • X-Download-Options: noopen :默认开启,禁用 IE 下下载框 Open 按钮,防止 IE 下下载文件默认被打开 XSS。
  • X-Content-Type-Options: nosniff :禁用 IE8 自动嗅探 mime 功能例如 text/plain 却当成 text/html 渲染,特别当本站点 server 的内容未必可信的时候。
  • X-XSS-Protection :IE 提供的一些 XSS 检测与防范,默认开启

SQL 注入攻击

SQL注入是一种非常常见的数据库攻击手段,也是网络世界中最普遍的漏洞之一,它其实就是黑客在表单中填写包含 SQL 关键字的数据,表单数据提交给服务器时让数据库执行恶意 SQL 的过程。

例如 ' OR '1'='1 ,当我们输如用户名 admin ,然后密码输如 ' OR '1'=1='1 的时候,我们在查询用户名和密码是否正确的时候,本来要执行的是 SELECT * FROM user WHERE username='' and password='' ,经过参数拼接后,会执行 SQL语句  SELECT * FROM user WHERE username='' and password='' OR '1'='1' ,这个时候1=1是成立,自然就跳过验证了。

如何防止 SQL 注入

主要是后端进行对 SQL 注入攻击的防护,常见的防护机制有:

  • 使用 preparestatement 预编译机制: 在sql语句执行前,对其进行语法分析、编译和优化,其中参数位置使用占位符 ? 代替了。当真正运行时,传过来的参数会被看作是一个纯文本,不会重新编译,不会被当做sql指令
  • 特殊字符转义: 些特殊字符,比如:%作为like语句中的参数时,要对其进行转义处理
  • 使用代码检测工具: 使用sqlMap等代码检测工具,它能检测sql注入漏洞
  • 数据库账号增加权限控制、数据库异常监控等等

DDoS 攻击

Dos 拒绝服务攻击(Denial of Service attack)是一种能够让服务器呈现静止状态的攻击方式。其原理就是发送大量的合法请求到服务器,服务器无法分辨这些请求是正常请求还是攻击请求,所以会照单全收。海量的请求造成服务器进入停止工作或拒绝服务的状态。

DDoS:分布式拒绝服务攻击(Distributed Denial of Service),DDos攻击是在 DOS 攻击基础上的,可以通俗理解,dos 是单挑,而 ddos 是群殴,因为现代技术的发展,dos攻击的杀伤力降低,所以出现了DDOS,攻击者借助公共网络,将大数量的计算机设备联合起来,向一个或多个目标进行攻击。

为了防御 DDoS 攻击,阿里巴巴的安全团队在实战中发现,需要做的就是检测技术和清洗技术,检测技术就是检测网站是否正在遭受 DDoS 攻击,而清洗技术就是清洗掉异常流量。这里不做引伸

上传文件攻击

如果 web 网站没有对文件类型进行严格的校验,导致可执行文件被恶意上传到了服务器,恶意脚本就会执行

如何防止上传文件攻击

  • 文件上传后放到独立的存储上,做静态文件处理,杜绝脚本执行的可能
  • 对上传文件类型进行白名单校验
  • 使用随机数改写文件名和文件路径等等

DNS 查询攻击

我们访问网站的时候,通常是通过域名访问,例如 pzijun.cn ,而互联网数据传输是通过 IP 的,例如 47.105.127.0 这种,DNS所干的事,就是把域名转换为IP,也即域名解析。比如浏览器拿到 https://www.pzijun.cn 后,通过DNS系统转换为IP,然后和该IP(比如 47.105.127.0 )建立通信,交互网页数据并向用户展示。

DNS 系统在计算域名的 IP 地址时,会先搜索自己的本地缓存,并检查它是否已具有该域的IP地址。如果它在本地缓存中找不到它,它会查询 DNS 服务器以检查它是否知道该域的准确IP地址,如果查询不到,DNS服务器会向其上层DNS服务器递归查询域名信息,直到全球互联网的13台根DNS服务器。

DNS解析器一旦找到IP地址,它就会将IP地址返回给请求程序。DNS缓存域地址以供将来使用。

DNS 查询攻击就是攻击者通过精心构造 DNS报文 ,在 DNS 查询解析某个域名时,冒充真正的权威 DNS 做出回应,使得用户访问得到一个虚假响应。一旦本地接受了这个虚假响应并写入缓存,DNS 就会被攻击,用户也不清楚自己正在访问错误的地址或数据

关于防御的话,就是限制DNS解析器仅响应来自可信源的查询或者关闭DNS服务器的递归查询等

总结

本文结合上篇 如果让你去实现一个 CSRF 攻击你会怎么做? ,总共介绍了六种 web 攻击与防护:

  • CSRF 攻击
  • XSS 攻击
  • SQL 注入攻击
  • DDoS 攻击
  • 上传文件漏洞
  • DNS 查询攻击

其中最重要的是 CSRF 攻击、 XSS 攻击,其余只做了解即可。

你还知道其它的吗?或对文中有任何异议,欢迎提交至 https://github.com/sisterAn/blog/issues ,你的每一次反馈对我们都至关重要,感谢