XSS漏洞的原理&利用&防御

👁️ 9841 ❤️ 472
XSS漏洞的原理&利用&防御

一、前言

XSS 的本质是一种高级钓鱼手法。

二、什么是 XSS

XSS (Cross Site Scripting) 攻击全称跨站脚本攻击,是为不和层叠样式表 (Cascading Style Sheets, CSS) 的缩写混淆,故将跨站脚本攻击缩写为 XSS。

XSS 是一种经常出现在 Web 应用中的计算机安全漏洞,它允许恶意 Web 用户将代码植入到提供给其它用户使用的页面中。

XSS 的运行原理是将恶意的 script 脚本插入进 html/css/js 文件当中。代码长这样:

三、XSS 的危害

前文我们说 XSS 本质上来说是一种钓鱼攻击,所以 XSS 的危害角度上也是以钓鱼能够造成的危害为主。

四、XSS 简单应用场景举例

这里先介绍 XSS 的应用方法,如此一来讲起来不会太空洞,也能与下面的攻击手段有所呼应。以反射型 XSS 为例,原理图如下。

这里借用国光师傅的图片进行分析

这是一个恶意的 QQ 空间钓鱼网站,在输入框内输入username%20,再对登陆的按钮设置一个 href 到真正的 QQ 空间官网。然而当时用户输入的用户名密码已经被攻击者窃取了。

五、XSS 基本攻击手段

XSS 根据效果不同主要分为三种类型

反射型 XSS,存储型 XSS,DOM 型 XSS

危害性来说,存储型 XSS >> 反射型 XSS ~= DOM 型 XSS

我们接下来细讲一下这三种 XSS 的攻击手段。

(一) 反射型 XSS 及绕过手段

什么是反射型 XSS

反射型 XSS,也叫非持久型 XSS,转瞬即逝。

利用比较简单,比如在搜索框中,我记得当时 2020 年,b 站的搜索框还是存在 XSS 的,现在没有了。

反射型 XSS 的 Payload 如下:

效果如图所示:

绕过

当大多数标签被禁止时的绕过

Lab: Reflected XSS into HTML context with most tags and attributes blocked

还是常规的 Fuzz 测试,在尝试 XSS 攻击之后,若失败了就进行 Fuzz 测试,因为无法排除是不是 WAF 过滤了部分关键字。

探测出来 onresize 标签还是有效的,我们可以通过这一串 Payload 唤起打印服务:

" onload=this.style.width='100px'>

当事件处理器与 href 被禁用时的绕过

老样子还是需要 Fuzz 的。如果渗透测试真正遇到这种情况的话,svg标签的绕过方式还是主流。

Lab: Reflected XSS with event handlers and href attributes blocked

Payload:

values=javascript:alert(1) />

Click me

还有一些svg标签的绕过手段:

对 script 进行闭合后构造 Payload

对某些语句中的符号进行闭合。

有些 Web 后端代码会通过反斜杠转义,对很多单引号字符进行过滤,那么转义之后的代码就不能进行原 Payload 的作用。

XSS Insert Into-> JavaScript

这种 Payload 可以是通过修改 Web 网站内部 JavaScript 来实现的,因为 JavaScript 本身就可以直接执行 alert 方法,无需使用&token=;script-src-elem 'unsafe-inline'

使用script-src-elem对 CSP 进行覆盖,从而进行 XSS 攻击。

(二)存储型 XSS

存储型 XSS 是危害性最大的 XSS 了,它一般出现于评论留言功能处,大致的利用方法与绕过手段与反射型 XSS 很像,原理图如下。

如果执行起来也是插入进上下文标签当中,和之前反射型 XSS 的代码图类似,都是没有加任何的过滤手段,如图。

在新增的评论中将 username 构造成 Payload:

username=

而这一条评论,又会被保存到数组或者是数据库当中(这个看 Web 程序的设计),就造成了存储型 XSS。

绕过手段不再逼逼,和反射型 XSS 是异曲同工。

DOM 型 XSS

DOM 型的 XSS 是基于文档对象模型 Document Objeet Model,DOM)的一种漏洞。说白了就是那些标签,比如img,input等这种类型的 DOM 节点标签而已,而 DOM 型 XSS 打的就是这些。

注:DOM 型 XSS 与反射型,存储型 XSS 有很大的区别,比如dom型是在浏览器的前端产生的漏洞,没有数据发到服务器,而其他两个都要发送数据到服务器。

一些常用的标签与属性:

注:下面列举的标签大部分是可以自动触发 js 代码的,无需用户去交互,大部分情况下希望是自动触发而不是等用户去触发。

标签

说明

Payload

scirpt

img

标签定义 HTML 页面中的图像。

input

标签规定了用户可以在其中输入数据的输入字段。

说明

Payload

onfocus 事件在对象获得焦点时发生

竞争焦点,从而触发 onblur 事件

input 标签的 autofocus 属性规定当页面加载时元素应该自动获得焦点。可以通过 autofocus 属性自动执行本身的 focus 事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发

details

标签通过提供用户开启关闭的交互式控件,规定了用户可见的或者隐藏的需求的补充细节。

说明

Payload

ontoggle 事件规定了在用户打开或关闭

元素时触发

使用details 标签的 open 属性触发ontoggle事件,无需用户去点击即可触发

svg

标签用来在HTML页面中直接嵌入SVG 文件的代码

select

说明

Payload

通过autofocus属性规定当页面加载时元素应该自动获得焦点,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发

textarea