一、前言
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) /> 还有一些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 input 标签规定了用户可以在其中输入数据的输入字段。 说明 Payload onfocus 事件在对象获得焦点时发生 竞争焦点,从而触发 onblur 事件 input 标签的 autofocus 属性规定当页面加载时元素应该自动获得焦点。可以通过 autofocus 属性自动执行本身的 focus 事件,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发 details 说明 Payload ontoggle 事件规定了在用户打开或关闭 使用details 标签的 open 属性触发ontoggle事件,无需用户去点击即可触发 svg select 说明 Payload 通过autofocus属性规定当页面加载时元素应该自动获得焦点,这个向量是使焦点自动跳到输入元素上,触发焦点事件,无需用户去触发 iframe video audio body标签定义 HTML 页面中的图像。
说明
Payload
onscroll 事件在元素滚动条在滚动时触发。我们可以利用换行符以及 autofocus,当用户滑动滚动条的时候自动触发,无需用户去点击触发:
…
textarea
keygen
-
marquee
-
//Chrome不行,火狐和IE都可以
isindex
标签定义文档与外部资源的关系。在无 CSP 的情况下才可以使用
DOM 型 XSS 的利用
(1) jQuery 中的 DOM 型 XSS
有问题的代码如下图所示
若为进行任意过滤的时候 Payload:
(2) 利用遗留下的测试代码
详见WebGoat代码审计-07-XSS 利用测试代码触发 DOM 型 XSS)
六、CSRF 和 XSS 的区别
1、CSRF是跨站请求伪造; XSS是跨域脚本攻击。
2、CSRF需要用户先登录网站A,获取cookie; XSS不需要登录。
3、CSRF是利用网站A本身的漏洞,去请求网站A的api; XSS是向网站A注入JS代码,然后执行JS里的代码,篡改网站A的内容。(XSS利用的是站点内的信任用户,而CSRF则是通过伪装来自受信任用户的请求来利用受信任的网站。你可以这么理解CSRF攻击:攻击者盗用了你的身份,以你的名义向第三方网站发送恶意请求。)
七、XSS 的防御
1.对输出端的数据进行编码
2.验证输入
对输出端的数据进行编码
将一些字符进行转义,例如<,>进行转义
白名单,通过一些标签限制
不要把后端传进来的数据直接作为 HTML 渲染,进行处理
CSP 的应用
严格的 CSP 在 XSS 的防范中可以起到以下的作用:
禁止加载外域代码,防止复杂的攻击逻辑。
禁止内联脚本执行。
禁止外域提交,网站被攻击后,用户的数据不会泄露到外域。
合理使用上报可以及时发现 XSS,利于尽快修复问题。
其他安全措施
HTTP-only Cookie: 禁止 JavaScript 读取某些敏感 Cookie,攻击者完成 XSS 注入后也无法窃取此 Cookie。
验证码:防止脚本冒充用户提交危险操作。
常用payload
将受害者的cookie发送到攻击者服务器