1. XSS介绍
百度百科:XSS 跨站脚本攻击(Cross Site Scripting),恶意攻击者往Web页面里插入恶意Script代码或者链接地址,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。
2. 攻击原理
按照攻击过程来分类,XSS 攻击可以分为:
- 反射型 XSS
- 存储型 XSS
- 基于 DOM 的 XSS
反射和存储 XSS 是服务器端注入问题,而基于 DOM 的 XSS 是客户端(浏览器)端注入问题
2.1 反射型XSS
客户端发出请求后,XSS代码出现在url中作为输入提交到服务器,XSS代码随着响应内容一起被发送到客户端,最后浏览器执行XSS代码。这种XSS的攻击方式一般是骗人点链接,恶意代码在url中。
2.2 存储型XSS
恶意代码被当做正常数据插入到数据库中,当用户正常访问页面的时候,恶意代码从数据库中被取出,在当前页面被触发。用户不会发现自己被攻击,比如订单留言功能。
2.3 基于 DOM 的 XSS
对于DOM XSS,攻击是在客户端直接在运行时注入到应用程序中的。详情见这里
3. XSS 攻击的危害
- 盗取受害者 cookie,登录他人账户;
- 钓鱼操作,操控js代码可以动态生成一个html文档;
- 收集你的隐私数据,回传到攻击者服务器;
- 劫持访问,在恶意脚本中插入JS代码,重定向到其他页面,比如真人XXX在线发牌;
4. 防范措施
- 除了在允许的位置,永远不要插入不受信任的数据
- 在将不受信任的数据插入 HTML 元素内容之前进行 HTML 编码
- 在谷歌浏览中默认开启XSS保护。
4.1 永远不要插入不受信任的数据
任何可疑的地方都要进行转义处理。
脚本
<script>...NEVER PUT UNTRUSTED DATA HERE...</script>
注释
<!--...NEVER PUT UNTRUSTED DATA HERE...-->
属性名称
<div ...NEVER PUT UNTRUSTED DATA HERE...=test />
标签名称
<NEVER PUT UNTRUSTED DATA HERE... href="/test" />
CSS
<style>
...NEVER PUT UNTRUSTED DATA HERE...
</style>
4.2 对插入的文本进行 HTML 编码
对 实体标签进行编码处理,比如 XML 中的 5 个重要字符(&, <, >, ", ')
& --> &
< --> <
> --> >
" --> "
' --> '
4.3 URL 参数编码
<a href="http://www.somesite.com?test=...ENCODE UNTRUSTED DATA BEFORE PUTTING HERE...">link</a >
4.3 过滤可疑的代码
对字符串进行 DOM parse 校验,过滤不安全的内容。
- 移除用户上传的 dom 属性,如 onerror
- 移除用户上传的 style 节点,script节点,iframe节点
- 限制 URL 输入,假如通过 GET 请求访问该 url 会导致攻击成功,那就不能允许用户输入URL地址,否责这个请求很容易发起,比如 填写头像地址;
5. 通用的防御方法
XSS 的防御措施可以归纳为:输入过滤,输出转义,另外还可以配合下面的措施尽量减少 XSS 的危害性。
5.1 使用 HTTPOnly cookie 标志
避免 cookie 被脚本读取
5.2 使用 CSP 策略
配置 content-security-content,限制可以访问的业务域名,可以防止信息被其他服务收集。
网友评论