3-10〔OSCP ◈ 研记〕❘ WEB应用攻击▸XSS攻击理论基础
郑重声明: 本文所有安全知识与技术,仅用于探讨、研究及学习,严禁用于违反国家法律法规的非法活动。对于因不当使用相关内容造成的任何损失或法律责任,本人不承担任何责任。 如需转载,请注明出处且不得用于商业盈利。
💥👉点赞❤️ 关注🔔 收藏⭐️ 评论💬💥
更多文章戳👉Whoami!-CSDN博客🚀
𖤐 嘿,经过前面的预热,我们正式打开这扇门,来吧 !
𖤐 𝓗𝓮𝔂, 𝓪𝓯𝓽𝓮𝓻 𝔀𝓪𝓻𝓶-𝓾𝓹,𝔀𝓮'𝓻𝓮 𝓷𝓸𝔀 𝓸𝓯𝓯𝓲𝓬𝓲𝓪𝓵𝓵𝔂 𝓸𝓹𝓮𝓷𝓲𝓷𝓰 𝓽𝓱𝓲𝓼 𝓭𝓸𝓸𝓻,𝓒𝓸𝓶𝓮 𝓸𝓷 !
→ 信息收集
→ 漏洞检测
→ 初始立足点▸WEB应用攻击▸XSS攻击理论基础-----我们在这儿~ 🔥🔥🔥
→ 权限提升
→ 横向移动
→ 报告/分析
→ 教训/修复
目录
1.跨站脚本攻击(XSS)
1.1 XSS类型
1.1.1 存储型XSS(持久型XSS)
1.1.2 反射型XSS(非持久型XSS)
1.1.3 基于DOM的XSS
1.1.3.1 什么是DOM
1.DOM可视化表示
2.HTML文件与DOM树的区别
3.DOM树的三大特点
4.示例说明
1.1.3.2 DOM XSS概述
1.与传统XSS的对比
2.DOM型XSS攻击流程
1.1.3.3 防御策略与最佳实践
1.关键防御措施
2.框架安全实践
3.检测与排查建议
1.2 JavaScript概述
1.2.1 JavaScript在Web中的角色
1.2.2 JavaScript 的双面性:功能与风险
1.2.3 JavaScript概述
1.3 识别XSS漏洞
1.3.1 XSS漏洞识别流程
1.3.2 常见XSS入口点
1.3.3 特殊字符过滤检测
1.3.4 Web应用程序编码方式
💥创作不易💥求一波暴击👉点赞❤️ 关注🔔 收藏⭐️ 评论💬
1.跨站脚本攻击(XSS)
跨站脚本攻击(XSS)是一种利用网站对用户信任的安全漏洞,攻击者通过注入恶意脚本(如:JavaScript)到网页中,当其他用户访问时执行这些脚本。曾经被认为是低风险漏洞,如今XSS已成为高风险且普遍的安全威胁。
XSS漏洞根源在于数据清理不足:即Web应用程序未能正确处理用户输入,未删除或转换危险字符和字符串,导致攻击者能够注入并执行恶意代码。
1.1 XSS类型
XSS类型对比表:
类型 | 存储机制 | 影响范围 | 持久性 | 触发方式 |
---|---|---|---|---|
🔒 存储型XSS | 恶意代码存储在服务器数据库 | 所有访问受影响页面的用户 | 长期存在 | 用户浏览正常页面 |
↪️ 反射型XSS | 不存储,通过URL参数传递 | 仅点击恶意链接的用户 | 一次性 | 用户点击特制链接 |
1.1.1 存储型XSS(持久型XSS)
解释:存储型XSS是将恶意内容“存储”在服务器上,之后当任何人访问该页面时,恶意代码就会自动执行,影响到所有访问该页面的用户。
比喻:就像把一张恶意纸条放入公共邮箱,所有查看邮箱的人都会受到影响。
详细步骤:
-
用户输入评论 - 在输入框提交包含恶意JavaScript的文本(如:
<script>alert('XSS Attack!')</script>
-
客户端操作 - 点击“提交”按钮,评论内容通过AJAX或表单提交发送到服务器端。
-
服务器端存储 - 未经充分过滤直接将评论内容存入数据库的某个表中。
-
数据库保存 - 保存的内容若没有做适当的过滤或转义,恶意的 <script> 标签也会一起存储)。
-
展示评论 - 其他用户访问时该页面时,网站从数据库读取并展示评论内容,恶意的 <script> 标签可能会被插入到页面中,发给客户端浏览器。
-
XSS攻击发生 - 客户端浏览器渲染页面时,恶意的JavaScript代码就会被执行。例如,恶意的JavaScript代码触发弹出警告框,或者进行其他有害操作(例如窃取用户的Cookies、重定向用户等)。
1.1.2 反射型XSS(非持久型XSS)
比喻:就像收到含恶意链接的邮件,只有点击链接的人才会受到影响。恶意信息就会通过链接进入到你的浏览器中。
详细步骤:
- 攻击者构造恶意URL
- 诱导用户点击
- 服务器返回含恶意代码的响应
- 浏览器执行恶意脚本
特点:
- 攻击恶意代码不存储在服务器上
- 通过URL参数传递恶意载荷
- 需要社交工程诱导用户点击
1.1.3 基于DOM的XSS
1.1.3.1 什么是DOM
DOM(文档对象模型) 是浏览器用来表示和操作网页的内部数据结构。当网页加载时,浏览器将HTML转换为树形结构(DOM):每个标签、文本和属性都成为树的一个节点。浏览器根据这个结构渲染页面。
1.DOM可视化表示
2.HTML文件与DOM树的区别
特性 | HTML文件 | DOM树 |
---|---|---|
本质 | 静态纯文本文件 | 动态树状结构 |
内容 | 标签、属性和内容 | 节点(Node)及其关系 |
状态 | 固定不变 | 可动态修改,通过JavaScript修改 |
用途 | 描述网页结构和内容 | 浏览器内部页面表示 |
样式:
3.DOM树的三大特点
① 树状结构
-
每个HTML元素都是一个节点(Node)
-
节点间形成父子关系
-
html
是根节点,head
和body
是其子节点
② 动态性(⚠️ 安全关键)
-
可通过JavaScript动态修改
-
能添加、删除或修改节点
-
正是这一特性导致DOM XSS攻击的可能性
③ 可访问性
-
可通过JavaScript访问任何节点
-
提供丰富的API进行操作
4.示例说明
以上是JavaScript 代码。功能:修改 <h1>
标签内容。该代码通过操作 DOM(文档对象模型),实现对网页中 <h1>
标签文本内容的修改,各部分说明如下:
代码片段 | 类型 | 作用说明 |
---|---|---|
document | 对象 | JavaScript 中代表当前网页文档的根对象,是访问和操作整个 DOM 树的入口。 |
.querySelector('h1') | 方法 | document 的内置方法,通过 CSS 选择器查找元素:- 'h1' 为 CSS 选择器,匹配所有 <h1> 标签;- 仅返回第一个匹配的 <h1> 元素。 |
.textContent | 属性 | DOM 元素的内置属性,用于获取或设置元素的纯文本内容(不含 HTML 标签)。 |
= '你好!' | 赋值操作 | 将找到的 <h1> 元素的 textContent 属性值设置为 '你好!' ,替换其原有文本。 |
1.1.3.2 DOM XSS概述
基于DOM的XSS攻击利用浏览器解析机制,通过修改页面DOM植入恶意JavaScript代码,在用户浏览器中触发执行。
1.与传统XSS的对比
特性 | 传统XSS(存储型) | 基于DOM的XSS |
---|---|---|
执行位置 | 服务器端 | 纯客户端(通过JS操作) |
服务器依赖 | 需要服务器返回恶意代码 | 不依赖服务器响应 |
检测难度 | 相对容易 | 难以检测 |
数据流 | 服务器-客户端 | 客户端内部 |
2.DOM型XSS攻击流程
-
🖊️ 用户输入提交 - 在网页的表单/输入框提交包含恶意脚本的评论内容:
<script>alert('XSS Attack!');</script>
-
🔄 客户端处理 - 网站JavaScript代码从网页上获取评论内容,并通过document.getElementById方法动态地将其插入到网页中:
// 危险示例:未经过滤直接使用 const userInput = document.getElementById('comment').value;
-
🌳 DOM操作 - 通过
innerHTML
、document.write()
等方法动态插入内容document.body.innerHTML += userInput; // 直接插入DOM
-
⚡ 浏览器解析 - 如果网站的JavaScript代码没有正确处理你的输入,恶意的 <script> 标签会被当做代码直接执行(直接弹框),即在客户端浏览器执行了恶意 <script> 标签。
-
💥 攻击执行 - 恶意脚本在用户浏览器中执行,比如:窃取cookie、重定向等。
1.1.3.3 防御策略与最佳实践
1.关键防御措施
-
✅ 输入验证与过滤
-
对所有用户输入进行严格验证
-
使用白名单机制允许安全内容
-
-
✅ 安全DOM操作
-
避免使用
innerHTML
、outerHTML
、document.write()
-
优先使用
textContent
、setAttribute
-
-
✅ 使用安全API
-
采用DOMPurify等库进行HTML清理
-
实施内容安全策略(CSP)
-
-
✅ 编码输出
-
对动态内容进行适当的编码
-
区分HTML编码、JavaScript编码和URL编码
-
2.框架安全实践
// ❌ 危险方式:直接插入HTML
element.innerHTML = userInput;// ✅ 安全方式:文本内容设置
element.textContent = userInput;// ✅ 安全方式:使用专用API
const safeHTML = DOMPurify.sanitize(userInput);
element.innerHTML = safeHTML;
// React示例:自动转义内容
<div>{userInput}</div> // 自动安全处理// Vue示例:安全模板渲染
<template>{{ userInput }}</template>
3.检测与排查建议
代码审查要点
-
检查所有使用
innerHTML
的地方 -
审查
eval()
、setTimeout()
、setInterval()
中的动态代码 -
检查URL解析和处理逻辑(
location
、hash
、search
)
测试方法
-
使用自动化扫描工具(如OWASP ZAP、Burp Suite)
-
手动测试:输入特殊字符观察行为
-
检查数据流:从源点到危险函数调用
1.2 JavaScript概述
JavaScript是一种高级编程语言,已成为现代Web应用程序的核心组成部分。所有现代浏览器都内置JavaScript引擎,能够在浏览器中直接执行JavaScript代码。
1.2.1 JavaScript在Web中的角色
浏览器处理流程:
1.2.2 JavaScript 的双面性:功能与风险
1.正常功能
JavaScript的核心作用:访问和修改页面DOM(文档对象模型),从而实现:
- 交互式用户体验(如点击按钮后即时更新内容)
- 动态页面效果(无需重新加载整个页面即可更新内容)
- 提升网页的交互性和响应速度
2.安全风险(从攻击者角度)
若攻击者成功将恶意JavaScript代码注入应用程序,可利用其DOM访问能力实施不法行为:
- 篡改页面元素(如重定向登录表单至钓鱼网站)
- 窃取敏感信息(如提取用户输入的密码)
- 盗用用户会话(如获取并利用会话 Cookie)
1.2.3 JavaScript概述
函数声明与调用
// 第1-3行:函数声明
function multiplyValues(x, y) {return x * y;
}// 第5行:函数调用
let a = multiplyValues(3, 5);// 第6行:控制台输出
console.log(a); // 输出: 15
🔤 弱类型语言特性
JavaScript是弱类型语言,变量类型由赋值自动推断,无需给变量定义类型:
let variable = 15; // 数字类型
variable = "文本"; // 现在变为字符串类型
variable = true; // 现在变为布尔类型
🛠️ 浏览器“开发者工具”实践
-
在Firefox浏览器打开
about:blank
空白页 -
通过以下方式打开开发者工具:
-
菜单:Web开发者 → Web控制台
-
快捷键:
Ctrl+Shift+K
(Windows) /Cmd+Shift+K
(Mac) -
在控制台中,执行函数并检索输出。将值打印到浏览器的控制台console。
-
1.3 识别XSS漏洞
1.3.1 XSS漏洞识别流程
1.3.2 常见XSS入口点
入口点类型 | 示例 | 风险等级 |
---|---|---|
🔍 搜索框 | 网站搜索功能 | 🔴 高风险 |
💬 评论框 | 博客评论、论坛回复 | 🔴 高风险 |
📝 表单字段 | 联系表单、注册表单 | 🔴 高风险 |
👤 用户资料 | 用户名、个人描述 | 🟡 中风险 |
🌐 URL参数 | ?search=keyword | 🔴 高风险 |
📊 文件上传 | 文件名、元数据 | 🟡 中风险 |
💡 检测提示:重点关注所有接受用户输入的区域,特别是那些会将输入内容返回给用户的功能。
1.3.3 特殊字符过滤检测
如果应用程序不删除或编码这些字符,说明它容易受到XSS攻击。因为应用程序将这些字符解释为代码,从而使额外的代码得以执行。
关键测试字符集:
字符 | HTML用途 | XSS测试意义 | 编码表示 |
---|---|---|---|
< > | 标签界定 | 脚本标签注入 | < > |
' " | 字符串界定 | 属性逃逸 | ' " |
{ } | 代码块界定 | JS函数注入 | { } |
& | 实体引用 | 编码绕过 | & |
; | 语句结束 | 多语句注入 | ; |
测试方法:
-
输入基本测试载荷:
<script>alert('XSS')</script> # 弹框效果
-
检查响应:
- 如果弹窗出现 → 说明漏洞存在
- 如果字符被编码/过滤 → 需要进一步分析
1.3.4 Web应用程序编码方式
编码(Encoding)在Web应用中的作用,尤其是利用编码方式进行XSS(跨站脚本攻击)。虽然有多种类型的编码,但在Web应用程序中最常遇到的是HTML编码和URL编码。
📊 编码类型对比表:
编码类型 | 目的 | 示例 | 安全意义 |
---|---|---|---|
🔗 URL编码 (百分比编码) | 保护URL结构 | 空格 → %20 | 防止URL注入 |
🌐 HTML编码 | 防止特殊意义的字符(比如 <, >, &, ", ' 等)被误解释为HTML标签、属性或脚本的一部分 | < → < | XSS防护关键 |
📝 JavaScript编码 | JS字符串安全 | " → \x22 | 防止JS注入 |
🛡️ HTML编码详解:
字符 | 编码 | 说明 |
---|---|---|
< | < | 小于号 |
> | > | 大于号 |
& | & | 和号 |
" | " | 双引号 |
' | ' | 单引号 |
HTML编码示例:
<!-- 原始文本: -->
<script>alert("XSS")</script><!-- HTML编码后: -->
<script>alert("XSS")</script>
URL编码示例:
原始URL:https://example.com/search?q=<script>
编码后:https://example.com/search?q=%3Cscript%3E
又例如:
如果想在网页上显示 < 和 >,直接写 < 和 >会让浏览器误认为它们是HTML标签的标记。需要使用HTML编码来显示这些字符。即:<和>以文本方式输出,而非HTML标签的标记。
💥创作不易💥求一波暴击👉点赞❤️ 关注🔔 收藏⭐️ 评论💬
您的支持是我创作最大的动力!