XSS


XSS简介

Cross-Site Scripting(跨站脚本攻击)简称 XSS。攻击者往Web页面里插入恶意的Script代码,当用户浏览该页之时,嵌入其中Web里面的Script代码会被执行,从而达到恶意攻击用户的目的。

本质:恶意代码未经过滤,与网站正常的代码混在一起;浏览器无法分辨哪些脚本是可信的,导致恶意脚本被执行。

分类:存储型XSS,反射型XSS,DOM型XSS

反射性XSS

将用户输入的数据“反射”给浏览器。往往需要诱使用户点击一个恶意链接,才能攻击成功。又称“非持久性XSS”

存储型XSS

将用户输入的数据“存储”在服务器端。如写下一篇包含恶意JavaScript代码的博客

DOM 型XSS

类似于反射性XSS,用户点击时,修改页面的DOM节点形成XSS

通常来说风险:存储型 > 反射性
攻击过程来说:反射性 > 存储型

XSS攻击进阶

XSS Payload

XSS Payload:攻击者能够对用户当前浏览器的页面植入恶意脚本,进而控制用户的浏览器。这种恶意脚本就称为”XSS Payload”

常见的 XSS Payload: 读取浏览器的cookie对象,从而发起“Cookie劫持”攻击

构造GET 和POST请求

通过JavaScript 模拟浏览器发包
通过GET执行某些操作
通过JavaScript发出Post请求,通过提交表单或者通过XMLHttpRequest

XSS钓鱼

XSS的攻击都是通过浏览器的JavaScript脚本自动进行的,缺少和用户交互的过程。
比如:修改用户密码时需要用户输入旧密码,这样就可以通过钓鱼

识别用户浏览器

1
alert(navigator.userAgent);

更高级的识别技巧:利用不同浏览器之间的是独有的对象判断

识别用户安装的软件

如识别firefox的拓展

获取用户的真实IP地址

如果客户安装了Java环境,XSS就可以通过调用JavaApplet的接口获取本机IP地址

XSS构造技巧

  • 利用字符编码
  • 绕过长度限制
    • 利用 location,hash 藏代码
    • 远程加载JS
    • 利用注释符
  • 使用<base>标签
    • 作用是定义页面上所有使用相对路径标签的host地址
  • window.name 实现跨域、跨页面请求数据

XSS防御

XSS本质是“HTML 注入”

HTTP only

通过Set-Cookie给关键Cookie植入HTTPOnly标识,解决XXS后的Cookie劫持攻击
防御:

输入检查

前后端都对输入进行检查,检查用户输入的数据是否包含一些特殊的字符。这种方式成为“XSS Filter”

输出检查

变量输出到HTML页面时,可以使用编码或者转义的方式防御XSS

  • 使用安全的编码函数,需要注意的是安全编码后的长度可能发生改变,影响某些功能
  • 可以考虑不止使用一种编码

处理富文本

禁止危险标签:<iframe>,<script>,<base>,<form>
标签应使用白名单,避免黑名单。如只允许使用<a>,<img>,<div>等安全标签
白名单同时应用于属性与事件的选择

防御DOM based XSS

尽量避免用户的输入,关注会修改HTML的语句,如

  • xxx.innerHTML=
  • document.write …..

文章作者: 彭峰
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 彭峰 !
  目录