一、反射型、存储型、DOM型XSS的特点和区别
1. 特点
反射型 XSS (Reflected XSS)
- 即时性:攻击脚本是即时注入并立即执行的。当用户点击恶意链接或提交含有恶意代码的表单时,服务器将这些数据反射回页面,从而触发脚本。
- 无持久性:脚本不会被存储在服务器上,只是在单个请求的响应中出现。这意味着每次攻击都需要用户触发恶意链接或提交表单。
- 依赖用户交互:攻击通常需要用户点击恶意链接或访问恶意网址才能执行。
存储型 XSS (Stored XSS)
- 持久性:攻击脚本被存储在服务器上(例如,数据库、日志文件或其他持久存储中),因此,当用户访问受影响的页面时,脚本会被持续执行。
- 广泛影响:一旦脚本被存储,任何访问相关页面的用户都会受到影响。这使得存储型 XSS 更具破坏性,因为它不依赖于特定的用户交互来触发。
- 更隐蔽:由于脚本存储在服务器上,攻击者可以在较长时间内持续影响用户,且较难被检测和修复。
DOM 型 XSS (DOM-based XSS)
- 客户端处理:脚本的注入和执行完全发生在客户端浏览器中,不依赖于服务器端的响应。攻击者通过操控客户端 JavaScript 来注入恶意代码。
- 无服务器干预:与存储型和反射型 XSS 不同,DOM 型 XSS 完全在客户端进行,服务器端不会看到恶意脚本。
- 依赖客户端脚本:攻击脚本通常利用页面中存在的客户端脚本漏洞或不安全的 DOM 操作来注入和执行。
2. 区别
执行机制
-
反射型 XSS:
- 执行时机:攻击脚本在用户发送请求并收到服务器响应时执行。
- 依赖点:服务器反射用户输入的数据(如 URL 参数)到响应中,并直接执行恶意代码。
-
存储型 XSS:
- 执行时机:攻击脚本在存储在服务器端的内容(如数据库或日志文件)被用户访问时执行。
- 依赖点:恶意脚本被存储在服务器上,当用户访问含有这些存储内容的页面时,脚本被执行。
-
DOM 型 XSS:
- 执行时机:攻击脚本在客户端浏览器中执行,与服务器端响应无关。
- 依赖点:攻击脚本通过客户端 JavaScript 和 DOM 操作被注入和执行,完全在浏览器端进行。
存储方式
-
反射型 XSS:
- 存储:恶意代码不被存储在服务器上,只在请求响应的瞬间存在。
-
存储型 XSS:
- 存储:恶意代码被存储在服务器端(如数据库、日志等),可以被长期保留和多次触发。
-
DOM 型 XSS:
- 存储:没有服务器端存储,所有的脚本注入和执行都是在客户端完成的。
触发方式
-
反射型 XSS:
- 触发:通常需要用户点击恶意链接、提交表单或在请求中包含恶意数据。
-
存储型 XSS:
- 触发:当用户访问包含恶意脚本的页面时触发,脚本在存储内容中长期存在。
-
DOM 型 XSS:
- 触发:通过客户端脚本中的漏洞(如不安全的 DOM 操作)注入和执行,通常不需要用户的直接交互。
持久性
-
反射型 XSS:
- 持久性:攻击只有在当前请求的响应中有效,攻击结束后恶意脚本不再存在。
-
存储型 XSS:
- 持久性:攻击脚本存储在服务器上,对所有访问相关内容的用户都有长期影响。
-
DOM 型 XSS:
- 持久性:脚本在客户端存在和执行,不依赖服务器端的存储和响应。
安全防范
-
反射型 XSS:
- 防范:对用户输入进行适当的过滤和编码,确保在返回响应时脚本不会被执行。
-
存储型 XSS:
- 防范:对所有用户输入进行严格的验证和编码,防止恶意内容被存储。
-
DOM 型 XSS:
- 防范:审查和改进客户端 JavaScript 代码,确保安全地处理和操作 DOM,不允许恶意代码注入。
二、XSS挑战靶场打靶
1. 第一关
根据URL,猜测name后面的内容可以做插入
构建payload
<script>alert('1')</script>
2. 第二关
查看源码
发现输入的语句被赋值给了vlaue,并且在input标签里面,所以闭合value和input标签就可以正常弹窗了
构造payload
"><script>alert('1');</script><”
3. 第三关
查看源码,发现写入的js语句的<>以及部分符号都被实体化了
利用onfocus事件绕过
构造payload
'onfocus=javascript:alert()'
4. 第四关
查看源码,发现<>被注释掉了
双引号闭合,<input>标签,所以我们还能继续利用onfocus事件
构建payload
"onfocus=javascript:alert()"
5. 第五关
查看源码,发现”script”被替换成了“scr_ipt”
使用a href标签法
构建payload
"> <a href=javascript:alert()>111</a> <"
三、XSS的fuzz字典
https://github.com/TheKingOfDuck/fuzzDicts
四、HTML解析机制
浏览器将收到的HTML、CSS、JavaScript等代码转化为用户可见的网页,这个过程就是浏览器解析机制。
1. HTML解析
- 构建DOM树: 浏览器会将HTML代码解析成DOM树,DOM树是HTML文档的树状表示,每个节点代表一个HTML元素。
- 解析过程:
- 从上到下,逐行解析HTML代码。
- 遇到
<
符号,表示开始一个新标签。 - 遇到
>
符号,表示标签结束。 - 遇到属性,将属性添加到对应的节点。
- 遇到文本内容,添加到对应的文本节点。
- DOM树的作用:
- 提供了对HTML文档结构的编程接口。
- JavaScript可以通过DOM API操作DOM树,实现动态网页效果。
2. CSS解析
- 构建CSSOM树: 浏览器会将CSS样式表解析成CSSOM树,CSSOM树是CSS样式规则的树状表示。
- 解析过程:
- 从上到下,逐行解析CSS代码。
- 识别选择器、属性和值。
- 建立选择器和属性之间的对应关系。
- CSSOM树的作用:
- 描述了页面元素的样式。
- 浏览器根据CSSOM树来渲染页面。
3. 渲染树的构建
- 合并DOM树和CSSOM树: 浏览器将DOM树和CSSOM树合并,生成渲染树。
- 渲染树: 渲染树包含了页面中所有可见元素的样式信息。
- 渲染树的作用:
- 确定页面中每个元素的位置和样式。
- 为后续的布局和绘制提供基础。
4. 布局
- 计算元素的位置和大小: 浏览器根据渲染树,计算出每个元素在页面中的确切位置和大小。
- 布局过程:
- 从根节点开始,递归计算每个节点的位置和大小。
- 考虑元素的盒模型、浮动、定位等属性。
5. 绘制
- 将像素绘制到屏幕: 浏览器根据布局结果,将每个元素的像素绘制到屏幕上。
- 绘制过程:
- 从渲染树的根节点开始,按照文档流的顺序绘制每个节点。
- 对于复杂效果,可能需要多次绘制。
6. JavaScript的执行
- JavaScript引擎: 浏览器内置JavaScript引擎,负责执行JavaScript代码。
- 执行过程:
- JavaScript代码可以操作DOM、CSSOM和渲染树。
- JavaScript代码的执行可能触发重新布局和绘制。
7. 影响解析过程的因素
- 网络状况: 网络速度会影响资源加载速度,从而影响页面渲染速度。
- 代码质量: 代码的书写质量、优化程度会影响解析和渲染效率。
- 浏览器性能: 不同浏览器的解析引擎性能不同,会影响页面渲染速度。
8. 浏览器优化
- 减少HTTP请求: 合并文件、使用雪碧图、启用gzip压缩。
- 优化JavaScript: 延迟加载、最小化代码、避免全局变量。
- 优化CSS: 减少样式表大小、使用CSS预处理器、避免使用过多的选择器。
- 合理使用图片: 选择合适的图片格式、压缩图片、使用响应式图片。