1.总结反射型、存储型、DOM型XSS特点和区别
XSS(跨站脚本) 漏洞是指攻击者能够在网页中注入恶意脚本,从而影响其他用户的浏览器。根据攻击的不同方式,XSS 漏洞可以分为以下三种类型:反射型 XSS、存储型 XSS 和 DOM 型 XSS。以下是它们的详细特点和区别:
1. 反射型 XSS
特点:
- 即时性:攻击者将恶意脚本嵌入到 URL 参数、查询字符串或请求头中,服务器将该内容反射回客户端。用户点击包含恶意参数的链接时,恶意脚本被执行。
- 无持久存储:恶意脚本并不存储在服务器端或数据库中,每次攻击都需要用户点击带有恶意代码的链接。
- 短生命周期:攻击只在用户点击恶意链接的那一刻生效,通常不影响其他用户,除非他们也点击了相同的链接。
触发方式:
- 用户点击攻击者构造的包含恶意脚本的 URL。
- 恶意脚本作为参数提交到服务器,服务器将其直接嵌入到响应页面中,导致脚本在客户端执行。
利用场景:
- 常见于 URL 中未对输入进行适当过滤的情况,如搜索框、表单提交等。
2. 存储型 XSS
特点:
- 持久性:攻击者将恶意脚本存储在服务器端(如数据库、文件系统、用户资料中),当其他用户访问受影响页面时,恶意脚本会被触发。
- 广泛性:一旦脚本被存储,所有访问该内容的用户都会受到影响,因此潜在影响面较大。
- 长生命周期:存储型 XSS 攻击可以长期存在,直到存储内容被删除或修改。
触发方式:
- 攻击者将恶意代码存储在用户评论、论坛帖子、个人资料等地方。
- 其他用户访问这些存储有恶意代码的页面时,恶意脚本会执行。
利用场景:
- 常见于允许用户提交内容的场景,如评论区、论坛、博客等。存储型 XSS 攻击依赖于服务器端对用户输入未进行适当处理。
3. DOM 型 XSS
特点:
- 客户端执行:攻击者通过操控客户端 JavaScript 代码或 DOM 结构来注入恶意脚本,这些脚本不会经过服务器端。
- 不依赖服务器反射:恶意脚本直接在浏览器中操作 DOM,不需要服务器端的参与。
- 灵活性:攻击者可以利用客户端代码中的漏洞,如 URL 解析、浏览器存储等,来注入恶意脚本。
触发方式:
- 攻击者通过操控页面中的 URL、文档对象模型(DOM)或 JavaScript 代码,注入恶意脚本。
- 攻击可能利用客户端脚本中的漏洞,如未经过滤的用户输入直接用于操作 DOM。
利用场景:
- 常见于客户端脚本对用户输入处理不当的情况,例如未对 URL 中的参数进行适当过滤和编码,导致恶意脚本被直接插入到 DOM 中。
区别总结
-
攻击路径:
- 反射型 XSS:恶意脚本作为请求的一部分被反射回客户端。
- 存储型 XSS:恶意脚本存储在服务器端,当用户访问存储内容时被触发。
- DOM 型 XSS:恶意脚本直接通过客户端脚本操作 DOM 被注入,不经过服务器。
-
持久性:
- 反射型 XSS:一次性,需每次都通过特定链接触发。
- 存储型 XSS:持久存在于服务器端,所有访问存储内容的用户都会受到影响。
- DOM 型 XSS:在客户端发生,不依赖服务器存储,脚本注入的效果通常依赖于客户端的处理方式。
-
触发机制:
- 反射型 XSS:需要用户点击包含恶意代码的链接。
- 存储型 XSS:用户访问受感染的页面或内容时触发。
- DOM 型 XSS:用户浏览器中的客户端脚本直接触发。
2.XSS 的fuzz字典或字典生成工具
XSS Fuzz 字典
对于 XSS 漏洞测试,以下是一些常用的 fuzz 字典或字典生成工具:
- FuzzDB:一个开源的 fuzz 测试字典库,包含了多种漏洞测试词汇,包括 XSS。GitHub - fuzzdb-project/fuzzdb: Dictionary of attack patterns and primitives for black-box application fault injection and resource discovery.
- SecLists:包含各种安全测试字典,包括用于 XSS 的 payload。 GitHub - danielmiessler/SecLists: SecLists is the security tester's companion. It's a collection of multiple types of lists used during security assessments, collected in one place. List types include usernames, passwords, URLs, sensitive data patterns, fuzzing payloads, web shells, and many more.
- XSS Payloads:专门针对 XSS 漏洞的 payload 集合,可用于 fuzz 测试。https://github.com/irwinnz/XSS-Payloads
-
OWASP Fuzzing Payloads:OWASP 提供了一些基本的 XSS 测试负载,适用于安全测试和漏洞发现。 OWASP Fuzzing Payloads
字典生成工具
-
Fuzzdb
说明:Fuzzdb 是一个用于安全测试的字典库,包含各种攻击向量和模糊测试用例,包括 XSS。GitHub: Fuzzdb -
XSS-Patrol
说明:XSS-Patrol 是一个用于生成 XSS 测试负载的工具,支持自定义和扩展字典。GitHub: XSS-Patrol
3.到XSS挑战靶场打靶
第一关
第二关
<input>
标签的 value
属性中 <script>
注入被过滤或不生效,可以尝试一些不同的编码或变体,以绕过过滤器。使用 oninput
事件时,输入框的内容会在用户输入时触发事件。可以通过这种方式尝试注入 XSS 代码。
test" οninput="alert('XSS')
第三关
查看源码发现input和value单引号
value='
之后添加闭合单引号 ,结束value
属性的值。- 然后加上一个闭合
>
来结束input
标签。 - 最后插入XSS 脚本代码
<script>alert("XSS")</script>
. - "><script>alert("XSS")</script><"
发现书名号被修改使用
' οnfοcus=alert(1) '
'
关闭当前属性值。onfocus=alert(1)
在元素获得焦点时触发alert(1)
,通常应用于input
或其他可获得焦点的元素。
第四关
使用了双引号' οnfοcus=alert(1) 改为" οnfοcus="alert(1)
第五关
试一下" οnfοcus="alert(1)发现被下划线破坏
<a>
标签:用于创建一个超链接。href="javascript:alert('xss')"
:这个属性设置了点击链接时执行的 JavaScript 代码。javascript:
协议允许在href
属性中直接执行 JavaScript 代码。href
属性在 HTML<a>
标签中指定链接的目标 URL。它可以指向网页、文件、锚点或使用 JavaScript 执行的代码。
"><a href="javascript:alert('xss')">click me</a><"
4.浏览器解析机制
-
解析 HTML:
-
词法分析:浏览器将 HTML 文档分解为标记(tokens)。
-
语法分析:这些标记被转化为 DOM 节点,形成树结构,节点包括元素节点、文本节点和注释节点。
- 构建 DOM:将所有节点链接起来形成完整的 DOM 树,表示 HTML 结构。
-
-
解析 CSS:
- 词法分析:CSS 代码被解析成规则集(ruleset),包括选择器和声明。
- 语法分析:将规则集转化为 CSSOM 树,包含所有样式规则和它们的优先级。
- 计算优先级:应用样式时,浏览器会计算样式的优先级,以确定哪些样式最终生效。
-
构建渲染树:
- 合成渲染树:结合 DOM 和 CSSOM,浏览器创建渲染树。每个渲染树节点对应一个实际显示的元素(如文本、图片)。
- 排除不可见元素:例如,
display: none
的元素不会出现在渲染树中。
-
布局:
- 计算位置和尺寸:根据渲染树,浏览器计算每个元素的确切位置和大小。这包括处理各种布局模型(如块级布局、内联布局)。
- 流式布局:大多数元素采用流式布局,即依据文档流自动定位。绝对定位或浮动元素的布局则会被单独计算。
-
绘制:
- 绘制层次:将渲染树中的每个节点绘制到屏幕上。这包括背景色、边框、文本、阴影等视觉效果。
- 分层绘制:浏览器可能将页面分成多个层次(layers),每层单独绘制,然后合成到一起。这有助于优化性能,特别是在处理复杂的动画和滚动时。