漏洞简介
Cross-Site Scripting(为了与CSS区别,安全领域叫做XSS)攻击是注入的一种,主要是将恶意脚本注入到可信站点的
HTML页面等网页文件中,当攻击者将注入恶意脚本的网页连接发送给用户。用户打开链接,浏览器会认为恶意脚本来
自可信站点而执行
Reflected XSS(反射型XSS)
反射型XSS是用户输入直接作为响应的一部分作为服务器输出,如用户提交的表单、URL作为错误信息、搜索结果返回给用户,
攻击者构造恶意的URL,Web表单发送给用户,用户点击就会触发
比如上面漏洞介绍里举的例子就是反射型XSS
Stored XSS(存储型XSS)
存储型XSS会把用户输入的数据“存储”到服务端,往往是数据库,往往具有更强的稳定性和破坏性,产生这种漏洞的页面功能
往往是往往是论坛消息、访问者日志、评论字段等
XSS的利用方式
基本上XSS能够做到事就是JS一类的脚本能做到的事,这里举一些XSS的利用方式,但不具体说明
盗取用户Cookie(登录态)
构造GET、POST等HTTP方法模拟网站逻辑以劫持用户身份执行(类似CSRF)
盗取页面数据,如一下用户敏感信息
编码转换
对输入参数和输出参数编码,过滤掉危险字符
这是防御XSS中最重要最有效的一步,服务端对要输出给用户的Web文件内容做以下编码转换(实体编码),同理,如果JS改变了DOM,也要在JS中对数据内容进行以下编码,对于用户的输入输出更要重点处理
–> >
” –> "
/ –> /
’ –> '
& –> &
< –> <
单引号也有转换成'的情况,但是不推荐,因为这种转换不在HTML的规范中,而是在XML和XHTML的规范中
随着前端技术的发展,使用类似Angular JS、VUE JS的框架,本身自带编码转换,了解相关模块的配置之后使用
使用Cookie的httponly标识
为Cookie字段带上httponly的标识,可以防止JS读取Cookie信息,因此可以有效防止XSS攻击中盗取用户Cookie的能力
但是这种方式不是防御了XSS漏洞,只是减少了XSS漏洞造成的损失,但依旧十分有效,前端页面不需要读取Cookie的话尽量为每个Cookie配置这个标识
使用X-XSS-Protection头部进行防御
浏览器本身内置了XSS的防御审计工具,可以通过X-XSS-Protection进行配置,但是浏览器的防御攻击也是人写的代码,本身具有安全隐患
X-XSS-Protection的安全隐患
建议在看明白上文后使用,建议按需求使用X-XSS-Protection: 1; mode=block和X-XSS-Protection: 0两种配置
XSS过滤
存在一些情况,比如富文本
,不能使用HTML实体编码的方式进行XSS防御,因为富文本中需要用到HTML标签来显示,在了解需求的情况下使用白名单进行过滤,因为XSS攻击的灵活只推荐使用白名单
。设置白名单需要对XSS的可以利用的HTML标签和位置有一定了解,参考OWASP的开源项目anti-samy