注入攻击

安全设计原则: 数据与代码分离,它可以说是专门为解决注入攻击而生的

注入攻击的本质,是把用户输入的数据当做代码执行。这里有两个关键条件:

注入类型:

攻击手段:

防御手段:

文件上传漏洞

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力

文件上传导致的常见安全问题一般有:

webshell

要完成webshell攻击,要满足如下几个条件:

防御手段:

认证与会话管理

认证实际上就是一个验证凭证的过程。认证的目的是为了认出用户是谁,而授权的目的是为了决定用户能够做什么

1、密码认证

密码必须以不可逆的加密算法,或者是单向散列函数算法,加密后存储在数据库中。

目前黑客们广泛使用的一种破解MD5加密后密码的方法是"彩虹表(Rainbow Table)"

彩虹表的思路是收集尽可能多的密码明文和明文对应的MD5值。这样只需要查询MD5值,就能找到该MD5值对应的明文。

通过加盐可以有效对抗彩虹表。在计算密码明文的哈希值时,添加一个"salt"。"salt"是一个字符串,它的作用是为了增加明文的复杂度,并使得彩虹表一类的攻击失效

2、多因素认证

多因素认证提高了攻击的门槛。比如一个支付交易使用了密码与数字证书双因素认证,成功完成该交易必须满足两个条件: 一是密码正确; 二是进行支持的电脑必须安装了该用户的数字证书。因此,为了成功实施攻击,黑客们除了盗取用户密码外,还不得不想办法在用户电脑上完成支付,这样就大大提高了攻击的成本。

3、Session与认证

Session劫持是一种通过窃取用户SessionID后,使用该SessionID登录进目标帐户的攻击方法,此时攻击者实际上是使用了目标帐户的有效Session。如果SessionID是保存在Cookie中的,则这种攻击可以称为Cookie劫持。

Cookie泄露的途径:

4、Session Fixation(会话固定)攻击

在用户登录网站过程中,如果登录前后用户的SessionID没有发生变化,则会存在Session Fixation问题

具体攻击的过程是,用户X(攻击者)先获取到一个未经认证的SessionID,然后将这个SessionID交给用户Y去认证,Y完成认证后,服务器并未更新此SessionID的值(注意是未改变SessionID,而不是未改变Session),所以X可以直接凭借此SessionID登录进Y的帐户

X如何才能让Y使用这个SessionID呢?如果SessionID保存在Cookie中,比较难做到这一点。但若是SessionID保存在URL中,则X只需要诱使Y打开认证URL即可。

解决Session Fixation的正确做法是,在登录完成后,重写SessionID。

Web框架安全

XSS

XSS攻击是在用户的浏览器上执行的,其形成过程则是在服务器端页面渲染时,注入了恶意的HTML代码导致的。从MVC架构来说,是发生在View层,因此使用"输出编码"的防御方法更加合理,这意味着需要针对不同上下文的XSS攻击场景,使用不同的编码方式。

类型:

"输出编码"的防御方法总结为以下几种:

针对以上不同情况,使用不同的编码函数(即对数据进行预处理,过滤关键字符再输出使用)。

CSRF(Cross-site request forgery跨站请求伪造)防御

在完整的CSRF防御方案,对于Web框架来主有以下几个地方需要改动。

HTTP Headers管理

内容安全策略(CSP)

CSP实质是白名单制度,开发者明确告诉客户端,哪些外部资源可以加载和执行,等同于提供白名单。它的实现和执行全部由浏览器完成。

两种方式可以启用CSP。一种是通过HTTP头信息的Content-Security-Policy字段

content-security-policy: script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:

另一种是通过网页的**<meta>**标签

<meta http-equiv="Content-Security-Policy" content="script-src 'self'; object-src 'none'; style-src cdn.example.org third-party.org; child-src https:">

上面代码中,CSP做了如下配置:

Content-Security-Policy: default-src 'self'; ...; report-uri /my_csp_report_parser;

选项值:

如果同一个限制选项使用多次,只有第一次会生效 script-src还支持一些特殊值(都需要放在单引号里):

<meta http-equiv="Content-Security-Policy" content="script-src 'nonce-EDNnf03nceIOfn39fn3e9h3sdfa'">
// 必段有token才能执行
<script nonce

注意

script-src和object-src是必设的,除非设置了default-src script-src不能使用unsafe-inline关键字(除非伴随一个nonce值), 也不能允许设置 data:URL 必须特别注意JSONP的回调函数

Cookie安全

有两种方法可以确保Cookie被安全发送

  1. Secure属性: 标记为Secure的Cookie只应通过被HTTPS协议(http无法使用)加密过的请求发送给服务端。防中间人
  2. HttpOnly属性: JavaScript Document.cookie API无法访问带有HttpOnly属性的Cookie;此类Cookie仅作用于有服务器。缓解XSS

X-Frame-Options

X-Frame-Options HTTP响应头是用来给浏览器指示允许一个页面可否在<frame>、<iframe>、<embed>和<object>中展现的标记。站点可以通过确保网站没有被嵌入到别人的站点里面,从页避免点击劫持攻击。

X-Frame-Options 有两个可能的值:

  • X-Frame-Options: DENY 不光在别人的网站frame嵌入时会无法加载,在同域名页面中同样无法加载
  • X-Frame-Options: SAMEORIGIN 可在相同域名页面的frame中展示。 使用<meta>标签设置X-Frame-Options是无效的,需要通过HTTP头X-Frame-Options才会生效