《大型分布式网站架构设计与实践》——常见的Web攻击手段

常见的Web攻击手段

XSS攻击

跨站脚本攻击(Cross Site Scripting),指的是攻击者在网页中嵌入恶意脚本程序,当用户打开该网页时,脚本程序便开始在客户端的浏览器上执行,以盗取客户端cookie、用户名密码,下载执行病毒木马程序,甚至是获取客户端admin权限等

<img fen_015>

防范: 对用户输入的数据进行HTML转义处理

转义前转义后
<&lt ;
>&gt ;
&amp ;
&quot ;

CSRF攻击

跨站请求伪造(cross site request forgery),是一种对网站的恶意利用,XSS利用的是站点内的信任用户,而CSRF则是通过伪装来自受信任用户的请求来利用受信任的网站,可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求,CRSF能做的事情包括利用你的身份发邮件、发短信、进行交易转账等,甚至盗取你的账号

攻击原理如下图所示

<img_018>

防范:

  • 将cookie设置为HttpOnly

    CRSF攻击很大程度上是利用了浏览器的cookie,为了防止站内的XSS漏洞盗取cookie,需要在cookie中设置”HttpOnly”属性,这样通过程序(如JavaScript脚本、Applet等)就无法读取到cookie信息,避免了攻击者伪造cookie的情况出现

    在Java的Servlet的API中设置cookie为HttpOnly的代码如下

    response.setHeader("Set-Cookie", "cookiename=cookievalue;HttpOnly");
    
  • 增加token

    CSRF攻击之所以能够成功,是因为攻击者可以伪造用户的请求,该请求中所有的用户验证信息都存在于cookie中,因此攻击者可以在不知道用户验证信息的情况下直接利用用户的cookie来通过安全验证。由此可知,抵御CSRF攻击的关键在于:在请求中放入攻击者所不能伪造的信息,并且该信息不存在于cookie之中,鉴于此,系统开发人员可以在HTTP请求中以参数的形式加入一个随机产生的token,并在服务端进行token校验,如果请求中没有token或者token内容不正确,则认为是CSRF攻击而拒绝该请求

    假设请求通过POST方式提交,则可以在相应的表单中增加一个隐藏域:

    <input type="hidden" name="_token" value="tokenvalue">
    

    token的值通过服务端生成,表单提交后token的值通过POST请求与参数一同带到服务端,每次会话可以使用相同的token,会话过期,则token失效,攻击者因无法获取到token,也就无法伪造请求

    在session中添加token的实现代码

    HttpSession session = request.getSession();
    Object token = session.getAttribute("_token");
    if(token == null || "".equals(token)){
        session.setAttribute("_token", UUID.randomUUID().toString());
    }
    
  • 通过Referer识别

    在HTTP头中有一个字段叫Referer,它记录了该HTTP请求的来源地址,在通常情况下, 访问一个安全受限的页面的请求都来自于同一个网站,如果攻击者要对第三方网站实施CSRF攻击,他只能在其他网站构造请求,当用户通过其他网站发送请求到第三方网站时,只需要对请求验证其Referer值即可

    取得HTTP请求Referer

    String referer = request.getHeader("Referer");
    

SQL注入攻击

通过把SQL命令伪装成正常的HTTP请求参数,传递到服务端,欺骗服务器最终执行恶意的SQL命令,达到入侵目的

防范:

  • 使用预编译语句

    预编译SQL语句中的特殊字符会被转义

  • 避免免密码明文存放

    不用明文存储密码,使用哈希加盐法(Hash+Salt),能够在一定程度上解决使用彩虹表的破解方法(逆向或碰撞串),所谓加盐(Salt)就是在生成Hash时给予一个扰动,使Hash值与标准的Hash结果不同,如密码是”hello”,加一个盐,也就是随机字符串”abcdefgids”,两者合到一起,计算MD5,通过这种操作, 即便用户用的是弱密码,也能通过加盐,使实际计算哈希的密码值变成一个长字符串,一定程度上防御了穷举攻击和彩虹表攻击

  • 处理好相应的异常

    处理好后台的系统异常,重定向到相应的错误处理页面

文件上传漏洞

文件上传攻击指的是恶意攻击者利用一些站点没有对文件的类型做很好的校验,上传了可执行的文件或者脚本,并且通过脚本获得服务器上相应的权力,或者是通过诱导外部用户访问、下载上传的病毒或木马文件,达到攻击的目的

防范:

  • 对上传的文件类型进行白名单(非黑名单)校验,并且限制上传文件的大小,上传的文件需要进行重命名,使攻击者无法猜测到上传文件的访问路径
  • 不能简单地通过后缀名称来判断文件的类型,因为恶意攻击可以将可执行文件的后缀名改成图片或者其他后缀类型。因为很多类型的文件,起始的几个字节内容是固定的,因此,根据这几个字节的内容,就可以确定文件类型,这几个字节也被称为魔数(magic number)

    1.通过魔数来判断文件类型

    public enum FileType{
        JPEG("FFD8FF"),
        PNG("89504E47"),
        GIF("47494638"),
        TIFF("49492A00"),
        BMP("424D"),
        DWG("41433130"),
        PSD("38425053"),
        XML("3C3F786D6C"),
        HTML("68746D6C3E"),
        PDF("255044462D312E"),
        ZIP("504B0304"),
        RAR("52617221"),
        WAV("57415645"),
        AVI("41564920"),
    
        private String value = "";
        private FileType(String value){
            this.value = value;
        }
    
        public String getValue(){
            return value;
        }
    
        public void setValue(String value){
            this.value = value;
        }
    
    }
    
    /**
     *读取文件头
     *
     */
     private static String getFileHeader(String filePath) throws IOException {
         //这里需要注意的是,每个文件的魔数的长度都不相同,因此需要使用startwith
         byte[] b = new byte[28];
         InputStream is = null;
         is = new FileInputStream(filePath);
         is.read(b, 0, 28);
         is.close();
    
         return bytes2hex(b);
     }
    
     /**
      *判断文件类型
      */
      public static FileType getType(String filePath) throws IOException {
          String fileHead = getFileHeader(filePath);
          if(fileHead == null || fileHead.length() == 0){
              return null;
          }
          fileHead = fileHead.toUpperCase();
          FileType[] fileTypes = FileType.values();
          for(FileType type : fileTypes){
              if(fileHead.startsWith(type.getValue())){
                  return type;
              }
          }
          return null;
      }
    

    对于图片类型的文件,可以在上传后,对图片进行相应的缩放,破坏恶意用户上传的二进制可执行文件的结构,来避免恶意代码执行

    imagemagick是一套功能强大、稳定并且开源的针对图片处理的开发工具包,能够处理多种格式的图片文件,可以利用imagemagick来对图片进行缩放处理

DDoS攻击

DDoS(Distributed Denial of Service)即分布式拒绝服务攻击,是目前最为强大、最难以防御的攻击方式之一

最基本的DoS攻击就是利用合理的客户端请求来占用过多的服务器资源,从而使合法用户无法得到服务器的响应,DDoS攻击手段是在传统的DoS攻击基础之上产生的一类攻击方式,传统的DoS攻击一般是采用一对一的方式,当攻击目标的CPU速度、内存或者网络带宽等各项性能指标不高的情况下,它的效果是明显的,但随着计算机与网络技术的发展,计算机的处理能力显著增加,内存不断增大,同时也出现了千兆级别的网络,这使得DoS攻击逐渐失去了效果

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

常见的DDoS攻击手段:

  • SYN Flood

    SYN Flood是互联网最经典的攻击方式之一,它利用了TCP协议三次握手过程

    <img fen_019>

    TCP协议为实现可靠传输,在三次握手的过程中设置了一些异常处理机制,如果服务器没有收到客户端的ACK报文,服务端一般会进行重试,也就是再次发送SYN+ACK报文给客户端,并且一直处于SYN_RECV状态,将客户端加入等待列表。重发一般会进行3~5次,大约每隔30秒左右会轮询一遍等待队列,重试所有客户端;另一方面,服务器在发出SYN+ACK报文后,会预分配一部分资源给即将建立的TCP连接,这个资源在等待重试期间一直保留,更为重要的是,服务器资源有限,可以维护的等待列表超过极限后就不再接收新的SYN报文,也就是拒绝建立新的TCP连接

    SYN Flood正是利用了TCP协议三次握手的过程来达到攻击的目的,攻击者伪造大量的IP地址给服务器发送SYN报文,但是由于伪造的IP地址几乎不可能存在,也就不可能从客户端得到任何回应,服务端将维护一个非常大的半连接等待列表,并且不断对这个列表中的IP地址进行遍历和重试,占用了大量的系统资源,更为严重的是,由于服务器资源有限,大量的恶意客户端信息占满了服务器的等待队列,导致服务器不再接收新的SYN请求,正常用户无法完成三次握手与服务器进行通信,这便是SYN Flood攻击

  • DNS Query Flood

    DNS Query Flood实际上是UDP Flood攻击的一种变形,由于DNS服务在互联网中具有不可替代的作用,一旦DNS服务器瘫痪,影响甚大

    DNS Query Flood攻击采用的方法是向被攻击的服务器发送海量的域名解析请求,通常, 请求解析的域名是随机生成的,大部分根本不存在,并且通过伪造端口和客户端IP,防止查询请求被ACL(访问控制列表)过滤,被攻击的DNS服务器在接收到域名解析请求后,首先会在服务器上查找是否有对应的缓存,由于域名是随机生成的,几乎不可能有相应的缓存信息,当没有缓存,且该域名无法直接由该DNS服务器进行解析时,DNS服务器会向其上层DNS服务器递归查询域名信息,直到全球互联网的13台根DNS服务器。大量不存在的域名解析请求给服务器带来了很大的负载,当解析请求超过一定量时,就会造成DNS服务器解析域名超时,这样攻击者便达成了攻击目的

  • CC攻击

    CC(Challenge Collapsar)攻击属于DDoS的一种,是基于应用层HTTP协议发起的DDoS攻击,也被称为HTTP Flood

    CC攻击的原理是:攻击者通过控制的大量”肉鸡”或者利用从互联网上搜寻的大量匿名的HTTP代理,模拟正常用户给网站发起请求直到该网站拒绝服务为止,大部分网站会通过CDN以及分布式缓存来加快服务端响应,提升网站的吞吐量,而这些精心构造的HTTP请求往往有意避开这些缓存,需要进行多次DB查询操作或者一次请求返回大量的数据,加速系统资源消耗,从而拖垮后端的业务处理系统,甚至连相关存储与日志收集系统也无法幸免

其他攻击手段

其他比较常见的攻击手段还有DNS域名劫持、CDN回源攻击、服务器权限提升、缓冲区溢出,以及一些依赖于平台或者具体软件漏洞的攻击等

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值