XSS(Cross Site Script)是指黑客通过“HTML注入”,篡改页面,注入恶意脚本。
根据效果的不同分为:
- 反射型XSS
- 存储型XSS
- DOM based XSS
反射型XSS(非持久型)
简单地把用户的输入直接“反射”给浏览器显示。
场景:
用户在输入框输入代码,开发者不对输入内容做处理,直接将输入插入到HTML中。
存储型XSS(持久型)
将用户的输入“存储”在服务器端。
场景:
黑客写含有JS代码的博客,博客发表,博客保存在了服务器,其他用户浏览该博客时,都会执行恶意的JS代码。
DOM based XSS
它和前两种按“是否存储在服务器”的划分不同,是反射型XSS的一种特例,开发者获取到用户的输入后,将页面的DOM进行修改,插入用户的输入信息造成的XSS称为DOM based XSS。
场景:
用户在输入框输入代码,开发者获取页面的某个DOM元素,将用户输入通过innerHTML插入到DOM中。
XSS Payload
XSS插入的恶意JS代码,可以做JS任何事情,比如造成“Cookie劫持”,构造GET,POST请求等。
1.cookie劫持
场景:用户登陆a.com网站,被植入XSS,通过document.cookie拿到用户登陆信息,然后模拟用户操作。
解决:
- 可以将cookie与客户端ID绑定,使即使获取到cookie也无法模拟用户操作,因为换客户端后,登陆cookie失效
- 设置HttpOnly标识,使JS无法读取
2.构造GET、POST请求
场景:可以植入一张图片构造GET请求,可以植入表单构造POST请求。
XSS的防御
1.“cookie劫持”
可以采用HttpOnly,或者cookie与客户端ID绑定
2.输入检查
对于输入检查,一般是检查用户输入的数据是否包含特殊字符,如<,>,',",/等。如果发现则进行编码或过滤。
3.输出检查
对于不同的使用语境,需要进行不同的编码,安全编码有很多,HTML使用HtmlEncode,JS使用JavascriptEncode,css使用CSSEncode,url使用URLEncode等。
4.处理富文本
应该禁止
白名单好处:
1.考虑到了安全标签
黑名单的坏处:
1.标签很多,无法考虑到所有标签的特性
2.浏览器的特性了解不全,可能会产生漏洞