zhaoyu@home:~$

跨站脚本攻击

如果你的web服务器是安全的,那么注入攻击就比较困难,黑客的下一个攻击就是浏览器了。
浏览器总是顺从地执行js代码,如果一个用户在浏览网站时,黑客找到将恶意js代码注入到用户浏览器,就有可能获取用户的登录认证信息或其他敏感信息。我们称 这种攻击为跨站脚本攻击(XSS)。如果js可以读取HTTP session 信息,那么他们可以挟持一个用户的session。

存储型跨站脚本攻击

攻击者会尝试将js脚本插入到数据库中,服务器在渲染HTML时,将js输出。恶意的JS脚本可以通过sql注入植入到数据库,但是大多数情况下攻击者会通过合法途径 植入恶意代码。例如网站允许用户发表评论,可以写一个包含<script>标签的脚本到数据库中,如果网站没有安全地构建HTML,那么当其他用户浏览评论时, js脚本会在受害者的浏览器中执行。这些恶意脚本可以窃取用户的session,重定向受害者浏览器内容到有害网站等。

解决方案1:转移HTML字符集

应当转移所有的数据库中的动态内容,在浏览器中转义内容,使用HTML控制符的实体编码,如下:

解决方案2:执行内容安全策略

现代浏览器可以指定一个内容安全策略,指定那些js可以执行,通常的xss攻击都是执行在html的<script>脚本中,我们可以指定通过只有通过<script>的src 属性引入的脚本才会执行,这样隐形地指定了行内的script脚本不能执行。如下通过设置response header指定了脚本的src源。

Content-Security-Policy: script-src 'self' https://apis.google.com

也可以在通过meta标签指定:

<meta http-equiv="Content-Security-Policy" content="script-src 'self' https://apis.google.com">

为了方便跟踪,考虑使用违反内容安全策略的报告,帮助团队更好地收集违反策略情况。

Content-Security-Policy-Report-Only: script-src 'self'; report-uri https://example.com/csr-reports

反射型跨站脚本攻击

如果网站接收请求参数,并将它回显到页面上,那么,网站就存在反射型跨站脚本攻击的漏洞。如www.baidu.com,在搜索时,将搜索内容作为请求参数,并回显 查询内容。如果没有做安全处理,那么攻击者会利用该漏洞进行反射型跨站脚本攻击。
攻击者通常会将带有脚本的连接用email发送给用户,用户点击后,脚本执行,将用户的敏感信息发送给攻击者。

解决方案:从请求中转义动态内容

基于dom的跨站脚本攻击

要理解基于dom的跨站脚本攻击,需要理解URI fragments的操作。如下图:

URI fragment用于页内的定位。在设计上,URI fragment 在渲染时,不会发送到服务器,只在浏览器端处理。但是任何js可以读取URI,浏览器也会将URI fragment用于历史和收藏。这就意味着服务器端的安全策略不能解决基于DOM的XSS。攻击者可以将脚本写在URI fragment中用于实现攻击手段。

解决方案:URI fragments动态内容转义