---
title: 2024-2025学年下学期期末
author:
  - name: タクヤマ
    url: https://github.com/takuyamafuru
  - name: KirisameVanilla
    url: https://vanillaaaa.org/
  - name: psycho Lee
    url: https://github.com/psycho0816
    email: 10235101500@stu.ecnu.edu.cn
---

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

### 分析题

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

    <details>
    <summary>答案:</summary>
     CIA 三元组是

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

    对称加密:

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

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

    </details>

    ***

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

    - 26个小写字母(a–z)
    - 26个大写字母(A–Z)
    - 10个数字(0–9)

    1. 给出哈希值的总数量以及盐值的总数量；(4分)

        <details>
        <summary>答案:</summary>

        - 哈希值的总数量： $2^{256}$
        - 盐值的总数量： $2^{16}$

        </details>

        ***

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

        <details>
        <summary>答案:</summary>

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

        </details>

        ***

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

        <details>
        <summary>答案:</summary>

        需要进行 $62^{8}$ 次攻击
        考虑已知盐值的情况：
        - 获取目标用户的口令哈希H与盐值S
        - 随机猜测一个口令P
        - 计算 Hash(S + P)，并与H比较，若匹配则攻击成功

        </details>

        ***

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

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

        <details>
        <summary>答案:</summary>

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

        </details>

        ***

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

        <details>
        <summary>答案:</summary>

        带宽为：
        $1000packet/s * 60Byte/packet = 480 kbps$

        </details>

        ***

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

        <details>
        <summary>答案:</summary>

        - 流量异常检测：监控网络流量，特别是DNS响应包的数量和大小
        - DNS查询日志分析：检查DNS服务器的查询日志，如果发现大量重复的查询（如针对特定域名的ANY查询）来自相同源IP（攻击者伪造的受害者IP），则可能为攻击
        </details>

        ***

4. 回答下列问题

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

        <details>
        <summary>答案:</summary>

        - 感染内容
        - 漏洞利用
        - 社会工程学

        </details>

        ***

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

        <details>
        <summary>答案:</summary>

        - 系统损坏
        - 攻击代理
        - 信息窃取
        - 隐蔽

        </details>

        ***

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

        <details>
        <summary>答案:</summary>

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

        言之有理即可
        </details>

        ***

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

    ``` 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分)

        <details>
        <summary>答案:</summary>

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

        </details>

        ***

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

        <details>
        <summary>答案:</summary>

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

        </details>

        ***

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

        <details>
        <summary>答案:</summary>

        - 使用预处理语句（参数化查询）防止SQL注入。
        - 对输入进行验证和过滤，如使用filter_var函数检查邮箱格式的用户名，或限制输入长度
        - 转义输出以防止XSS

        修改sql部分代码如下：

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

        </details>

        ***

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

        <details>
        <summary>答案:</summary>

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

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

        </details>

        ***
