跨站脚本攻击
如果你的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中用于实现攻击手段。