前言:
互联网时代,数据安全和个人隐私受到前所未有的挑战,各种新奇的攻击技术层出不穷。我们如何更好地保护我们的数据?本文主要着重分析几种常见的攻击类型和防御方法。
一. XSS
XSS (Cross-Site Scripting),跨站脚本攻击,因为缩写和CSS重叠,只能叫XSS。跨站脚本攻击是指在存在安全漏洞的网站注册用户的浏览器中运行非法HTML标签或JavaScript的攻击。
跨站点脚本攻击可能会产生以下影响:
利用虚假输入表单骗取用户个人信息。该脚本用于窃取用户的Cookie值,受害者在不知情的情况下帮助攻击者发送恶意请求。展示的虚假文章或图片。XSS的原理是恶意攻击者在网页中插入恶意的可执行脚本代码。当用户浏览页面时,嵌入在Web中的脚本代码就会被执行,这样攻击者就可以窃取用户的信息或者侵犯用户的安全和隐私。
XSS攻击千变万化,但仍可大致细分为几种类型。
1.非持久性XSS(反射性XSS)
非持久性XSS漏洞通常是由向他人发送带有恶意脚本代码参数的URL引起的。当URL地址被打开时,独特的恶意代码参数被HTML解析并执行。
例如,该页包含以下代码:
lt选择 gt lt脚本 gtdocument . write('+' lt;选项值= 1 gt'+location . href . substring(location . href . index of(' default = ')+8)+' lt;/option gt;');document . write(' lt;选项值= 2 gt英语 lt/option gt;'); lt/script gt; lt/select gt;
攻击者可以通过网址直接攻击(类似于:攻击。
非持续性XSS漏洞攻击具有以下特征:
即时,无需服务器存储,直接通过漏洞,需要保证这样几件事:
网页的所有内容或呈现数据必须来自服务器。尽量不要从URL、document.referrer、document.forms等DOM API中获取数据直接渲染。尽量不要使用eval,new Function(),document.write(),document.writeln(),window.setInterval(),window.setTimeout(),innerHTML,document.createElement()等可执行字符串等方法。如果做不到以上几点,还必须对涉及DOM渲染的方法传入的字符串参数进行转义。前端呈现中的任何字段都需要转义转义编码。2.持久性XSS(存储XSS)
持续性XSS漏洞一般存在于表单表单提交等交互功能中,如文章评论、文本信息提交等。黑客利用XSS漏洞通过正常功能将内容提交到数据库进行持久存储。当前端页面得到后端从数据库中读取的注入代码时,恰好被渲染执行。
例如,对于评论功能,我们必须防范持续的XSS攻击,因为我可以在评论中输入以下内容
页面注入的主要方式类似于非持续性XSS漏洞,只是持续性的不是来自URL、referer、forms等。,而是来自后端从数据库中读取的数据。持久的XSS攻击不需要诱骗点击,黑客只需要在提交表单的地方完成注入,但是这次XSS攻击的成本还是比较高的。
成功的攻击需要同时满足以下条件:
POST请求提交表单的后端被入库,没有转义。后端从数据库中取出数据,不转义地输出到前端。获取前端后端数据,直接渲染到DOM中,不需要转义。持久的XSS有以下特点:
持久化,嵌入数据库,窃取用户的敏感和隐私信息,危害广泛。3.怎么防守?
对于XSS的攻击,通常有两种防御方法。
1) CSP
CSP本质上是一个白名单,开发者明确告诉浏览器哪些外部资源可以加载和执行。我们只需要配置规则,如何拦截由浏览器自己实现。这样我们可以最大限度地减少XSS的袭击。
通常,CSP可以通过两种方式启动:
例如,设置:
只能加载本地资源content-security-policy:default-src ' self'。
仅允许加载://*
允许加载任何源框架内容-安全-策略:子-src '无'
有关更多属性,请参见内容安全策略文档。
这样,只要开发者配置了正确的规则,即使网站存在漏洞,攻击者也无法执行其攻击代码,CSP的兼容性是好的。
2)转义字符
用户的输入永远不可信。最常见的方式是对输入输出的内容进行转义,对引号、尖括号、斜杠进行转义。
函数转义(str){ str = str . replace(/ amp;/g,' amp')str = str . replace(/ lt;/g,' lt')str = str . replace(/ gt;/g,' >;')str = str . replace(///g,' quto')str = str.replace(/'/g,' # 39;)str = str.replace(/`/g,' # 96;)str = str.replace(/\//g,' f .)返回字符串}
但是,对于显示富文本,显然不可能通过上述方法对所有字符进行转义,因为这样会过滤掉所需的格式。这种情况下通常采用白名单过滤,当然也可以采用黑名单过滤。但考虑到要过滤的标签和标签属性太多,更推荐白名单。
const XSS = require(' XSS ')let html = XSS(' lt;h1 gtXSS演示 lt/h1 gt; lt脚本 gtalert(" XSS "); lt/script gt;')//- gt; lth1 gtXSS演示 lt/h1 gt; lt脚本 gtalert(" XSS "); lt/script gt;console.log(html)
上面的例子是用js-xss实现的,可以看到输出中h1标签被保留,script标签被过滤。
3) 。
这是对窃取用户cookie的XSS攻击最有效的防御。当Web应用程序设置cookie时,其属性被设置为information。
二。跨站点请求伪造
CSRF(跨站请求伪造),即跨站请求伪造,是一种常见的Web攻击。它利用用户的登录身份,在用户不知情的情况下,以用户的名义完成非法操作。
1.csrf攻击的原理
我们先介绍一下CSRF攻击的原理:
完成对CSRF的攻击需要三个条件:
用户已经登录到站点A并在本地记录了cookie。在没有注销站点A的情况下(即cookie有效时),用户访问了恶意攻击者提供的引诱性危险站点B(站点B要求访问站点A)。一个网站没有做任何CSRF防御。我们来看一个例子:我们登录转账页面,突然看到“XXX隐私照,不看后悔一辈子”的链接。我们按捺不住内心的躁动,立即点击了危险网站(页面代码如下图所示)。但是,一旦加载了这个页面,我们将执行submitForm方法来提交转账请求,从而将10件转账给黑客。
2.怎么防守?
可以遵循以下规则来防止CSRF攻击:
Get request不修改数据,防止第三方网站访问用户Cookie,防止第三方网站使用验证信息(如验证码或令牌)请求接口请求1) SameSite。
您可以在Cookie上设置SameSite属性。该属性表示Cookie不会随跨域请求一起发送,这可以大大减少CSRF攻击。但是,该属性目前并不兼容所有的浏览器。
2)推荐人检查
进攻。
但在某些情况下,比如从攻击。
3)反CSRF令牌
目前,完美的解决方案是添加反CSRF令牌。也就是说,当发送请求时,只有当所有的值都存在并且相等时,它才被视为合法请求。否则,该请求将被视为非法,服务将被拒绝。
这种方法比引用检查安全得多。令牌可以在用户登录后生成,并放入会话或cookie中,然后服务器在每次请求时将令牌从会话或cookie中取出,并与该请求中的令牌进行比较。由于令牌的存在,攻击者无法再构造一个完整的URL来实施CSRF攻击。但是在处理多页面共存时,当某个页面消耗了令牌,其他页面的表单仍然保留着消耗的令牌,在提交其他页面的表单时会出现令牌错误。
4)验证码
在应用程序与用户的交互过程中,尤其是账户交易的核心步骤,用户被迫输入验证码来完成最终请求。在正常情况下,验证码足以阻止CSRF攻击。但是添加验证码降低了用户体验,网站也不能对所有操作都添加验证码。所以验证码只能作为辅助手段,可以在关键业务点设置验证码。
三。点击劫持
点击劫持是一种视觉欺骗的攻击方式。攻击者通过嵌套iframe将需要攻击的网站嵌入到自己的网页中,并将iframe设置为透明,露出页面中的一个按钮,诱导用户点击。
1.特征
隐蔽性高,利用iframe或其他标签的属性,骗取用户操作“UI- overlay攻击”。2.点击劫持的原理。
用户登录网站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; } lt;/stylegt; ...... lt;buttongt;点击脱衣lt;/buttongt; lt;img src=";iframe { width:1440 px;高度:900px位置:绝对;top:-0px;左:-0px;z指数:2;-moz-opacity:0;不透明度:0;滤镜:alpha(不透明度= 0);}按钮{ position:absolute;顶配:270px左:1150pxz指数:1;宽度:90px高度:40px} lt/style gt;...... ltbutton gt点击条
从上图可以看出,攻击者利用图片作为页面背景,隐藏了用户操作的真实界面。当你忍不住好奇地点击按钮时,真正的点击其实是隐藏页面的订阅按钮,然后你会在不知情的情况下订阅。
3.怎么防守?
1)X-框架-选项
X-FRAME-OPTIONS是一种嵌套的点击劫持攻击。
响应标头有三个可选值,即
DENY,表示页面不允许通过iframe显示SAMEORIGIN,表示页面可以在同一个域名下通过iframe显示ALLOW-FROM,表示页面可以在指定来源的iframe中显示2)JavaScript defense。
对于一些古老的浏览器来说,它无法支持上述方法,只好通过JS来防御clickjacking。
lthead gt ltstyle gthtml { display:无!重要;} lt/style gt; lt/head gt; ltbody gt lt脚本 gtif(self = = top){ var style = document . getelementbyid(' click-jack ')document . body . remove child(style)} else { top . location = self . location } lt;/script gt; lt/body gt;
上面这段代码的作用是,当iframe加载页面时,攻击者的网页不会直接显示所有内容。
推荐一款好用的BUG监控工具Fundebug,欢迎免费试用!
四。URL跳转漏洞
定义:借助未经验证的URL跳转,将应用程序引导到不安全的第三方区域而导致的安全问题。
1.URL跳转漏洞原理
利用黑客网址跳转漏洞诱导安全意识不高的用户点击,导致用户信息泄露或资金损失。原理是黑客构造恶意链接(链接需要尽可能伪装混淆)在QQ群或者有很多浏览量的贴吧/论坛里发送。
安全意识低的用户点击,被服务器或浏览器解析后,跳转到恶意网站。
恶意链接需要伪装。通常,熟悉的链接后面会跟着一个恶意的URL,以便迷惑用户。
例如,您能否将以下网址识别为恶意网址?
2.实施模式:
表头跳转Javascript跳转META标签跳转这里,我们来给出一个表头跳转的实现:
lt?PHP $ URL = $ _ GET[' jump to '];header(" Location:$ URL ");? gt
这里的用户会认为这是恶意网址。
3.怎么防守?
1)引用者的局限性
如果确定了URL参数的来源,就可以通过这种方式实现安全限制,保证URL的有效性,防止恶意用户自己生成跳转链接。
2)添加验证令牌
我们保证所有生成的链接都来自我们的信任域。通过在生成的链接中添加用户的不可控令牌来验证生成的链接,可以防止用户自己生成恶意链接而被利用。但如果要求功能本身相对开放,可能会导致一定的限制。
动词 (verb的缩写)SQL注入
SQL注入是一种常见的网络安全漏洞。通过利用此漏洞,攻击者可以访问或修改数据,或者利用潜在的数据库漏洞进行攻击。
1.1的原则。SQL注入
让我们以万能钥匙为例来说明其原理:
ltform action = "/log in " method = " POST " gt; ltp gt用户名: ltinput type = " text "/ gt; lt/p gt; ltp gt密码: ltinput type = " password "/ gt; lt/p gt; ltp gt ltinput type = " submit " value = " log in "/>; lt/p gt; lt/form gt;
后端的SQL语句可能如下所示:
let query SQL = ` SELECT * FROM user WHERE username = ' $ { username } ',PSW = ' $ { password } ' `;//下一步是执行sql语句...
这是我们经常看到的登录页面,但是如果恶意攻击者输入用户名admin' -并随意输入密码,就可以直接登录系统。为什么!-这是SQL注入。
我们之前期望的SQL语句是:
SELECT * FROM用户,其中用户名='admin '和psw='password '
但是恶意攻击者使用奇怪的用户名将您的SQL语句更改为以下形式:
SELECT * FROM user其中username='admin' -'和psw='xxxx '
在SQL中,'-表示关闭和注释,-表示注释后的内容,因此查询语句变为:
SELECT * FROM username = ' admin '的用户
所谓的主密码本质上是一种使用SQL注入的方式。
SQL注入的流程包括以下过程:
根据我们构造的参数的语义,获取用户请求参数拼接成代码的SQL语句成功SQL注入的必要条件:
1.您可以控制输入数据。
2.由服务器执行的代码拼接受控数据。
我们会发现,SQL注入的过程和普通的请求服务器差不多,只是黑客控制数据,构造SQL查询,而普通的请求不做SQL查询。SQL注入的本质是数据和代码不分离,即数据作为代码执行。
2.危险
获取数据库信息管理员的后台用户名和密码获取其他敏感数据库信息:用户名、密码、手机号、身份证、银行卡信息...整个数据库:脱裤子获取服务器权限,植入Webshell,获取服务器后门读取敏感服务器文件。3.怎么防守?
严格限制Web应用的数据库的操作权限,为用户提供只能满足其工作的最低权限,最大限度地减少注入攻击对数据库的危害。后端代码检查输入数据是否符合预期,并严格限制变量的类型,比如使用正则表达式进行一些匹配处理。对于特殊字符(',",,<, gt, amp,*,;等等。)进行转义处理,或编码转换。基本上所有后端语言都有对字符串进行转义的方法,比如lodash的lodash。_escapehtmlchar库。的所有查询语句都建议使用数据库提供的参数化查询接口。参数化语句使用参数,而不是将用户输入变量嵌入到SQL语句中,也就是说,不直接拼接SQL语句。比如Node.js中mysqljs库的查询方法中?占位符参数。不及物动词操作系统命令注入攻击
OS命令注入类似于SQL注入,除了SQL注入用于数据库,而OS命令注入用于操作系统。OS注入攻击是指通过Web应用程序执行非法的操作系统命令,达到攻击的目的。只要能调用Shell函数,就有被攻击的风险。如果调用Shell时有遗漏,可以执行插入的非法命令。
命令注入攻击可以从Windows或Linux操作系统的命令行向Shell发送命令来启动程序。也就是说,安装在可执行操作系统上的各种程序受到命令注入的攻击。
1.原则
黑客构造的命令被提交给web应用,web应用提取黑客构造的命令并将其拼接到执行的命令中。由于黑客注入的命令打破了原来的命令结构,web应用程序执行额外的命令,最后web应用程序将执行结果输出到响应页面。
我们通过一个例子来说明它的原理。假设需要实现一个需求:用户向服务器提交一些内容,然后在服务器中执行一些系统命令,向用户返回一个结果。
//以Node.js为例,如果需要下载用户指定的repo const exec = require(' mz/child _ process ')。界面中github的exec设params = {/*用户输入的参数*/};exec(` git clone $ { params . repo }/some/path `);
如果传入了params.repo,则下载所需的代码。
但是如果params.repo是通过权限传入的就不好了。
2.怎么防守?
对后端前端提交施加规则限制(比如正则表达式)。在调用系统命令之前,所有传入的参数都被转义,并被命令行参数过滤掉。不是直接拼接命令语句,而是用一些工具做拼接和转义预处理,比如Node.js的shell-escape npm包以上是常见的web安全漏洞和防御方法!