关于后端:常见的Web攻击手段拿捏了

5次阅读

共计 6758 个字符,预计需要花费 17 分钟才能阅读完成。

大家好,我是小菜。
一个心愿可能成为 吹着牛 X 谈架构 的男人!如果你也想成为我想成为的人,不然点个关注做个伴,让小菜不再孤独!

本文次要介绍 互联网中常见的 Web 攻打伎俩

如有须要,能够参考

如有帮忙,不忘 点赞

微信公众号已开启,小菜良记,没关注的同学们记得关注哦!

午饭期间,读者小李与我闲聊,谈到上周去面试的过程。经典的 高开低走,面试初期答的还能够,然而到前面却不尽人意。其中有个面试问题引起了我的留神,面试官过后问小李:你晓得有哪几种常见的 Web 攻打伎俩吗?

Web 攻打伎俩?对于开发程序员来说该当是随口就来,而小李却遮遮掩掩地只答复了 SQL 注入攻打 。问了小李才得悉,Web 攻打伎俩 个别是在平时的博客上才见过,然而在开发中简直没有做防护,因为他负责的产品大部分是 TB 的,所以攻打伎俩平时看的时候晓得,然而看过也就忘得差不多了。看到这里的小伙伴,思考下,本人能说出几种 Web攻击方式,以及如何防护?如果有些许含糊,那咱们这篇就来温习一下有哪几种常见的 Web 攻打伎俩~!

Web 攻打

在互联网中,攻打伎俩不可胜数,咱们平时不能以本人只是一般的开发程序员而不是平安方向的开发者为理由,而不去把握根本的 Web 攻打伎俩!咱们来相熟一下有哪几种常见的 Web 攻打伎俩

常见的 Web 攻打伎俩次要有 XSS 攻打 CSRF 攻打SQL 注入攻打DDos 攻打 文件破绽攻打 等。这几种攻击方式的防护伎俩并不简单,却还是有很多企业蒙受了该攻打,朔源到头,还是因为人为的忽略。

一、XSS 攻打

XSS 攻打的全称为 跨站脚本攻打(Cross Site Scripting)

为什么不叫CSS,那是因为为了不跟层叠样式表(Cascading Style Sheet,CSS)混同

XSS 攻打Web 利用中最常见到的攻打伎俩之一。

跨站脚本攻打 ,关键词 脚本

攻击者经常在网页中嵌入了歹意的脚本程序,当用户关上该网页的时候,脚本程序便开始在客户端的浏览器后盾执行,罕用于盗取客户端的 cookie,用户名明码,下载执行病毒的木马程序,以及获取客户端 Admin 权限。

1、攻打原理

前端罕用表单的模式向后盾提交信息

<input type="text" name="username" value="cbuc" />

很一般的一段 html 代码,向后盾提交 username 的信息,失常状况下,用户个别会输出本人的 username,这个时候毫无问题,然而在不失常的状况下,用户输出的不是一个失常的字符串,而是 "/><script> alert("bingo") </script><!-。按这个时候表单的内容就会变成

<input type="text" name="username" value=""/><script> alert("bingo") </script><!-" />

这个时候向后盾提交参数,因为 username 的不合法性,校验可能不通过,服务端就重定向会该页面,并且带上以上参数,这个时候页面就会弹出一个正告框:

正告框问题不是很大,是因为取决于这段脚本,如果攻击者稍做批改,那么性质可能就不一样了~

甚至,攻击者能够对 URL 进行操作,失常提交的地址为

www.xxx.com/login?username="/><script> alert("bingo") </script><!-"

攻击者能够对 URL 进行编码用来蛊惑用户:

www.xxx.com/login?username="%2F%3E%3Cscript%3E%20alert(%22bingo%22)%20%3C%2Fscript%3E%3C!-"

2、防护伎俩

晓得了如何攻打,防护起来就不难,咱们隔靴搔痒即可。既然输出的参数不非法,咱们就很有必要对入参进行校验,比方 <、>、"、"、'、' 这些特殊字符咱们很有必要进行本义与校验。

二、CSRF 攻打

CSRF 攻打全称 跨站申请伪造 (Cross site request forgery)。是一种对网站的歹意利用,咱们下面说到的 XSS 攻打 是利用站点内的信赖用户,本人去触发脚本而导致的攻打。而 CSRF 则是通过假装来自受信赖用户的申请去利用受攻打的网站。

CSRF 攻打 ,关键词: 伪造

攻打这盗用了拜访用户的身份,以访问者的名义向第三方网站发送歹意申请,罕用于利用访问者的身份发送音讯,进行交易转账以及盗取账号。

1、攻打原理

受害者 首先在 信赖站点 实现了登录,并且生成了 Cookie,Cookie 会在浏览器保留肯定的工夫。到这一步,用户如果在没有登出 信赖站点 的状况下,拜访了 歹意站点 ,这个时候 歹意站点 就会向 信赖站点 发动申请,这个申请就会带上以上生成的 Cookie,当歹意申请来到 信赖站点 信赖站点 看到申请携带的 Cookie,就会判断该申请是 受害者 收回的。因而 信赖站点 就会依据 受害者 的权限来实现 歹意申请 的指令,而这个指令可能是利用 受害者 的身份发送音讯,转账领取等等操作,这样 歹意站点 就达到了伪造 受害者 申请 信赖站点 的目标。

看到这个流程不晓得你是否有所启发,不晓得屏幕前的小伙伴是否有过 QQ 被盗用的经验,当然,有些盗用的伎俩与下面的流程是类似的。

该攻打伎俩在日常中非常常见。如果某个领取零碎的转账地址为 www.xxx.com/pay?accountNum=xxxx&money=xxx。其中 accountNum 为转账目标的账户,money 为转账金额。那这个时候如果你刚巧登录过了该领取零碎,又没有及时的登出,在拜访 歹意站点 的时候,如果你点开了某张图片,而图片的地址为:

<img src="www.xxx.com/pay?accountNum=xxxx&money=xxx" />

当你美滋滋地浏览图片的时候,却不晓得此时你的账户上曾经悄悄的少了指定金额!

这就是因为你没有及时的登出 领取零碎 ,而又点击了 歹意站点 歹意链接,携带了你未过期的 Cookie,胜利窃取了你的金额。

2、防护伎俩

同样知其症下其药!防护伎俩如下:

1)将 cookie 设置为 HttpOnly

CSRF 攻打的要害就在于利用了用户未过期的 Cookie,那么为了避免 Cookie 的盗取,就须要在 Cookie 中设置 HttpOnly 属性,这样通过程序(XSS 攻打)就无奈读取到 Cookie 信息,防止了攻击者伪造 Cookie 的状况呈现。

2)减少 token

该防护伎俩还是针对 Cookie 的盗取,因为申请中所有的用户验证信息都寄存于 Cookie 中,因为咱们抵挡 CSRF 的要害就在于:如何在申请中放入攻击者所不能伪造的信息,并且该信息不能寄存在 Cookie 中。那么咱们就能够在申请返回中退出一个随机生成的 token,当申请来到时进行 token 的校验,如果校验不通过则认为是 CSRF 攻打而回绝该申请。

3)通过 Referer

依据 HTTP 协定,在 HTTP 申请头上有一个字段叫做 referer,它记录了该Http 申请的起源地址。在通常状况下,拜访一个平安受限的页面的申请都来自同一个网站。

CSRF 中歹意申请是从 歹意站点 收回的,因而要进攻 CSRF 攻打,须要对每一个申请验证其 referer 值即可。

三、SQL 注入攻打

SQL 注入 是程序员最常常遇到的,所谓 SQL 注入,就是通过把 SQL 命令伪装成失常的申请参数,传递到服务端,坑骗服务器最终执行歹意的 SQL 命令,达到入侵的目标。攻击者经常利用 SQL 注入的破绽,来查问非受权的要害信息,批改数据库服务器的数据,扭转表构造,危害极大!

1、攻打原理

咱们查问用户存不存在往往是通过以下 SQL:

SELECT * FROM s_user WHERE username = ''and password ='' 

当咱们后端应用以下代码查问时,便会呈现致命的破绽

Connection  con = getConnection();
Statement st = (Statement) con.createStatement();
String sql = "SELECT * FROM s_user WHERE username ='"+ username +"'and password ='"+ passward+"' ";
ResultSet rs = st.executeQuery(sql);
while(rs.next()){...}

下面代码逻辑便是利用前端传入的参数进行数据库查问,乍看之下感觉毫无问题,然而这个时候如果 password 前端传过来的值是 'or'1'='1

那这个时候 SQL 就会变成

SELECT * FROM s_user WHERE username = ''and password ='' or '1'='1' 

这样的 SQL 不必试都晓得会把数据库中的用户全都查出来,明明没有输出正确的明码,却返回了登录胜利。而这便是一次简略且典型的 SQL 注入攻打。

'or'1'='1 危害是让用户免明码登录,如果传过来的值为 '; drop table xxx; -- 这个时候问题就大了!

2、防护伎俩

1)应用预编译语句

预编译语句 PreparedStatement 是 java.sql 中的一个接口,继承自 Statement 接口。

预编译语句和 Statement 的不同之处在于,创立 PreparedStatement 对象时就指定了 SQL 语句,该语句立刻发送给 DBMS 进行编译,当该编译语句须要被执行时,DBMS 间接运行编译后的 SQL 语句,而不须要像其余 SQL 语句那样先将其编译:

String sql = "SELECT * FROM s_user WHERE username = ? and password = ?";
PreparedStatement st = conn.preparedStatement(sql);
st.setString(1, username);
st.setString(2, password);
ResultSet rs = st.executeQUery();

能够看到,SQL 语句中原有的白能量曾经用占位符?代替了,变量通过 setString() 办法进行设置。

2)应用 ORM 框架

避免 SQL 注入的要害伎俩在于对一些关键字进行本义,而常见的一些 ORM 框架,如 Mybatis,Hibernate 等,都反对对响应的关键字或者特殊符号进行本义,能够通过简略的配置,很好的预防 SQL 注入的破绽,升高一般开发人员进行平安编程的门槛。

四、文件上传破绽

很多网站都有上传的性能,如上传图片、文件、压缩包等等。而这些资源往往是保留在远端服务器上。文件上传攻打指的就是攻击者利用一些站点没有对文件类型做很好的校验,上传了可执行的文件或脚本,并且通过脚本对服务器进行肯定的权限操作,或是通过诱导内部用户拜访该脚本文件,达到攻打的目标。

当然,这种攻打防护上也是比较简单,为了避免用户上传歹意的可执行脚本文件,以及将文件上传服务器当做收费的文件存储服务器来应用,咱们须要对上传文件的类型进行白名单校验,并且须要限度上传文件的大小,上传的文件须要进行重新命名,使攻打这无奈猜测到上传文件的拜访门路。

其中对上传文件的类型进行白名单校验,并不能单单通过后缀名称来判断文件的类型,因为攻击者很有可能能够通过将可执行文件的后缀名称改为其余可上传的后缀名称进行上传,因为判断文件类型就须要应用更加平安的形式。

很多类型的文件,其实的几个字节内容是固定的,因而依据这几个字节的内容,就能够确定文件类型,而这几个字节也被成为 魔数

以上便是文件类型的魔数,而后咱们通过获取文件的文件头与文件类型的魔数相比拟来判断文件类型

五、DDOS 攻打

DDos 攻打 又称为 分布式拒绝服务攻打 (Distributed Denial of Service),是目前最为弱小,最难以进攻的攻击方式之一。

在理解 DDoS 之前,咱们须要先晓得什么是 DoS。最根本的 DoS 就是利用正当的客户端申请里占用过多的服务器资源,从而使非法用户无奈失去服务器的响应。DDoS 攻打便是在传统的 DoS 攻打的根底上产生的一类攻击方式。传统的 DoS攻打个别是一对一的形式,当攻打指标的 CPU 速度、内存或者网络带宽等各项性能指标不高的状况下,它的成果是显著的,但随着计算机与网络技术的倒退,计算机的解决能力显著减少,内存一直增大,这便使得 DoS 攻打逐步失去了成果。

这就跟单体利用向分布式架构的演进一样,传统的 DoS 演进到了 分布式 DoS (DDoS)

1、攻打原理

DDoS 攻打指的便是攻击者借助公共网络,将数量宏大的计算机设备联结起来作为攻打平台,对一个或多个指标动员攻打,从而达到瘫痪指标主机的目标。通常在攻打开始之前,攻击者会提前管制大量的用户计算机,这类计算机称之为 肉鸡,并通过指令使大量的的肉鸡在同一时刻对某个主机进行拜访,从而达到瘫痪指标主机的目标。

2、DDoS 分类

DDoS 是一种攻打伎俩,其中又分为好几种 DDoS 攻打

1)SYN Flood

SYN Flood 是互联网中最经典的攻击方式之一,要理解该攻击方式,咱们须要从 TCP 协定连贯的过程说起。家喻户晓,TCP 协定在通信之前,必须先建设基于 TCP 协定的一个连贯,以下是建设连贯的过程:

这是一张十分倡议的 TCP 三次握手 的过程。

  1. 第一步,客户端发送一个蕴含 SYN 标识的 TCP 报文,SYN 即同步(Synchronized)的意思,SYN报文会指明客户端的端口号以及 TCP 连贯的初始序列号
  2. 第二步,服务器在收到客户端的 SYN 报文后,会返回一个 SYN+ACK 的报文,示意客户端申请被接管,同时 TCP 序列号被加 1,ACK 即确认(Acknowledgment)的意思
  3. 第三步,客户端在接管到服务端的 SYN + ACK 报文后,也会返回一个 ACK 报给服务端,同样,TCP 的序列号加 1,这时,TCP 连贯便建设好了,接下来便能够进行数据通信了。

TCP 协定 是牢靠的传输协定,在三次握手的过程中设置了一些异样解决机制。第三步中如果服务器没有收到客户端的 ACK 报文,服务端个别会进行重试,也就是再次发送 SYN + ACK 报文给客户端,并且始终处于 SYN_RECV 的状态,将客户端退出期待列表;另一方面,服务器在收回 SYN + ACK 报文后,会事后调配一部分资源给行将建设的 TCP 连贯,这个资源在期待重试期间始终保留,因为服务器的资源无限,能够保护的期待列表超过极限之后就不会再接管新的 SYN 报文,也就是回绝建设新的 TCP 连贯。

这个时候咱们便能够说说 SYN Flood 是怎么回事了,SYN Flood就是利用了 TCP 协定三次握手的过程来达到攻打的目标。攻击者伪造大量的 IP 地址给服务器发送 SYN 报文,因为伪造的 IP 地址不可能存在,也就不可能从客户端失去任何响应,就会始终卡在 第三步,服务端就得保护一个十分大的半连贯期待列表,并且一直对这个列表中的 IP 地址进行遍历重试,占用了大量的系统资源。而因为服务器资源无限,歹意的连贯占满了服务器的期待队列,导致服务器不再接管新的 SYN 申请,使失常的用户无奈实现通信。

2)DNS Query Flood

DNS Query Flood 实际上就是 UDP Flood 攻打的一种变形,因为 DNS 服务在互联网中具备不可代替的作用,因而一旦 DNS 服务器 瘫痪,影响将十分大!

DNS Query Flood 攻打采纳的办法是向被攻打的服务器发送海量的域名解析申请。而这部分申请解析的域名个别都是随机生成的,大部分不存在,并且通过伪造端口和客户端 IP,避免查问申请被 ACL(访问控制列表)过滤。被攻打的 DNS 服务器 在收到域名解析的申请后,首先会在本人的服务器上查找是否该域名的 IP,因为域名的不存在,在本身天然是找不到的,因而DNS 服务器 便会向下层的 DNS 服务器递归查问域名,直到寰球互联网的 13 台 根 DNS 服务器。大量不存在的域名解析申请给服务器带来了很大的负载,当解析申请超过一定量级的时候,就会造成 DNS 服务器 解析域名超时,使失常的域名都查问不到对应的 IP,达到了攻打的成果。

3)CC 攻打

CC(Challenge Collapsar)攻打是基于应用层 HTTP 协定发动的攻打,也称为 HTTP Flood

CC 攻打 的原理是通过管制大量的 “肉鸡” 或者利用从互联网上搜查的大量匿名的 HTTP 代理,模仿失常用户给网站发动申请直到该网站拒绝服务为止。大部分网站会通过 CDN 以及分布式缓存来放慢服务端的响应,进步网站的吞吐量。而这些歹意的 HTTP 申请会无意的避开这些缓存,须要进行屡次 DB 查问操作或者一次申请会返回大量的数据,减速系统资源的耗费,从而拖垮后端的业务解决零碎。

以上便是常见的 Web 攻打伎俩,知其然知其所以然,平安是极为重要也是极难防护的,每个开发人员都应该引起器重!

不要空谈,不要贪懒,和小菜一起做个 吹着牛 X 做架构 的程序猿吧~ 点个关注做个伴,让小菜不再孤独。咱们下文见!

明天的你多致力一点,今天的你就能少说一句求人的话!

我是小菜,一个和你一起变强的男人。 💋

微信公众号已开启,小菜良记,没关注的同学们记得关注哦!

正文完
 0