CSRF(Cross Site Request Forgery,跨站请求伪造)
攻击原理:
受害者用户登录网站 A,输入个人信息,在本地保存服务器生成的 cookie。攻击者构建一条恶意链接并把该链接通过一定方式发给受害者用户,受害者用户若在浏览器打开此链接,会将之前登陆后的 cookie 信息一起发送给网址 A,A 网站收到请求后,确认 cookie 信息无误,以为此链接是受害者发出的操作,导致受害者的身份被盗用,造成攻击行为完成。
防范:
- 验证码。应用程序和用户进行交互过程中,特别是账户交易这种核心步骤,强制用户输入验证码,才能完成最终请求。在通常情况下,验证码够很好地遏制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,跨站脚本攻击)
攻击原理:
恶意攻击者往 Web 页面里注入恶意 Script 代码,当用户浏览这些网页时,就会执行其中的恶意代码,可对用户进行盗取 cookie 信息、会话劫持等各种攻击。XSS 跨站脚本攻击本身对 Web 服务器没有直接的危害,它借助网站进行传播,使网站上大量用户受到攻击。攻击者一般通过留言、电子邮件或其他途径向受害者发送一个精心构造的恶意 URL,当受害者在 Web 中打开该 URL 的时候,恶意脚本会在受害者的计算机上悄悄执行。
攻击类型:
反射型XSS(Non-persistent XSS),服务器接受客户端的请求包,不会存储请求包的内容,只是简单的把用户输入的数据“反射”给浏览器。例如:www.a.com?xss.php?name=
<script></script>
访问这个链接可以使用’alert(document.cookie)’(这段代码在script标签中内嵌)弹出页面的 cookie 内容,若攻击者把 alert 改为一个精心构造的发送函数,就可以把用户的 cookie 偷走。
存储型XSS(Persistent XSS),这类 XSS 攻击会把用户输入的数据“存储”在服务器端,具有很强的稳定性。注入脚本跟反射型 XSS 大同小异,只是脚本不是通过浏览器 -> 服务器 -> 浏览器这样的反射方式,而是多发生在富文本编辑器、日志、留言、配置系统等数据库保存用户输入内容的业务场景。即用户的注入脚本保存到了数据库里,其他用户进行访问涉及到包含恶意脚本的链接都会中招。由于这段恶意的脚本被上传保存到了服务器,这种 XSS 攻击就叫做“存储型 XSS”。
防范:
输入过滤。对用户输入的数据做一定的过滤。如输入的数据是否符合预期的格式,比如日期格式,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)
攻击原理:
在 DoS 攻击中,攻击者通过伪造 ACK 数据包,希望 Server 重传某些数据包,Server 根据 TCP 重转机制,进行数据重传。攻击者利用 TCP 协议缺陷,通过发送大量的半连接请求,耗费 CPU 和内存资源。实现方式如下图:
三次握手过程中,服务器给客户端发送 SYN+ACK 之后到收到客户端的 ACK 之前的 TCP 连接称为半连接,此时服务器处于 SYN_RCVD 状态。攻击者配合 IP 欺骗,SYN 攻击会达到很好的效果。SYN 攻击指的就是在短时间内伪造大量不存在的 IP 地址,向服务器不断地发送 SYN 包,服务器回复确认包,并等待客户的确认,由于源地址是不存在的,服务器需要不断的重发直至超时,这些伪造的 SYN 包将长时间占用未连接队列,正常的 SYN 请求被丢弃,目标系统运行缓慢,严重者引起网络堵塞甚至系统瘫痪。
防御:
- 缩短 SYN Timeout 时间,及时将超时请求丢弃,释放被占用的 CPU 和内存资源
- 限制同时打开的 SYN 半连接数目,关闭不必要的服务
- 设置 SYN Cookie,给每一个请求连接的 IP 地址分配一个 Cookie。如果短时间内连续受到某个 IP 的重复 SYN 报文,就认定受到了攻击,以后从这个 IP 来的请求包都会丢弃