博客地址:https://drun1baby.github.io/
从0到1完全掌握 XSS文章篇幅较长,建议分块观看学习。
0x01 前言本人二刷 XSS,在一刷的时候是以漏洞挖掘与漏洞利用为主,实际上完全对于实战根本没有概念,出去工作一段时间之后才算是拿出来应用。写这篇文章是打算再好好地梳理一遍 XSS。
XSS 的本质是一种高级钓鱼手法。
0x02 什么是 XSSXSS (Cross Site Scripting) 攻击全称跨站脚本攻击,是为不和层叠样式表 (Cascading Style Sheets, CSS) 的缩写混淆,故将跨站脚本攻击缩写为 XSS。XSS 是一种经常出现在 Web 应用中的计算机安全漏洞,它允许恶意 Web 用户将代码植入到提供给其它用户使用的页面中。
XSS 的运行原理是将恶意的 script 脚本插入进 html/css/js 文件当中。代码长这样。
0x03 XSS 的危害前文我们说 XSS 本质上来说是一种钓鱼攻击,所以 XSS 的危害角度上也是以钓鱼能够造成的危害为主。
0x04 XSS 简单应用场景举例这里我想先介绍 XSS 的应用方法,如此一来讲起来不会太空洞,也能与下面的攻击手段有所呼应。以反射型 XSS 为例,原理图如下。
这里借用国光师傅的图片进行分析
这是一个恶意的 QQ 空间钓鱼网站,我们在输入框内输入username%20,再对登陆的按钮设置一个 href 到真正的 QQ 空间官网。然而当时用户输入的用户名密码已经被攻击者窃取了。
0x05 XSS 基本攻击手段XSS 根据效果不同主要分为三种类型
反射型 XSS,存储型 XSS,DOM 型 XSS
危害性来说,存储型 XSS >> 反射型 XSS ~= DOM 型 XSS我们接下来细讲一下这三种 XSS 的攻击手段。
1. 反射型 XSS 及绕过手段(1) 什么是反射型 XSS反射型 XSS,也叫非持久型 XSS,转瞬即逝。
利用比较简单,比如在搜索框中,我记得当时 2020 年,b 站的搜索框还是存在 XSS 的,现在没有了。
反射型 XSS 的 Payload 如下
&token=;script-src-elem 'unsafe-inline'
我们使用script-src-elem对 CSP 进行覆盖,从而进行 XSS 攻击。
2. 存储型 XSS存储型 XSS 是危害性最大的 XSS 了,它一般出现于评论留言功能处,大致的利用方法与绕过手段与反射型 XSS 很像,原理图如下。
如果执行起来也是插入进上下文标签当中,和之前反射型 XSS 的代码图类似,都是没有加任何的过滤手段,如图。
我们在新增的评论中将 username 构造成 Payload
username=
而这一条评论,又会被保存到数组或者是数据库当中(这个看 Web 程序的设计),就造成了存储型 XSS。
绕过手段不再逼逼,和反射型 XSS 是异曲同工。
3. DOM 型 XSS(重点!)DOM 型的 XSS 是基于文档对象模型 Document Objeet Model,DOM)的一种漏洞。说白了就是那些标签,比如img,input等这种类型的 DOM 节点标签而已,而 DOM 型 XSS 打的就是这些。
我个人觉得 DOM 型 XSS 与反射型,存储型 XSS 的区别可谓不是一点半点,虽然有人把 DOM 型 XSS 归结到反射型 XSS 当中,但是我们看下去,会感受到些许不同。
DOM 型 XSS 全部都是由前端进行触发的。所以我们平常如果挖洞,还是很考验代码审计的耐心的。
我们下面讲几种常见的攻击方式,在这之前,我们先把可以利用的 DOM 节点,以及其 Payload 拉出来。Payload 摘自HACK 师傅的文章
一些常用的标签与属性下面我列举的标签大部分是可以自动触发 js 代码的,无需用户去交互,大部分情况下我们也是希望是自动触发而不是等用户去触发。
scirpt 标签
img 标签标签定义 HTML 页面中的图像。
input 标签标签规定了用户可以在其中输入数据的输入字段。onfocus 事件在对象获得焦点时发生:
竞争焦点,从而触发 onblur 事件:
input 标签的 autofocus 属性规定当页面加载时元素应该自动获得焦点。可以通过 autofocus 属性自动执行本身的 focus 事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发:
details 标签
使用details 标签的 open 属性触发ontoggle事件,无需用户去点击即可触发:
svg 标签
select 标签
通过autofocus属性规定当页面加载时元素应该自动获得焦点,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发:
iframe 标签
video 标签
audio 标签
body 标签
标签定义文档的主体。onscroll 事件在元素滚动条在滚动时触发。我们可以利用换行符以及 autofocus,当用户滑动滚动条的时候自动触发,无需用户去点击触发:
textarea 标签
keygen 标签
marquee 标签 //Chrome不行,火狐和IE都可以
isindex 标签标签定义文档与外部资源的关系。在无 CSP 的情况下才可以使用:
4. DOM 型 XSS 的利用和前文说的一样,各种 js 中捣鼓
(1) jQuery 中的 DOM 型 XSS有问题的代码如下图所示
若为进行任意过滤的时候 Payload
(2) 利用遗留下的测试代码不多扯了,详见 WebGoat代码审计-07-XSS 利用测试代码触发 DOM 型 XSS)
0x06 XSS 的实战应用几种钓鱼,和 getshellXSS 实战攻击思路总结从xss到getshell--xss的深层次利用与探讨
0x07 CSRF 和 XSS 的区别1、CSRF是跨站请求伪造; XSS是跨域脚本攻击。2、CSRF需要用户先登录网站A,获取cookie; XSS不需要登录。3、CSRF是利用网站A本身的漏洞,去请求网站A的api; XSS是向网站A注入JS代码,然后执行JS里的代码,篡改网站A的内容。(XSS利用的是站点内的信任用户,而CSRF则是通过伪装来自受信任用户的请求来利用受信任的网站。你可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求。)
0x08 XSS 的防御主要是两层:一: 对输出端的数据进行编码二: 验证输入
目前时间 2022 年 5 月,感觉 XSS 不像之前那么泛滥了。
1. 对输出端的数据进行编码1)将一些字符进行转义,例如<,>进行转义2)白名单,通过一些标签限制3)不要把后端传进来的数据直接作为 HTML 渲染,进行处理
2. CSP 的应用严格的 CSP 在 XSS 的防范中可以起到以下的作用:
禁止加载外域代码,防止复杂的攻击逻辑。
禁止内联脚本执行。
禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。
合理使用上报可以及时发现 XSS,利于尽快修复问题。
3. 其他安全措施HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。
验证码:防止脚本冒充用户提交危险操作。