Code前端首页关于Code前端联系我们

六大网络安全攻防分析及防御方法

terry 2年前 (2023-09-28) 阅读数 101 #Web安全

本文主要分析几种常见的攻击类型及防御方法。

1。 XSS

XSS(Cross-Site Scripting),跨站脚本攻击,因为缩写与CSS重叠,所以只能称为XSS。跨站脚本攻击是通过在易受攻击网站的注册用户的浏览器中执行非法 HTML 标签或 JavaScript 来执行的攻击。

跨站脚本攻击可能会造成以下影响:

  • 不正确地使用输入表单来欺骗用户的个人信息。
  • 使用脚本窃取用户cookie的值,受害者在不知不觉中帮助攻击者发送恶意请求。
  • 显示虚假文章或图片。

XSS背后的原理是恶意攻击者在网页中添加恶意的可执行Web脚本代码。当用户浏览页面时,嵌入在网络中的脚本代码被执行,攻击者可以窃取用户信息。或用于其他侵犯用户安全和隐私的目的

XSS攻击方式不断变化,但仍然可以大致分为几种类型。

1。非持久性 XSS(反射型 XSS)

非持久性 XSS 漏洞通常通过发送 带有恶意脚本代码参数的 URL 唯一参数代码(当 URL 为配对代码时)来发送给他人。并使用 HTML 执行。 六大Web安全攻防解析及防御的方法

例如页面包含以下代码:

<select>
    <script>
        document.write(''
            + '<option value=1>'
            +     location.href.substring(location.href.indexOf('default=') + 8)
            + '</option>'
        );
        document.write('<option value=2>English</option>');
    </script>
</select>
复制代码

攻击者可以直接访问该URL(类似:https://xxx.com/xxx?default=alert(document. cookie )) 添加可执行脚本代码。然而,某些浏览器(例如Chrome)具有内置的XSS过滤器,可以阻止大多数反射的XSS攻击。

非持久性XSS漏洞攻击具有以下特点:

  • 无需服务器存储即可立即进行攻击,可以直接通过HTTP GET和POST请求获取用户隐私信息。
  • 攻击者需要欺骗点击并触发用户点击链接
  • 响应率低,使得修复难以检测和反应
  • 窃取用户的敏感机密信息

为了防止非持久性XSS漏洞,您必须确保以下事项:

  • 所有用于渲染网页或渲染数据的内容都必须来自服务器。? 期望从此 DOM API 获取数据并直接渲染。
  • 不要使用evalnew function()、u、编写。 ,document.writeln(),window.setInterval(),window.setTimeout() ,,window.createElement( )等可执行字符串方法。
  • 如果您无法执行上述操作,您还应该避免将字符串参数传递给涉及 DOM 渲染的方法。
  • 用户界面渲染期间所有字段都需要转义编码。

2。持久性XSS(已存储) 将操作发送到数据库进行持久化。当前端页面接收到后端从数据库读取的输入代码时,恰好会被渲染并执行。 六大Web安全攻防解析及防御的方法

比如评论功能,要防止不断的XSS攻击,因为我在评论中输入的以下内容不是来自URL地址、参考文献、表格等,而是来自数据后端从数据库读取。持久 XSS 攻击不需要点击诱饵。黑客只需在提交表单的地方执行插入操作。不过这种XSS攻击的成本还是比较高的。

一次成功的攻击需要同时满足以下条件:

  • POST请求提交表单直接进入数据库,没有后端转义。
  • 后台部分从数据库中取出信息,直接打印到用户界面,无需转义。
  • 前端部分接收后台数据,直接渲染到DOM,不进行转义。

持久性XSS具有以下特点:

  • 持久性,植入数据库
  • 窃取用户敏感隐私信息
  • 漏洞范围广

。如何防御

XSS 攻击通常有两种防御方法。

1)CSP

CSP有效地建立了白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只需要定义规则,浏览器就会自行监听。这样我们就可以最大限度地减少 XSS 攻击。

CSP 通常可以通过两种方式启用:

  • 在 HTTP 标头中设置 Content-Security-Policy
  • 设置内容描述字段

这里是设置 HTTP 标头的示例:❙❙加载此资源站点

Content-Security-Policy: default-src 'self'
复制代码
  • 只允许上传 HTTPS 协议的图片
Content-Security-Policy: img-src https://*
复制代码
  • 允许所有源帧
Content-Security-Policy: child-src 'none'
复制代码

更多属性可以在 Content-Security-Policy 文档中找到 ,只要开发者定义了正确的规则,即使站点存在漏洞,攻击者也无法执行其攻击代码,并且 CSP 兼容性也很好。

2) Esc 字符

用户输入永远不可信。最常见的方式是转义输入和输出内容。转义引号、尖括号和斜杠

function escape(str) {
  str = str.replace(/&/g, '&amp;')
  str = str.replace(/</g, '&lt;')
  str = str.replace(/>/g, '&gt;')
  str = str.replace(/"/g, '&quto;')
  str = str.replace(/'/g, '&#39;')
  str = str.replace(/`/g, '&#96;')
  str = str.replace(/\//g, '&#x2F;')
  return str
}
复制代码

但以显示 RTF 文本为例,很明显,用上述方法无法转义所有字符,因为它还过滤了所需的格式。在这种情况下,通常会使用白名单过滤。当然,也可以使用黑名单过滤。但是,考虑到标签和标签属性太多需要过滤,因此白名单方法是更可取的。

const xss = require('xss')
let html = xss('<h1 id="title">XSS Demo</h1><script>alert("xss");</script>')
// -> <h1>XSS Demo</h1>&lt;script&gt;alert("xss");&lt;/script&gt;
console.log(html)
复制代码

上面的例子是用js-xss实现的。您可以看到 h1 标签被保留,并且 script 标签在输出中被过滤。

3) HttpOnly Cookie。

这是防止XSS攻击窃取用户cookie的最有效的防御方法。当Web应用程序设置cookie时,将其属性设置为HttpOnly可以防止网站的cookie被客户端恶意JavaScript窃取,保护用户的cookie信息。

2。 CSRF

CSRF(跨站请求伪造)是一种常见的在线攻击。它用于在用户不知情的情况下窃取用户的登录身份。代表他人进行非法活动。? 当用户没有退出A站点时(即cookie有效时),访问了恶意攻击者提供的危险站点B(B站点需要访问A站点)。

  • A站没有做CSRF防御
  • 看一个例子:当我们登录转账页面时,眼睛突然一亮“XXX私照,不做你会后悔一辈子”的链接“看不到他们”出现了当我心里难受的时候,我立即点击了一个危险网站(页面代码如下)。然而,页面一加载,就执行方法submitForm发送转账请求,将10个区块传输给黑客。 六大Web安全攻防解析及防御的方法

    2。如何保护自己

    您可以通过遵循以下规则来防止 CSRF 攻击:

    • 搜索请求不会更改数据
    • 不允许第三方网站访问用户 cookie
    • 阻止第三方网站。来自请求接口的
    • 请求会附带确认信息,例如确认码或Token

    1) SameSite

    您可以在cookie中设置SameSite属性。该属性表示跨域请求时不发送cookie,可以大大减少CSRF攻击。不过,该属性目前并不兼容所有浏览器。

    2) 引用检查

    HTTP 引用是标头的一部分。当浏览器向Web服务器发送请求时,通常会带上Referer信息来告诉服务器它是从哪个页面链接过来的,服务器可以利用它来获取信息。进行加工。通过检查请求的来源可以防止 CSRF 攻击。正常请求的referrer有一定的规则。例如,表单提交的引用者必须是在此页面上启动的请求。所以通过检查http header的referrer值是否是这个页面来判断是否是CSRF攻击

    但在某些情况下,比如从 https 切换到 http 时,浏览器出于安全原因不会发送引用,服务器也无法检查。如果该站点域内的其他网站存在XSS漏洞,攻击者就可以向其他网站注入恶意脚本。在同一域中输入此类 URL 的受害者也会受到攻击。由于上述原因,并不能完全依赖Referer Check作为防范CSRF的主要手段。但是,可以使用 Referer Check 来监控 CSRF 攻击的发生。

    3)Anti-CSRF Token

    目前比较完善的解决方案是添加Anti-CSRF-Token。也就是说,在发送请求时,随机生成的token以参数的形式添加到HTTP请求中,并在服务器上设置拦截器来检查该token。服务器读取浏览器当前域的cookie token,并检查请求中的token和cookie token的值是否相同,然后才认为这是一个合法的请求。否则,该请求将被视为非法并拒绝服务。

    这个方法比推荐人检查安全得多。可以在用户登录后创建令牌并将其设置在会话或 cookie 中,然后服务器在每次请求时从会话或 cookie 中取出该令牌,并比较该请求上的令牌。由于token的存在,攻击者无法再构造完整的URL来执行CSRF攻击。然而,在处理多页面共存问题时,当某个页面消耗了token时,其他页面上的表单仍然存储着消耗的token,而在其他页面上提交表单时会出现token错误。

    4)​​​​验证码

    在应用与用户的交互过程中,尤其是账户交易的核心阶段,用户必须输入验证码才能完成最终的请求。一般情况下,验证码足以遏制CSRF攻击。 但是添加验证码会削弱用户体验。本站无法为所有功能添加验证码。因此,验证码只能作为辅助,在关键业务点设置验证码。

    3。点击劫持

    点击劫持是一种视觉欺诈攻击方法。攻击者利用iframe嵌入的方式将被攻击网站嵌入到自己的网页中,使iframe透明,并在页面上暴露一个按钮,提示用户点击。 ?当攻击者登录A网站系统时,被诱骗打开第三方网站,第三方网站通过iframe呈现A网站的页面内容。当用户点击第三方网站上的按钮(装饰按钮)时,实际上是点击了网站A上的按钮。举个例子:我在优酷上发布了很多视频,我希望更多的人关注它们。我可以通过点击捕获来做到这一点

    iframe {
    width: 1440px;
    height: 900px;
    position: absolute;
    top: -0px;
    left: -0px;
    z-index: 2;
    -moz-opacity: 0;
    opacity: 0;
    filter: alpha(opacity=0);
    }
    button {
    position: absolute;
    top: 270px;
    left: 1150px;
    z-index: 1;
    width: 90px;
    height:40px;
    }
    </style>
    ......
    <button>点击脱衣</button>
    <img >
    <iframe  scrolling="no"></iframe>
    复制代码
    六大Web安全攻防解析及防御的方法

    如上图所示,攻击者使用图像作为页面背景来隐藏用户。在该操作的实际用户界面中,当您出于好奇而单击按钮时,您实际上是在隐藏页面上单击了订阅按钮,然后您在不知不觉中被订阅了。 六大Web安全攻防解析及防御的方法

    3。如何防御

    1) X-FRAME-OPTIONS

    此 HTTP 响应标头旨在防止 iframe 中的嵌套点击攻击。

    响应头有三个可选值,分别是

    • DENY,表示该页面不能通过iframe显示
    • SAMEORIGIN,表示该页面可以通过同域的iframe显示
    • ALOW - FROM,表示页面可以从iframe中指定的源开始显示

    2)JavaScript防护

    在一些旧的浏览器中,不支持上述方法,所以我们只能使用JS来防御单击“被劫持”。

    <head>
      <style id="click-jack">
        html {
          display: none !important;
        }
      </style>
    </head>
    <body>
      <script>
        if (self == top) {
          var style = document.getElementById('click-jack')
          document.body.removeChild(style)
        } else {
          top.location = self.location
        }
      </script>
    </body>
    复制代码

    上面代码的目的是,当通过iframe加载页面时,攻击者的网页不会显示所有内容。

    4。 URL跳转漏洞

    定义:未经验证的URL跳转将应用程序重定向到不安全的第三方域,从而导致安全问题。

    1。 URL跳转漏洞原理

    黑客利用URL跳转漏洞诱骗安全意识较低的用户点击,导致用户数据泄露或资金损失。其原理是黑客建立恶意链接(将链接伪装成尽可能令人困惑),并将其发布在高流量的QQ群或留言板/论坛中。当安全意识较低的用户点击时,经过服务器或浏览器解析后,会被重定向到恶意网站。 六大Web安全攻防解析及防御的方法

    有害链接必须隐藏。常见的做法是在熟悉的链接后添加恶意 URL 来迷惑用户。 六大Web安全攻防解析及防御的方法

    如果伪装成以下 URL,您是否能识别出恶意 URL? ? www.wooyun.org

    都是值得信赖的,但点击上面的链接将引导用户到www.evil.com,恶意URL。?链接

    2)添加有效性验证令牌

    我们确保所有生成的链接都来自我们的可信域,并且我们通过向生成的链接添加非用户控制的令牌来验证生成的链接。它可以防止用户创建自己的恶意链接并被利用,但如果功能本身相对开放,则可能会导致一定的限制。

    5. SQL注入

    SQL注入是一种常见的网络安全漏洞。攻击者可以利用此漏洞访问或修改数据或利用潜在的数据库漏洞进行攻击。 ?但如果恶意攻击者输入用户名admin'--,输入想要的密码就可以直接登录系统。为什么! ----这就是 SQL 注入

    之前预期的 SQL 语句是:

    SELECT * FROM user WHERE username='admin' AND psw='password'
    复制代码

    但是恶意攻击者使用奇怪的用户名将你的 SQL 语句改为:

    SELECT * FROM user WHERE username='admin' --' AND psw='xxxx'
    复制代码

    in SQL ' -- 的意思结束语和注释,--表示注释后的内容,所以查询就变成:

    SELECT * FROM user WHERE username='admin'
    复制代码

    所谓万能密码,基本上就是SQL注入方式的应用。 ? : 1. 输入的数据可以被控制 2. 服务器执行的代码与受控数据结合。 六大Web安全攻防解析及防御的方法

    我们发现SQL注入过程与发送到服务器的正常请求类似,只不过黑客控制了数据并形成SQL查询,而正常请求不包含SQL查询步骤。 SQL注入的本质:数据和代码没有区别,数据是作为代码执行的。

    2。危险

    • 获取数据库信息
      • 系统管理员后台用户名和密码
      • 获取其他敏感数据库信息:用户名、密码、手机号码、身份证、银行卡信息...
      • 获取整个数据库:脱裤子
    • 获取服务器访问权限
    • 植入Webshel​​l并获取服务器后门
    • 读取服务器上的敏感文件

    3.如何捍卫数据库的运行严格目的

    ,给予该用户只能满足其工作的最低访问权限,从而最大限度地减少注入攻击对数据库的危害

  • 后端检查输入数据是否符合预期,严格约束变量,例如使用正则表达式,进行一些匹配。
  • 对到达数据库的特殊字符(',",\,,&,*,;等)进行转义或编码。基本上所有后端语言都有对应的字符串。像lodash的lodash这样的方法._escapehtmlchar -library.
  • 所有查询语句建议使用数据库提供的参数化查询接口​​.参数化语句使用参数而不是在In,SQL语句中嵌入用户输入变量不要直接连接SQL语句。例如,Node.js 的 mysqljs- ? 库查询方法的占位符参数
  • 6. 操作系统命令注入攻击

    操作系统命令注入与 SQL 注入类似,只不过 SQL 注入是针对数据库的,而操作系统命令注入是针对数据库的针对操作系统的OS命令注入攻击是指通过Web应用程序执行非法的操作系统命令来达到攻击的目的。只要能够调用Shell函数,就会存在被攻击的风险。如果调用Shell时出现缺陷,则可以执行添加的非法命令。

    命令注入攻击可以向命令行发送命令,Windows或Linux操作系统的命令行通过该命令启动程序。换句话说,通过命令注入攻击安装在正在执行的操作系统上的程序。

    1。原理

    六大Web安全攻防解析及防御的方法

    黑客构建命令并将其发送到 Web 应用程序。 Web 应用程序提取黑客构建的命令,并将其作为执行命令的一部分附加到已执行的命令中。因为黑客注入的命令破坏了原有的命令结构,然后Web应用程序执行额外的命令,最后Web应用程序在响应页面上打印执行结果。我们用一个例子来说明它的原理。假设我们需要实现一个需求:用户发送内容到服务器,然后服务器执行一些系统命令将结果返回给用户

    // 以 Node.js 为例,假如在接口中需要从 github 下载用户指定的 repo
    const exec = require('mz/child_process').exec;
    let params = {/* 用户输入的参数 */};
    exec(`git clone ${params.repo} /some/path`);
    复制代码

    如果 params.repo 被传递,其中 https://github.com/admin/admin.github.io.git确实可以从指定的git repo下载所需的代码。但是,如果 params.repo 传入 https://github.com/xx/xx.git && rm -rf /* && 作为服务的 root 用户,它会启动。坏的。

    2。如何防止

    • 后端系统对用户界面发送的内容进行规则限制(如正则表达式)。
    • 在调用系统命令之前对所有传入参数进行命令行参数转义过滤。
    • 不要直接粘贴命令,而是使用一些工具粘贴并避免预处理,例如Node.js的shell-escape npm包Langliing六大Web安全攻防解析及防御的方法

      链接:https://juejin.im / post/5c446eb1e51d45517624f7db
      来源:掘金
      版权归作者所有。商业转载请联系作者获得许可。非商业转载请注明出处。

    版权声明

    本文仅代表作者观点,不代表Code前端网立场。
    本文系作者Code前端网发表,如需转载,请注明页面地址。

    热门