前端攻击与防御

一.Cookie挟持

攻击原理

由于HTTP是明文传输,Cookie很容易被盗取,如果被盗取,别人就可以冒充你的身份,打开你的保险柜,获取你的信息,动用你的资金,这是很危险的。

防御

  • 给cookie添加HttpOnly属性.只能在http请求中传递,在脚本中,document.cookie无法获取到该cookie值,对XSS攻击有防御作用,但对网络拦截还是会泄露。
  • 用https加密传输。

二.XSS跨站脚本攻击

攻击原理

攻击者在web页面恶意插入HTMLscript标签,当用户浏览该页面时,恶意代码就会被执行,从而达到攻击的目的。
XSS 利用的是用户对指定网站的信任

攻击类型

  • 储存型(持久型)

一般存在于 Form 表单提交等交互功能,如发帖留言,提交文本信息等,黑客利用的 XSS 漏洞,将内容经正常功能提交进入数据库持久保存,当前端页面获得后端从数据库中读出的注入代码时,恰好将其渲染执行。

防御

  • 前端校验表单输入,后端校验参数合法性。
  • 标签过滤,如scriptimga标签等。
  • 对特殊字符<>&" ' +/等进行转义。
  • cookie防盗,将cookie设置为http-only,js脚本将无法读取到cookie信息。

三.CSRF跨站伪造请求

攻击原理

在被攻击网站登录后引诱用户访问攻击网站,利用网站权限校验漏洞在用户不知觉情况下发送请求,达到 伪造 用户的目的。

  • 攻击 一般发起在第三方网站,而不是被攻击的网站,被攻击的网站无法防止攻击发生
  • 攻击 利用受害者被攻击网站的登录凭证,冒充受害者提交操作,而不是直接窃取数据
  • 整个过程攻击者并不能获取到受害者的登录凭证,仅仅是 冒用
  • 跨站请求可以用各种方式:图片 URL、超链接、CORS、Form 表单提交等等,部分请求方式可以直接嵌入在第三方论坛、文章中,难以进行追踪

对于服务器返回的结果,由于浏览器 同源策略 的限制,黑客也无法进行解析。因此,黑客无法从返回的结果中得到任何东西,他所能做的就是给服务器发送请求,以执行请求中所描述的命令,在服务器端直接改变数据的值,而非窃取服务器中的数据。所以,我们要保护的对象是那些可以直接产生数据改变的服务,而对于读取数据的服务,则不需要进行 CSRF 的保护。比如银行系统中转账的请求会直接改变账户的金额,会遭到 CSRF 攻击,需要保护。而查询金额是对金额的读取操作,不会改变数据,CSRF 攻击无法解析服务器返回的结果,无需保护
CSRF 利用的是网站对用户网页浏览器的信任。

典型的 CSRF 攻击有着如下的流程:

受害者登录 a.com,并保留了登录凭证 Cookie
攻击者引诱受害者访问了 b.com(黑客的攻击网站)
b.coma.com 发送了一个请求:a.com/act=xx,浏览器会默认携带 a.comCookie
a.com 接收到请求后,对请求进行验证,并确认是受害者的凭证,误以为是受害者自己发送的请求
a.com 以受害者的名义执行了 act=xxx
攻击完成,攻击者在受害者不知情的情况下,冒充受害者,让 a.com 执行了自己定义的操作

如下是建议的攻击代码

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>攻击者的网站b</title>
</head>

<body>
    <!-- img支持跨域 get -->
    <img src="https://a.com/转账" alt="">
    <!-- form支持跨域 post -->
    <form action="https://a.com/转账" method="post">
        <input type="text" name="s"/>
        <button>提交</button>
    </form>
</body>

</html>
在被攻击网站点击链接

这种类型通常是在论坛中发布的图片中嵌入恶意链接,或者以广告的形式诱导用户中招,攻击者通常会以比较夸张的词语诱骗用户点击,例如:

<a href="http://test.com/csrf/transfer.php?amount=1000&for=hacker" taget="_blank">重磅消息!!</a>
在攻击网站发送get请求攻击

利用img没有跨域限制的漏洞,发起get请求

<img src="http://bank.example/transfer?amount=10000&for=hacker" />
在攻击网站发送post请求攻击

利用form没有跨域限制的漏洞,发起post请求

     <form action="https://a.com/购物" method="post">
        <input type="text" name="s"/>
        <button>提交</button>
    </form> 

CSRF 攻击场景

  • 攻击者能够欺骗受害用户完成该受害者所允许的任一状态改变的操作
    • 如:更新账号信息、完成购物、注销甚至登陆等操作
  • 配合其他漏洞攻击CSRF 蠕虫
    • CSRF 蠕虫如其名所指就是产生蠕虫效果,会将 CSRF 攻击一传十,十传百。如:某社区私信好友的接口和获取好友列表的接口都存在CSRF漏洞,攻击者就可以将其组合成一个CSRF蠕虫――当一个用户访问恶意页面后通过数据劫持获取其好友列表信息,然后再利用私信好友的CSRF漏洞给其每个好友发送一条指向恶意页面的信息,只要有人查看这个信息里的链接,CSRF蠕虫就会不断传播下去,其可能造成的危害和影响非常巨大!”(这里获取好友列表需要用到数据劫持相关技术,因为CSRF可以发数据,但是拿不到接口返回的数据.)

防御

  • 不用cookie,用token
    • 浏览器并不会自动携带Token去请求,且Token可以携带一段加密的jwt用作身份认证,这样进行CSRF的时候仅传递了cookie`,并不能表明用户身份,网站即拒绝攻击请求。
  • referer来源地址校验
  • 多重校验,验证码,支付密码输入
  • 在http中自定义属性并验证

四.DDoS攻击(分布式拒绝服务攻击)

凡是能导致合法用户不能够正常访问网络服务的行为都算是DDoS攻击
分布式拒绝服务攻击一旦被实施,攻击网络包就会从很多 DoS 攻击源犹如洪水般涌向受害主机。从而把合法用户的网络请求淹没,导致合法用户无法正常访问服务器的网络资源。

攻击类型

  • 群殴

攻击者利用木马,蠕虫,后门等恶意程序感染大量设备形成僵尸网络,然后向目标服务发起海量请求达到攻击的效果

  • 霸占服务器网络的带宽资源

我们只需要向一台服务器发送大量的IP协议数据包,就可以消耗掉对方的带宽,比如用大家耳熟能详的ping工具就能发起一次攻击,ping产生的是icmp协议包,它是ip协议中用来进行差行差错控制的一个补充,本质上还是一个ip包,这种攻击方式也叫icmp洪水,这种攻击方式类似我们给某人一直投递信件,写了什么不重要,重要的是让信件多的排队,从而达到正常的信件收发. 同样的思路我们还可以向传输层发起UDP洪水,唯一的问题是攻击会暴露自己的ip,所以攻击者一般会伪造ip地址隐藏自己. 基于这种原理也将ip改为被攻击目标的ip,然后向大量的第三方机器发送数据,这些第三方机器也叫反射器.最后这些反射器又将请求的信息返回给攻击目标的ip,这种攻击也叫反射型攻击.在此基础上,人们又发明了一种dns放大攻击,比如dns是用来访问ip地址的设备,我们在浏览器中输入一个网址实际上需要先查询dns服务器获得这个域名的ip地址,同时dns查询通常使用udp这个不用验证来源的传输协议.综合来看dns就是一个用来方大的机器,因为一次dns请求返回的数据往往大于请求数据,在dns查询中一般60字节的请求数据可以获得3000字节的返回数据,产生了50倍的放大效果,这样如果我们让攻击者不断的向dns发起请求,并把来源地址伪造为攻击目标的ip,那么这样的反射攻击就能产生50倍的流量放大效果,可谓四两拨20斤

  • 攻击服务器的连接资源

服务器和客户端每次建立一个TCP连接时需要建立三次握手,然后把连接信息放入到连接表中进行维护,而连接表的大小是有限的.我们可以让发起攻击的设备直接发起大量的TCP连接从而占满这个表.而无法响应后续的TCP连接请求,这种直接的攻击方式也叫TCP洪水 ,但由于有三次握手的存在TCP无法通过IP隐藏自己,在建立连接时如果我们在第一次握手中伪造了ip,那么服务器向客户端发送数据的第二次握手就无法到达. 由此又染生了SYN洪水,就是只在第一次握手时做文章,这样做的好处是如果不回答服务器的SYN+ACK包,服务器考虑是网络环境的问题TCP有重传机制,对方会多次尝试发送SYN+ACK知道超时,但问题是我们每攻击一次就被对方攻击10次,所以SYN洪水一般会伪造IP祸水东引或是一个不存在的IP,让受害者不知所措.同理也可以利用反射,将源改为攻击目标IP然后向大量的第三方机器发送SYN包,这样大量的SYN+ACK数据包就会从各个机器涌入被攻击目标

  • RST洪水攻击

在TCP连接中一般可以用四次挥手结束连接,当是也可以发送一个RST数据包强制切断连接,这样我们让攻击设备不断尝试伪造各种ip地址并发送RST数据进行"盲打",一旦IP和某个正常用户匹配上,就能够切断正常用户和服务器之间的连接.这种攻击方式更针对用户,比如在一场吃鸡游戏中,在获悉对手的IP地址之后就可不断切断对方的游戏设备和服务器连接.

  • 向站点发起http洪水攻击,耗费服务器IO资源

比如利用站点的搜索功能,不断的生成大量的关键词送入查询地址,因为http请求作为用户直接发起的涉及具体业务的请求,服务器在收到请求后需要进行像数据库查询这样的IO操作,所以这样的攻击手法会对目标产生更大的消耗.当然这种攻击有个问题就是不能伪造IP地址,因为http协议是基于TCP协议的,需要经历三次握手的过程.所以常见的方法是借助网络代理主机得到不同的真实IP发起攻击.这对于一起资金充足有计划有阻止的攻击来说并不是什么难事

防御

激进的手术治疗
  • 捣毁僵尸网络,并让用户做好个人防护.避免被感染成为僵尸设备是一种很好的方法.但这是需要长期持续进行的方案.
  • 从ddos的攻击原理可以看出来,伪造IP地址是核心技术之一,一旦攻击者无法伪造ip地址,那攻击者如强弩之末.而治理伪造的方法并不复杂.
    • 现代互联网的下游,也就是用户设备接入的这端,设备通过路由(或者通过多个路由网关)接入互联网服务提供商.所以只要让路由设备检测IP.把源地址IP不属于本路由所在网段的数据都过滤掉,这样试图伪造ip的流量就无法发出.
    • 还有一个稍微复杂一点的分布式过滤方案,我们知道庞大的互联网中不同的网段依靠路由把彼此连接,一个数据所经过的真实路径不可能作假.而伪造ip发送的请求与真是ip发送的请求基本肯定不会一致.如果路由能根据IP地址的路径逻辑检测出矛盾,那么就可以过滤掉这样的流量,从而消灭伪造ip的伎俩.

当然一个涉及用户,服务商,设备商,甚至是监管部门等多方利益的技术方案,那就不只是一个技术问题,出于商业上投入产出的考虑往往是木已成舟,积重难返.后两种方案很难被执行,只有有一定影响力的大型企业和机构才能撬动这种涉及全球的多方合作.对于中小企业与创业者并不现实,所以人们提出了一些大家都能承担的起的缓解攻击的保守治疗方案

稳妥的保守治疗
  • cdn分布式服务

当一个僵尸网络对目标发起攻击时,很难处理这些来自四面八方的流量,cdn可以把一个网络服务的流量分散到不同的地方从而稀释攻击的流量,这样在一定程度上缓解了DDoS攻击

  • 流量清洗

我们在服务器前架设一台流量清洗设备,这个设备帮我们抵抗DDoS攻击,比如,面对TCP协议的SYN洪水DDoS攻击,客户端发起SYN先经过清洗设备,由清洗设备回复SYN+ACK,如果对方应答了那说明是正常流量,清洗设备再把本次的连接交给服务器正常通信,如果对方不应答,清洗设备改重试重试超时后就断开连接. 再比如http洪水攻击,正常来说一个http请求很难用传统的方式检测出是恶意流量还是正常流量,而清洗设备往往会提供专业的流量清洗平台,这些做专业清洗的服务商通过多年和DDoS攻击的对抗积累了大量的经验和技术.比如,由于http协议无法伪造IP,所以通过多年的技术积累建立IP信用库,从那些经常发起攻击的IP发来的流量就会被过滤掉.这是流量清洗厂商在数据积累上的优势. 再比如恶意流量一般是从程序自动发出而不是人类操作,所以利用算法对流量进行模式识别就可以被检测出来,这是流量厂商在技术上的优势.

五.SQL注入攻击

SQL 注入,也称为 SQL 隐码或 SQL 注码,是发生于应用程序与数据库层的安全漏洞。简而言之,是在输入的字符串之中注入 SQL 指令,在设计不良的程序单中忽略了字符检查,那么这些注入进去的恶意指令就会被数据库服务器误认为是正常的 SQL 指令而运行,因此遭到破坏或是入侵。

攻击方式

  1. SQL 命令可查询、插入、更新、删除等,命令的串接。而以分号字符为不同命令的区别。(原本的作用是用于 SubQuery 或作为查询、插入、更新、删除等的条件式)
  2. SQL 命令对于传入的字符串参数是用单引号字符所包起来。(但连续 2 个单引号字符,在 SQL 数据库中,则视为字符串中的一个单引号字符)
  3. SQL 命令中,可以注入注解(连续 2 个减号字符 – 后的文字为注解,或 /* 与 */ 所包起来的文字为注解)
  4. 因此,如果在组合 SQL 的命令字符串时,未针对单引号字符作跳脱处理的话,将导致该字符变量在填入命令字符串时,被恶意窜改原本的 SQL 语法的作用。

举一个万能钥匙的例子来说明其原理:
在这里插入图片描述
后端的 SQL 语句可能是如下这样的:

SELECT * FROM user WHERE username='admin' AND psw='password'

但是恶意攻击者用奇怪用户名将你的SQL语句变成了如下形式:

SELECT * FROM user WHERE username='admin' --' AND psw='xxxx'

在SQL中, ’ --是闭合和注释的意思,-- 是注释后面的内容的意思,所以查询语句就变成了:

SELECT * FROM user WHERE username='admin'

所谓的万能密码,本质上就是SQL注入的一种利用方式

防御

  • 数据校验
    SQL 注入漏洞的主要原因还是没有对用户输入的数据进行过滤,所以对来自用户的数据(GET、POST、Cookie 等)最好做到以下两种过滤校验:

    • 检查输入的数据是否具有所期望的数据格式。这种在参数是数字的时候特别有效,如果攻击者选择在参数中插入内容的话则会被转换成 NaN 导致攻击失败。
    • 使用数据库特定的敏感字符转义函数把用户提交上来的非数字数据进行转义。
  • 权限限制
    严格限制 Web 应用的数据库的操作权限,给此用户提供仅仅能够满足其工作的最低权限,从而最大限度的减少注入攻击对数据库的危害。**请记住永远不要使用超级用户或所有者帐号去连接数据库!**当数据库被攻击时将损伤限制在当前表的范围是比较明智的选择。通过权限限制可以防止攻击者获取数据库其它信息,甚至利用数据库执行 Shell 命令等操作。

  • 日志处理
    当数据库操作失败的时候,尽量不要将原始错误日志返回,比如类型错误、字段不匹配等,把代码里的 SQL 语句暴露出来,以防止攻击者利用这些错误信息进行 SQL 注入。除此之外,在允许的情况下,使用代码或数据库系统保存查询日志也是一个好办法。显然,日志并不能防止任何攻击,但定期审计数据库执行日志可以跟踪是否存在应用程序正常逻辑之外的 SQL 语句执行。日志本身没用,要查阅其中包含的信息才行。毕竟,更多的信息总比没有要好。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值