feat: 2024+2025 spring 计算机安全期末考试答案 (#12)

close #10 

have something to do with #7
This commit is contained in:
霧雨バニラ 2025-09-08 00:04:06 +08:00 committed by GitHub
commit 5671a01a21
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
2 changed files with 382 additions and 17 deletions

View File

@ -0,0 +1,252 @@
---
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个小写字母(az)
- 26个大写字母(AZ)
- 10个数字(09)
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>
***

View File

@ -15,21 +15,56 @@ author:
### 1
1简述数字签名的原理 **(2分)**
(1) 简述数字签名的原理 **(2分)**
2数字签名技术是如何保证数据的完整性、不可否认性和来源认证的? **(6分)**
(2) 数字签名技术是如何保证数据的完整性、不可否认性和来源认证的? **(6分)**
3数字签名与消息认证技术有什么联系与区别 **(2分)**
(3) 数字签名与消息认证技术有什么联系与区别? **(2分)**
解:
(1) 简述定义即可,不赘述
(2)
考虑如下情况Bob要向Alice发送一个带数字签名的消息进行签名需要用到Bob的私钥没有Bob的私钥无法修改消息这保证了完整性只有Bob的公钥能正确验签这保证了来源认证与不可否认性。
(按照这个思路分点阐述即可)
(3)
- 联系:两者都用于验证消息的真实性和完整性
- 区别:
- 数字签名基于非对称加密,提供不可否认性
- 消息认证技术基于对称加密,无法提供不可否认性
(言之有理即可)
### 2
现在考虑一个TCP SYN欺骗的情景。假设服务器端的TCP连接表有512个表项对于每个未建立的连接每隔30s重新发送一次连接请求重复7次后将表项删除。
1简述TCP SYN欺骗攻击的原理 **(2分)**
(1) 简述TCP SYN欺骗攻击的原理 **(2分)**
2假设初始时TCP连接表已被洪泛为保证TCP连接表始终被填满攻击者应以什么速率发送数据包**(4分)**
(2) 假设初始时TCP连接表已被洪泛为保证TCP连接表始终被填满攻击者应以什么速率发送数据包**(4分)**
3假设一个TCP数据包为40字节忽略成帧消耗求攻击消耗的带宽 **(4分)**
(3) 假设一个TCP数据包为40字节忽略成帧消耗求攻击消耗的带宽 **(4分)**
解:
(1) 简述定义即可,不赘述
(2)
- 每个表项存活时间30s × 7 = 210s
- 需在210s内填满512个表项
- 速率 = 512 / 210 ≈ 2.44 包/秒
(3)
- 每个TCP包40字节
- 带宽 = 2.44 包/秒 × 40 字节/包 × 8 比特/字节 = 780.8 bps
### 3
@ -43,29 +78,93 @@ void hello(char * tag){
}
```
1假设输入长度为19字节时程序运行不会崩溃那么输入“Computer Security”后程序会输出什么**(3分)**
(1) 假设输入长度为19字节时程序运行不会崩溃那么输入“Computer Security”后程序会输出什么**(3分)**
2假设输入长度为19字节时程序不会崩溃而输入长度为20字节时程序崩溃如果想要修改tag的话输入长度应至少为多少字节为什么**(4分)**
(2) 假设输入长度为19字节时程序不会崩溃而输入长度为20字节时程序崩溃如果想要修改tag的话输入长度应至少为多少字节为什么**(4分)**
3修改上述代码以避免安全隐患。**(3分)**
(3) 修改上述代码以避免安全隐患。**(3分)**
解:
(1) 对于栈溢出问题,我们首先要对函数调用机制有充分的了解,根据压栈机制,调用函数时被压栈的顺序为:
参数 $\rightarrow$ 返回地址 $\rightarrow$ 旧栈指针 $\rightarrow$ 局部变量
那么什么时候程序会崩溃呢?返回地址被篡改时肯定会崩溃,因为程序返回时会访问到非法的地址;旧的栈指针被篡改时也会崩溃,因为程序虽然能正常返回到原运行位置,但是指示旧栈帧的指针被篡改到非法地址,破坏了上下文,根据压栈顺序,肯定是旧栈帧的指针会先被覆盖。
所以,根据(2)中的题设输入19字节不崩溃而输入20字节崩溃注意gets函数会在末尾添加一个'\0'空字符即可推测栈内分配了20字节空间当输入为20字节长度时'\0'空字符添加在第21个字符处应该正好开始覆盖在旧栈帧的帧指针处导致崩溃。
在经过实际的gdb测试后我们得到具体栈帧结构如图所示以4字节即32位为一行
```c
+---------------------------+
| ... (main函数的栈帧) |
+---------------------------+ <--- hello函数栈帧底部 (高地址)
| 参数: char *tag 指针 |
+---------------------------+
| 返回地址 (ret addr) |
+---------------------------+
| 旧栈帧的帧指针 (Saved ebp) |
+---------------------------+ <--- 栈顶指针(ESP)在进入函数后移动
| ebx (储存GOT表的位置) |
+---------------------------+
| 内存padding (16字节对齐?) |
+---------------------------+
| 局部变量: char data[8]-[11]|
+---------------------------+
| 局部变量: char data[4]-[7] |
+---------------------------+
| 局部变量: char data[0]-[3] |
+---------------------------+ <--- 栈顶 (低地址)
```
那么,我们就能解答此题如下:
(1) 程序会输出 "your \<tag\> is Computer Sec" data为输入的前12字节
(2) 要修改tag的话至少要输入28字节理由见上述分析与栈帧结构图
(3)
使用安全函数fgets即可例如
```c
void hello(char * tag){
char data[12];
fgets(data, sizeof(data), stdin);
printf("your %s is %s\n", tag, data);
}
```
关于1中的tag我们询问了陈志立教授得到的回答如下1题中的本意主要是问data变量对应的打印输出题目可能不够严谨。在具体回答时也可以把tag的内容用某个符号表示比如\<tag\>”。我们感谢陈老师的澄清!
### 4
1三种云服务部署模型分别是什么**(3分)**
(1) 三种云服务部署模型分别是什么?**(3分)**
2若想在云上搭建自己的操作系统应该采取哪种部署模型为什么**(3分)**
(2) 若想在云上搭建自己的操作系统,应该采取哪种部署模型?为什么?**(3分)**
3如何加固云上的操作系统**(4分)**
(3) 如何加固云上的操作系统?**(4分)**
解:
(1) SaaS, PaaS, IaaS
(2)
私有云,用户可自主定制硬件、网络及安全策略,满足操作系统底层架构的灵活部署需求,同时资源独享避免与其他租户冲突,适合对数据隐私和合规性要求高的场景
(3) 参考书上相关章节,言之有理即可
### 5
1用户认证方法有哪些**(4分)**
(1) 用户认证方法有哪些?**(4分)**
2为防止明文口令泄露和离线字典攻击应如何储存口令相关信息**(4分)**
(2) 为防止明文口令泄露和离线字典攻击,应如何储存口令相关信息?**(4分)**
3假设一个用户有8个属性每个属性有10个值如果采用基于角色的访问控制应设置多少个角色**(4分)**
(3) 假设一个用户有8个属性每个属性有10个值如果采用基于角色的访问控制应设置多少个角色**(4分)**
4考虑sql语句
(4) 考虑sql语句
```sql
SELECT * FROM userdata WHERE UID = $_GET["uname"] AND PASSWORD = $_GET["password"];
@ -73,4 +172,18 @@ SELECT * FROM userdata WHERE UID = $_GET["uname"] AND PASSWORD = $_GET["password
该语句有无安全隐患?攻击者如何在不知道任何用户名和口令的情况下,如何攻击得到全部信息?**(4分)**
5为防范4中的攻击应采用何种防火墙为什么**(4分)**
(5) 为防范(4) 中的攻击,应采用何种防火墙?为什么?**(4分)**
解:
(1) 个人知道的信息;个人持有的物品;静态生物特征;动态生物特征
(2) 加盐,简述加盐原理
(3) $10^8$ 个
(4)
有隐患向uname字段输入 OR 1=1 -- 以绕过密码检测
(5) 应采用应用级防火墙因为要对sql语句进行检查这是应用层上的机制