跳到主要内容

2024-2025学年下学期期末

2024-2025学年下学期期末试卷(不全)

分析题

  1. 计算机安全 CIA 三元组指的是哪三个方面(3分) , 并简述对称加密和非对称加密如何实现这三个方面的 (7分)

    答案:

    CIA 三元组是

    • 机密性 Confidentiality
    • 完整性 Integrity
    • 可用性 Availability

    对称加密:

    • 机密性: 使用单一密钥对数据进行加密和解密
    • 完整性: 使用消息验证码来确保消息的完整性, 而消息验证码基于对称加密
    • 可用性: 不提供

    非对称加密:

    • 机密性: 使用接收方的公钥加密, 只有私钥持有者可以解密
    • 完整性: 使用数字签名确保完整性, 发送方用私钥对消息摘要签名, 接收方用其公钥验证
    • 可用性: 不提供

  2. 基于口令的认证中, 使用 256 位哈希值和 16 位盐值. 用户的口令长度为 8 个字符, 每个字符可能是:

    • 26 个小写字母 (a–z)
    • 26 个大写字母 (A–Z)
    • 10 个数字 (0–9)
    1. 给出哈希值的总数量以及盐值的总数量 (4分)

      答案:
      • 哈希值的总数量: 22562^{256}
      • 盐值的总数量: 2162^{16}

    2. 给出口令的总数量 (2分)

      答案:

      每一位有 26+26+10=6226+26+10=62 个选择, 故总数量为 62862^{8}


    3. 攻击者需要进行多少次攻击? 请简述具体的攻击过程 (4分)

      答案:

      需要进行 62862^{8} 次攻击 考虑已知盐值的情况:

      • 获取目标用户的口令哈希H与盐值S
      • 随机猜测一个口令P
      • 计算 Hash(S+P)Hash(S + P), 并与 HH 比较, 若匹配则攻击成功

  3. 为了实施 DNS 放大攻击, 攻击者必须触发中间服务器产生足够大的 DNS 响应数据包, 以超过目标组织网络链路的容量. 目标系统的链路带宽是 8 Mbps

    1. 每个 DNS 响应数据包大小为 1000 字节(忽略封装开销) , 攻击者每秒必须触发多少个这样的数据包才能淹没该链路? (3分)

      答案:

      8Mb/s1000Byte/packet=1000packet/s\frac{8 Mb/s}{1000 Byte/packet} = 1000 packet/s


    2. 攻击者发送的请求数据包为 60 字节, 请问占据了链路中多少带宽? (3分)

      答案:

      带宽为: 1000packet/s60Byte/packet=480kbps1000packet/s * 60Byte/packet = 480 kbps


    3. 给出检测 DNS 放大攻击的两种方法. (4分)

      答案:
      • 流量异常检测: 监控网络流量, 特别是 DNS 响应包的数量和大小
      • DNS 查询日志分析: 检查 DNS 服务器的查询日志, 如果发现大量重复的查询(如针对特定域名的 ANY 查询)来自相同源 IP(攻击者伪造的受害者 IP), 则可能为攻击

  4. 回答下列问题

    1. 恶意软件的三种传播机制? (3分)

      答案:
      • 感染内容
      • 漏洞利用
      • 社会工程学

    2. 恶意软件的四种有效载荷? (2分)

      答案:
      • 系统损坏
      • 攻击代理
      • 信息窃取
      • 隐蔽

    3. 为了防止恶意软件攻击, 如何加固操作系统? (5分)

      答案:
      • 及时更新补丁
      • 设置访问控制
      • 提高用户的安全意识
      • 加强检测与扫描
      • 等等

      言之有理即可


  5. 以下是一段 PHP 登录验证代码

    // 获得用户输入的ID和passwd
    $username = ...;
    $password = ...;

    // SQL查询
    SELECT username, password FROM users WHERE username = '$username' AND password = '$password';

    // 验证逻辑
    if ($user && password_verify($password, $user['password'])) {
    // 登录成功
    echo "登录成功!欢迎访问系统.";
    } else {
    // 登录失败
    echo "登录失败: 无效的ID或密码.";
    }

    注: SQL中, mysql_real_escape_string()函数可以转义特殊字符, 使其不能发挥作用

    1. 上述代码存在什么攻击漏洞? 攻击者如何绕过安全检查利用该漏洞? (5分)

      答案:

      代码存在SQL注入攻击漏洞, 攻击者可以在用户名输入中注入SQL代码, 例如输入: ' OR 1=1 -- , 这会导致查询返回所有用户(忽略密码条件)


    2. 除了 SQL 注入攻击漏洞, 还可以利用哪些攻击方法? 并解释原因. (5分)

      答案:
      • 暴力破解: 代码中没有登录尝试次数限制或账户锁定机制, 攻击者可以自动化尝试大量用户名和密码组合, 直到找到正确凭证
      • 口令哈希泄露: 通过 SQL 注入或其他方式获取数据库中的密码哈希值后, 攻击者可以使用彩虹表或暴力破解工具离线破解密码
      • 跨站脚本攻击(XSS): 如果登录成功或失败消息中直接输出用户输入(如用户名), 且没有过滤, 攻击者可能注入恶意脚本, 在用户浏览器执行

    3. 如何检测和过滤用户输入? 请修改代码以修复漏洞. (5分)

      答案:
      • 使用预处理语句(参数化查询)防止 SQL 注入.
      • 对输入进行验证和过滤, 如使用 filter_var 函数检查邮箱格式的用户名, 或限制输入长度
      • 转义输出以防止 XSS

      修改 sql 部分代码如下:

      $stmt = $pdo->prepare("SELECT username, password FROM users WHERE username = ?");
      $stmt->execute([$username]);
      $user = $stmt->fetch();


    4. 给出检测用户输入的一种方法. (5分)

      答案:

      一种检测用户输入的方法是使用白名单验证.例如, 对于用户名, 只允许字母、数字和特定字符, 使用正则表达式进行匹配:

      if (preg_match('/^[a-zA-Z0-9_]+$/', $username)) {
      // 输入有效
      } else {
      // 输入无效, 拒绝处理
      }