XSS攻击
什么是XSS
Cross Site Scripting,简称 XSS ,是一种代码注入攻击,攻击者通过在目标网站上注入恶意脚本,使之在用户的浏览器上运行。利用这些恶意脚本,攻击者可获取用户的敏感信息如 Cookie、SessionID 等,进而危害数据安全
XSS的注入方法
任何可以输入的地方都有可能有 XSS 攻击,如:
- 在 HTML 内嵌的文本中,以 script 标签注入恶意内容
- 在 href、src 等属性中,包含 javascript:等可执行代码
- 在 onclick 等事件中注入恶意代码
- 在内联的 js 中,拼接的数据突破了原本的限制(字符串、变量、方法名)等
XSS的类型
XSS 分为存储型、反射型、DOM型
存储型
存储型XSS,也称为持久性XSS,常见于带有用户保存数据的网站功能,如评论、私信等,是最危险的一种跨站脚本,因为不需要用户手动触发,当攻击者提交了 XSS 的代码,会被服务端保存在数据库中,当所有用户访问页面时会触发 XSS ,从而被攻击
攻击步骤为:
- 攻击者注入 XSS 代码,服务器将其保存在数据库中
- 用户登录目标网站,服务器将页面信息和 XSS 脚本一起返回
- 客户端解析代码,包括 XSS 脚本代码,这时 XSS 代码会被执行
- 恶意代码会向攻击者的恶意服务器发起请求,攻击者就可以从自己的恶意服务器读取用户数据,或者冒充用户的行为,调用网站接口执行操作
反射型XSS
反射型XSS,也称为非持久性 XSS ,常见于通过 URL 传递参数,攻击者结合多种手段引诱用户点击打开恶意的 URL ,从而获取用户的 cookie 信息等,一般会出现在搜索页面
攻击步骤为:
- 攻击者构造带有恶意代码的 URL ,引诱用户打开
- 用户打开恶意链接,访问了正常服务器
- 服务器将XSS与页面信息返回给客户端
- 客户端解析页面信息和XSS脚本,执行XSS后请求恶意服务器
- 攻击者获取用户数据
DOM型XSS
DOM型XSS,与反射型原理类似,但是不需要经过后端代码处理,只是在前端 js 可能产生的漏洞
攻击步骤为:
- 攻击者构造带有恶意代码的 URL ,引诱用户打开
- 用户打开恶意链接,访问了正常服务器
- 服务器将 XSS 与页面信息返回给客户端
- 客户端解析页面信息和 XSS 脚本,前端 js 取出恶意代码并执行
- 恶意代码获取用户数据,或者冒充用户行为调用接口
三者区别
存储型XSS 的恶意代码存在数据库中,反射型存在 URL 中,DOM型存在数据库、前端存储或者 URL 中,DOM型属于前端的漏洞,其他两种属于服务端的漏洞。
综上存储型的危害最大,只要用户访问了该页面就会遭受攻击,其他两种需要引诱用户点击恶意链接
防御方法
- 设置 Cookie 的 HTTP Only 属性(设置 cookie 可不可读),客户端的 js 脚本就不能获取 cookie 信息
- 对用户提交的所有内容进行过滤,过滤掉会导致脚本执行的内容,对输出的内容进行 html 编码
- 拼接 html 时,对尖括号、引号、斜杠等进行转义,想对各处插入点进行充分的转义,需要采用合适的转义库
CSRF攻击
什么是CSRF
Cross Site Request Forgery(跨站请求伪造),通过冒充用户身份对目标攻击网站执行某些操作
CSRF类型
GET型
当网站的某个功能是GET请求实现的,例如修改邮箱的功能,如果攻击者引诱用户打开带有修改成错误邮箱脚本的链接,浏览器会带着已生成的 cookie 对此发出GET请求,用户的邮箱就会被修改
POST型
攻击者构造一个带有提交表单功能的链接,当用户访问该页面时,点击了该链接,表单会自动提交,浏览器会带着本地的 cookie 进行相关的 POST 操作,例如购买商品等
攻击步骤为:
- 用户登录目标网站,在本地生成 cookie
- 攻击者引诱用户打开恶意网站
- 用户打开后,恶意网站要求访问目标网站,发出一个请求
- 根据该请求,浏览器带着 cookie 访问目标网站,从而实现冒充用户身份进行操作
防御方法
- 验证码:CSRF 攻击的过程,往往是在用户不知情的情况下构造了请求。而验证码强制用户必须与应用进行交互,才能完成最终请求,但是会影响用户体验
- 在请求地址中添加 token 并验证:可以在 HTTP 请求中以参数的形式加入一个随机产生的 token,并在服务器端建立一个拦截器来验证这个 token,如果请求中没有 token 或者 token 内容不正确,则认为可能是 CSRF 攻击而拒绝该请求。
- 利用好 Cookie 的 SameSite属性 ,设置好后第三方站点无法访问到你的 Cookie
- 服务端验证请求来源:比如 Origin 或 Referer 字段记录了请求来源地址,这样就可以杜绝第三方站点请求源
XSS和CSRF区别
- XSS 是代码注入的问题, CSRF 是 HTTP 问题
- XSS 是没有过滤输入内容,导致浏览器执行了恶意代码, CSRF 是浏览器发送 HTTP 请求时自动带上 cookie