[技术分享]前端安全系列:XSS 篇

xperia发布于4 个月前 • 129 次阅读

XSS攻击

全称跨站脚本攻击,为不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS,XSS是一种在web应用中的计算机安全漏洞,它允许恶意web用户将代码植入到提供给其它用户使用的页面中。

XSS攻击的危害

  1. 盗取各类用户帐号,如机器登录帐号、用户网银帐号、各类管理员帐号
  2. 控制企业数据,包括读取、篡改、添加、删除企业敏感数据的能力
  3. 盗窃企业重要的具有商业价值的资料
  4. 非法转账
  5. 强制发送电子邮件
  6. 网站挂马
  7. 控制受害者机器向其它网站发起攻击

XSS漏洞的分类

本地利用漏洞

这种漏洞存在于浏览器页面中,属于前端自身问题基于DOM文档对象模型的一种漏洞,大概步骤:

  • A给B发送一个恶意构造的URL
  • B打开恶意URL
  • B的浏览器页面中包含恶意代码
  • A的恶意代码可以拥有B的持有权限,进而获取B的数据或者冒充B的行为

通过修改浏览器页面中的DOM(DocumentObjectModel)时,就有可能产生这种漏洞

反射式漏洞

服务端没有对数据进行过滤、验证或者编码等处理直接返回前端可能引起的漏洞

  • A给B发送一个恶意构造的URL
  • B打开目标网站,浏览器将包含恶意代码的数据通过请求传递给服务端,其不加处理直接返回给浏览器
  • B的浏览器接收到响应后解析并执行的代码中包含恶意代码
  • A的恶意代码可以拥有B的持有权限,进而获取B的数据或者冒充B的行为

常见于网站搜索栏,登录注册等地方窃取用户cookies或者进行钓鱼欺骗.因为其中涉及到服务端的参与,想要避免需要后端协调.

存储式漏洞

类似反射式但是会把未经处理的数据储存在数据库中

  • A将恶意代码提交到目标网站的数据库中
  • B打开目标网站,服务端将恶意代码从数据库取出拼接在HTML中返回给浏览器
  • B的浏览器接收到响应后解析并执行的代码中包含恶意代码
  • A的恶意代码可以拥有B的持有权限,进而获取B的数据或者冒充B的行为

这是属于持久性攻击,涉及范围可能包括所有的访问用户,一般常用网站留言,评论,博客日志等.

大致对比

类型 本地利用 反射式 存储式
触发触发 用户打开恶意构造的URL 触发用户打开恶意构造的 URL 1, 用户打开恶意构造的URL;2, 攻击者构造脚本
储存 URL URL 数据库
输出 前端 后端 后端
方式 DOM HTTP响应 HTTP响应

XSS攻击方式

  • 所有用户输入内容都有潜在的风险
  • 利用script标签注入HTML/Javascript代码
  • 利用拥有href和src等属性的标签
  • 利用空格、回车和Tab等拼接方式绕开拦截
  • 利用字符编码绕开拦截(JS支持unicode、eacapes、十六进制、十进制等编码形式)
  • 利用onload,onscroll等事件执行恶意代码
  • 利用样式属性backgrund-image等执行(听说主流浏览器已处理)
  • URL参数
  • Cookies
  • 请求header的referer
  • 恶意代码拆分组装
  • 各种API
// URL相关
document.location
document.URL
document.URLUnencoded
document.referrer
window.location
// 操作dom
document.write()
document.writeln()
document.boby.innerHtml
// 特殊函数
eval()
window.execScript()
window.setInterval()
window.setTimeout()
// 重定向
document.location
document.URL
document.open()
window.location.href
window.navigate()
window.open

总的来说分两种类型:

  1. 攻击者手动提交恶意代码
  2. 浏览器自动执行恶意代码

前端基本的XSS拦截处理有哪些?

XSS Filter
  • 用户提交数据进行验证,只接受限定长度/内容
  • 表单数据指定具体类型
  • 过滤移除特殊的html标签,script和iframe等
  • 过滤移除特殊的Javascript代码,javascript:和事件等
HTML Entity(举例部分)
符号 实体编号
> >
& &
" "
'
空格  
请求限制
  • 将重要的Cookie标记为HTTP Only,不能通过客户端脚本读取和修改
  • 设置referer防止恶意请求
  • 实现Session标记(session tokens)、CAPTCHA系统或者HTTP引用头检查,以防功能被第三方网站所执行
共收到 0 条回复