常见的Web安全攻击

CSRF(Cross Site Request Forgery,跨站请求伪造)

  1. 攻击原理:

    image

  2. 防范:

    • 验证码。应用程序和用户进行交互过程中,特别是账户交易这种核心步骤,强制用户输入验证码,才能完成最终请求。在通常情况下,验证码够很好地遏制CSRF攻击。但增加验证码降低了用户的体验,网站不能给所有的操作都加上验证码。所以只能将验证码作为一种辅助手段,在关键业务点设置验证码。
    • Referer Check。HTTP Referer 是 header 的一部分,当浏览器向 web 服务器发送请求时,一般会带上 Referer 信息告诉服务器是从哪个页面链接过来的,服务器籍此可以获得一些信息用于处理。可以通过检查请求的来源来防御 CSRF 攻击。正常请求的 referer 具有一定规律,如在提交表单的 referer 必定是在该页面发起的请求。所以通过检查 http 包头 referer 的值是不是这个页面,来判断是不是 CSRF 攻击。

      • 但在某些情况下如从 https 跳转到 http,浏览器处于安全考虑,不会发送 referer,服务器就无法进行 check 了。若与该网站同域的其他网站有 XSS 漏洞,那么攻击者可以在其他网站注入恶意脚本,受害者进入了此类同域的网址,也会遭受攻击。出于以上原因,无法完全依赖 Referer Check 作为防御 CSRF 的主要手段。但是可以通过 Referer Check 来监控 CSRF 攻击的发生。
    • Anti CSRF Token。目前比较完善的解决方案是加入 Anti-CSRF-Token,即发送请求时在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器建立一个拦截器来验证这个 token。服务器读取浏览器当前域 cookie 中这个 token 值,会进行校验该请求当中的 token 和 cookie 当中的 token 值是否都存在且相等,才认为这是合法的请求。否则认为这次请求是违法的,拒绝该次服务。

      • token 可以在用户登陆后产生并放于 session 或 cookie 中,然后在每次请求时服务器把 token 从 session 或 cookie 中拿出,与本次请求中的 token 进行比对。由于 token 的存在,攻击者无法再构造出一个完整的 URL 实施 CSRF 攻击。
    • 遵循标准的 GET 动作。防止利用 img 标签或者其他类型的 GET 请求的 CSRF。

XSS(Cross Site Script,跨站脚本攻击)

  1. 攻击原理:

    image

  2. 攻击类型:

    • 反射型XSS(Non-persistent XSS),服务器接受客户端的请求包,不会存储请求包的内容,只是简单的把用户输入的数据“反射”给浏览器。例如:www.a.com?xss.php?name=

      <script></script>
      
    • 存储型XSS(Persistent XSS),这类 XSS 攻击会把用户输入的数据“存储”在服务器端,具有很强的稳定性。注入脚本跟反射型 XSS 大同小异,只是脚本不是通过浏览器 -> 服务器 -> 浏览器这样的反射方式,而是多发生在富文本编辑器、日志、留言、配置系统等数据库保存用户输入内容的业务场景。即用户的注入脚本保存到了数据库里,其他用户进行访问涉及到包含恶意脚本的链接都会中招。由于这段恶意的脚本被上传保存到了服务器,这种 XSS 攻击就叫做“存储型 XSS”。

  3. 防范:

    • 输入过滤。对用户输入的数据做一定的过滤。如输入的数据是否符合预期的格式,比如日期格式,Email 格式,电话号码格式等等。这样可以初步对 XSS 漏洞进行防御。

    • 输出编码。服务器端输出到浏览器的数据,可以使用系统的安全函数来进行编码或转义来防范 XSS 攻击。

    • HttpOnly Cookie。预防 XSS 攻击窃取用户 cookie 最有效的防御手段。Web 应用程序在设置 cookie 时,将其属性设为 HttpOnly,就可以避免该网页的 cookie 被客户端恶意 JavaScript 窃取,保护用户 cookie 信息。

    • WAF(Web Application Firewall),Web 应用防火墙,主要的功能是防范诸如网页木马、XSS 以及 CSRF 等常见的 Web 漏洞攻击。由第三方公司开发,在企业环境中深受欢迎。

DoS(Denial of Service) 和 DDoS(Distributed Denial of Service)

  1. 攻击原理:

    在 DoS 攻击中,攻击者通过伪造 ACK 数据包,希望 Server 重传某些数据包,Server 根据 TCP 重转机制,进行数据重传。攻击者利用 TCP 协议缺陷,通过发送大量的半连接请求,耗费 CPU 和内存资源。实现方式如下图:

    image

    三次握手过程中,服务器给客户端发送 SYN+ACK 之后到收到客户端的 ACK 之前的 TCP 连接称为半连接,此时服务器处于 SYN_RCVD 状态。攻击者配合 IP 欺骗,SYN 攻击会达到很好的效果。SYN 攻击指的就是在短时间内伪造大量不存在的 IP 地址,向服务器不断地发送 SYN 包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的 SYN 包将长时间占用未连接队列,正常的 SYN 请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。

  2. 防御:

    • 缩短 SYN Timeout 时间,及时将超时请求丢弃,释放被占用的 CPU 和内存资源
    • 限制同时打开的 SYN 半连接数目,关闭不必要的服务
    • 设置 SYN Cookie,给每一个请求连接的 IP 地址分配一个 Cookie。如果短时间内连续受到某个 IP 的重复 SYN 报文,就认定受到了攻击,以后从这个 IP 来的请求包都会丢弃