diff --git a/docs/courses/软件工程学院/计算机安全/2024-2025学年下学期期末.md b/docs/courses/软件工程学院/计算机安全/2024-2025学年下学期期末.md index 11ff6e5..2af57a4 100644 --- a/docs/courses/软件工程学院/计算机安全/2024-2025学年下学期期末.md +++ b/docs/courses/软件工程学院/计算机安全/2024-2025学年下学期期末.md @@ -14,8 +14,7 @@ author: ### 分析题 -1. 计算机安全 CIA 三元组指的是哪三个方面(3分) , 并简述对称加密和非对称加密如何实现这三个方面的(7分) ? - +1. 计算机安全 CIA 三元组指的是哪三个方面(3分) , 并简述对称加密和非对称加密如何实现这三个方面的 (7分)
答案: CIA 三元组是 @@ -27,63 +26,63 @@ author: 对称加密: - 机密性: 使用单一密钥对数据进行加密和解密 - - 完整性: 使用消息验证码来确保消息的完整性, 而消息验证码基于对称加密 + - 完整性: 使用消息验证码来确保消息的完整性, 而消息验证码基于对称加密 - 可用性: 不提供 非对称加密: - - 机密性: 使用接收方的公钥加密, 只有私钥持有者可以解密 - - 完整性: 使用数字签名确保完整性, 发送方用私钥对消息摘要签名, 接收方用其公钥验证 + - 机密性: 使用接收方的公钥加密, 只有私钥持有者可以解密 + - 完整性: 使用数字签名确保完整性, 发送方用私钥对消息摘要签名, 接收方用其公钥验证 - 可用性: 不提供
*** -2. 基于口令的认证中, 使用 256位哈希值 和 16位盐值。用户的口令长度为8个字符, 每个字符可能是: +2. 基于口令的认证中, 使用 256 位哈希值和 16 位盐值. 用户的口令长度为 8 个字符, 每个字符可能是: - - 26个小写字母(a–z) - - 26个大写字母(A–Z) - - 10个数字(0–9) + - 26 个小写字母 (a–z) + - 26 个大写字母 (A–Z) + - 10 个数字 (0–9) - 1. 给出哈希值的总数量以及盐值的总数量;(4分) + 1. 给出哈希值的总数量以及盐值的总数量 (4分)
答案: - - 哈希值的总数量: $2^{256}$ - - 盐值的总数量: $2^{16}$ + - 哈希值的总数量: $2^{256}$ + - 盐值的总数量: $2^{16}$
*** - 2. 给出口令的总数量;(2分) + 2. 给出口令的总数量 (2分)
答案: - 每一位有 $26+26+10=62$ 个选择,故总数量为 $62^{8}$ + 每一位有 $26+26+10=62$ 个选择, 故总数量为 $62^{8}$
*** - 3. 攻击者需要进行多少次攻击? 请简述具体的攻击过程。(4分) + 3. 攻击者需要进行多少次攻击? 请简述具体的攻击过程 (4分)
答案: 需要进行 $62^{8}$ 次攻击 - 考虑已知盐值的情况: + 考虑已知盐值的情况: - 获取目标用户的口令哈希H与盐值S - 随机猜测一个口令P - - 计算 Hash(S + P),并与H比较,若匹配则攻击成功 + - 计算 $Hash(S + P)$, 并与 $H$ 比较, 若匹配则攻击成功
*** -3. 为了实施 DNS 放大攻击, 攻击者必须触发中间服务器产生足够大的 DNS 响应数据包, 以超过目标组织网络链路的容量。目标系统的链路带宽是 8 Mbps +3. 为了实施 DNS 放大攻击, 攻击者必须触发中间服务器产生足够大的 DNS 响应数据包, 以超过目标组织网络链路的容量. 目标系统的链路带宽是 8 Mbps 1. 每个 DNS 响应数据包大小为 1000 字节(忽略封装开销) , 攻击者每秒必须触发多少个这样的数据包才能淹没该链路? (3分) @@ -96,25 +95,25 @@ author: *** - 2. 攻击者发送的请求数据包为60字节, 请问占据了链路中多少带宽? (3分) + 2. 攻击者发送的请求数据包为 60 字节, 请问占据了链路中多少带宽? (3分)
答案: - 带宽为: + 带宽为: $1000packet/s * 60Byte/packet = 480 kbps$
*** - 3. 给出检测DNS放大攻击的两种方法。(4分) + 3. 给出检测 DNS 放大攻击的两种方法. (4分)
答案: - - 流量异常检测:监控网络流量,特别是DNS响应包的数量和大小 - - DNS查询日志分析:检查DNS服务器的查询日志,如果发现大量重复的查询(如针对特定域名的ANY查询)来自相同源IP(攻击者伪造的受害者IP),则可能为攻击 + - 流量异常检测: 监控网络流量, 特别是 DNS 响应包的数量和大小 + - DNS 查询日志分析: 检查 DNS 服务器的查询日志, 如果发现大量重复的查询(如针对特定域名的 ANY 查询)来自相同源 IP(攻击者伪造的受害者 IP), 则可能为攻击
*** @@ -177,49 +176,49 @@ author: // 验证逻辑 if ($user && password_verify($password, $user['password'])) { // 登录成功 - echo "登录成功!欢迎访问系统。"; + echo "登录成功!欢迎访问系统."; } else { // 登录失败 - echo "登录失败:无效的ID或密码。"; + echo "登录失败: 无效的ID或密码."; } ``` - 注:SQL中, mysql_real_escape_string()函数可以转义特殊字符, 使其不能发挥作用 + 注: SQL中, mysql_real_escape_string()函数可以转义特殊字符, 使其不能发挥作用 1. 上述代码存在什么攻击漏洞? 攻击者如何绕过安全检查利用该漏洞? (5分)
答案: - 代码存在SQL注入攻击漏洞,攻击者可以在用户名输入中注入SQL代码,例如输入:' OR 1=1 -- ,这会导致查询返回所有用户(忽略密码条件) + 代码存在SQL注入攻击漏洞, 攻击者可以在用户名输入中注入SQL代码, 例如输入: ' OR 1=1 -- , 这会导致查询返回所有用户(忽略密码条件)
*** - 2. 除了 SQL 注入攻击漏洞, 还可以利用哪些攻击方法? 并解释原因。(5分) + 2. 除了 SQL 注入攻击漏洞, 还可以利用哪些攻击方法? 并解释原因. (5分)
答案: - - 暴力破解:代码中没有登录尝试次数限制或账户锁定机制,攻击者可以自动化尝试大量用户名和密码组合,直到找到正确凭证 - - 口令哈希泄露:通过SQL注入或其他方式获取数据库中的密码哈希值后,攻击者可以使用彩虹表或暴力破解工具离线破解密码 - - 跨站脚本攻击(XSS):如果登录成功或失败消息中直接输出用户输入(如用户名),且没有过滤,攻击者可能注入恶意脚本,在用户浏览器执行 + - 暴力破解: 代码中没有登录尝试次数限制或账户锁定机制, 攻击者可以自动化尝试大量用户名和密码组合, 直到找到正确凭证 + - 口令哈希泄露: 通过 SQL 注入或其他方式获取数据库中的密码哈希值后, 攻击者可以使用彩虹表或暴力破解工具离线破解密码 + - 跨站脚本攻击(XSS): 如果登录成功或失败消息中直接输出用户输入(如用户名), 且没有过滤, 攻击者可能注入恶意脚本, 在用户浏览器执行
*** - 3. 如何检测和过滤用户输入? 请修改代码以修复漏洞。(5分) + 3. 如何检测和过滤用户输入? 请修改代码以修复漏洞. (5分)
答案: - - 使用预处理语句(参数化查询)防止SQL注入。 - - 对输入进行验证和过滤,如使用filter_var函数检查邮箱格式的用户名,或限制输入长度 - - 转义输出以防止XSS + - 使用预处理语句(参数化查询)防止 SQL 注入. + - 对输入进行验证和过滤, 如使用 filter_var 函数检查邮箱格式的用户名, 或限制输入长度 + - 转义输出以防止 XSS - 修改sql部分代码如下: + 修改 sql 部分代码如下: ``` php $stmt = $pdo->prepare("SELECT username, password FROM users WHERE username = ?"); @@ -232,18 +231,18 @@ author: *** - 4. 给出检测用户输入的一种方法。(5分) + 4. 给出检测用户输入的一种方法. (5分)
答案: - 一种检测用户输入的方法是使用白名单验证。例如,对于用户名,只允许字母、数字和特定字符,使用正则表达式进行匹配: + 一种检测用户输入的方法是使用白名单验证.例如, 对于用户名, 只允许字母、数字和特定字符, 使用正则表达式进行匹配: ``` php if (preg_match('/^[a-zA-Z0-9_]+$/', $username)) { // 输入有效 } else { - // 输入无效,拒绝处理 + // 输入无效, 拒绝处理 } ``` diff --git a/docs/courses/软件工程学院/计算机安全/计算机安全_软件工程学院_2024Spring_期末_回忆版.md b/docs/courses/软件工程学院/计算机安全/计算机安全_软件工程学院_2024Spring_期末_回忆版.md index 8cd6e68..d7c30bc 100644 --- a/docs/courses/软件工程学院/计算机安全/计算机安全_软件工程学院_2024Spring_期末_回忆版.md +++ b/docs/courses/软件工程学院/计算机安全/计算机安全_软件工程学院_2024Spring_期末_回忆版.md @@ -1,189 +1,253 @@ --- -title: 计算机安全_软件工程学院_2024Spring_期末_回忆版 -category: - - 软件工程学院 - - 课程资料 -tag: - - 试卷 +title: 2023-2024学年下学期期末 author: - タクヤマ + - KirisameVanilla --- -## 2024春季学期计算机安全期末考试试卷(回忆版) +## 2023-2024学年下学期期末试卷(回忆版) -### 选择题较为零散,未能回忆出来 +### 分析题 -### 1 +1. 回答下列问题 -(1) 简述数字签名的原理 **(2分)** + 1. 简述数字签名的原理 **(2分)** -(2) 数字签名技术是如何保证数据的完整性、不可否认性和来源认证的? **(6分)** +
+ 答案: + 简述定义即可, 不赘述 -(3) 数字签名与消息认证技术有什么联系与区别? **(2分)** +
-解: + *** -(1) 简述定义即可,不赘述 + 2. 数字签名技术是如何保证数据的完整性、不可否认性和来源认证的? **(6分)** -(2) +
+ 答案: + 考虑如下情况: -考虑如下情况:Bob要向Alice发送一个带数字签名的消息,进行签名需要用到Bob的私钥:没有Bob的私钥无法修改消息,这保证了完整性;只有Bob的公钥能正确验签,这保证了来源认证与不可否认性。 + - Bob要向Alice发送一个带数字签名的消息, 进行签名需要用到Bob的私钥 + - 没有Bob的私钥无法修改消息, 这保证了完整性 + - 只有Bob的公钥能正确验签, 这保证了来源认证与不可否认性 -(按照这个思路分点阐述即可) + (按照这个思路分点阐述即可) -(3) +
-- 联系:两者都用于验证消息的真实性和完整性 + *** -- 区别: - - 数字签名基于非对称加密,提供不可否认性 - - 消息认证技术基于对称加密,无法提供不可否认性 + 3. 数字签名与消息认证技术有什么联系与区别? **(2分)** -(言之有理即可) +
+ 答案: -### 2 + - 联系: 两者都用于验证消息的真实性和完整性 -现在考虑一个TCP SYN欺骗的情景。假设服务器端的TCP连接表有512个表项,对于每个未建立的连接,每隔30s重新发送一次连接请求,重复7次后将表项删除。 + - 区别: + - 数字签名基于非对称加密, 提供不可否认性 + - 消息认证技术基于对称加密, 无法提供不可否认性 -(1) 简述TCP SYN欺骗攻击的原理 **(2分)** + (言之有理即可) -(2) 假设初始时TCP连接表已被洪泛,为保证TCP连接表始终被填满,攻击者应以什么速率发送数据包?**(4分)** +
-(3) 假设一个TCP数据包为40字节,忽略成帧消耗,求攻击消耗的带宽 **(4分)** + *** -解: +2. 现在考虑一个TCP SYN欺骗的情景. 假设服务器端的TCP连接表有512个表项, 对于每个未建立的连接, 每隔30s重新发送一次连接请求, 重复7次后将表项删除. -(1) 简述定义即可,不赘述 + 1. 简述TCP SYN欺骗攻击的原理 **(2分)** +
+ 答案: + 简述定义即可, 不赘述 -(2) +
-- 每个表项存活时间:30s × 7 = 210s -- 需在210s内填满512个表项: - - 速率 = 512 / 210 ≈ 2.44 包/秒 + *** -(3) + 2. 假设初始时TCP连接表已被洪泛, 为保证TCP连接表始终被填满, 攻击者应以什么速率发送数据包?**(4分)** +
+ 答案: + 每个表项存活时间: 30s × 7 = 210s, 需在210s内填满512个表项, 速率 = 512 / 210 ≈ 2.44 包/秒 -- 每个TCP包40字节: - - 带宽 = 2.44 包/秒 × 40 字节/包 × 8 比特/字节 = 780.8 bps +
-### 3 + *** -考虑如下代码: + 3. 假设一个TCP数据包为40字节, 忽略成帧消耗, 求攻击消耗的带宽 **(4分)** -```c -void hello(char * tag){ - char data[12]; - gets(data); - printf("your %s is %s\n",tag,data); -} -``` +
+ 答案: + 每个TCP包40字节, 带宽 = 2.44 包/秒 × 40 字节/包 × 8 比特/字节 = 780.8 bps -(1) 假设输入长度为19字节时程序运行不会崩溃,那么输入“Computer Security”后,程序会输出什么?**(3分)** +
-(2) 假设输入长度为19字节时程序不会崩溃,而输入长度为20字节时程序崩溃,如果想要修改tag的话,输入长度应至少为多少字节?为什么?**(4分)** + *** -(3) 修改上述代码以避免安全隐患。**(3分)** +3. 考虑如下代码: -解: + ``` c + void hello(char* tag){ + char data[12]; + gets(data); + printf("your %s is %s\n", tag, data); + } + ``` -(1) 对于栈溢出问题,我们首先要对函数调用机制有充分的了解,根据压栈机制,调用函数时被压栈的顺序为: +
+ 分析过程 -参数 $\rightarrow$ 返回地址 $\rightarrow$ 旧栈指针 $\rightarrow$ 局部变量 + 对于栈溢出问题, 我们首先要对函数调用机制有充分的了解, 根据压栈机制, 调用函数时被压栈的顺序为: -那么什么时候程序会崩溃呢?返回地址被篡改时肯定会崩溃,因为程序返回时会访问到非法的地址;旧的栈指针被篡改时也会崩溃,因为程序虽然能正常返回到原运行位置,但是指示旧栈帧的指针被篡改到非法地址,破坏了上下文,根据压栈顺序,肯定是旧栈帧的指针会先被覆盖。 + 参数 $\rightarrow$ 返回地址 $\rightarrow$ 旧栈指针 $\rightarrow$ 局部变量 -所以,根据(2)中的题设,输入19字节不崩溃而输入20字节崩溃(注意gets函数会在末尾添加一个'\0'空字符),即可推测栈内分配了20字节空间:当输入为20字节长度时,'\0'空字符添加在第21个字符处,应该正好开始覆盖在旧栈帧的帧指针处,导致崩溃。 + 那么什么时候程序会崩溃呢?返回地址被篡改时肯定会崩溃, 因为程序返回时会访问到非法的地址;旧的栈指针被篡改时也会崩溃, 因为程序虽然能正常返回到原运行位置, 但是指示旧栈帧的指针被篡改到非法地址, 破坏了上下文, 根据压栈顺序, 肯定是旧栈帧的指针会先被覆盖. -在经过实际的gdb测试后,我们得到具体栈帧结构如图所示(以4字节,即32位为一行): + 所以, 根据2.中的题设, 输入19字节不崩溃而输入20字节崩溃(注意gets函数会在末尾添加一个'\0'空字符), 即可推测栈内分配了20字节空间: 当输入为20字节长度时, '\0'空字符添加在第21个字符处, 应该正好开始覆盖在旧栈帧的帧指针处, 导致崩溃. -```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] | -+---------------------------+ <--- 栈顶 (低地址) -``` + 在经过实际的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 \ is Computer Sec" (data为输入的前12字节) + 注: 关于 1. 中的 tag, 我们询问了陈志立教授, 得到的回答如下: "1 题中的本意主要是问data变量对应的打印输出, 题目可能不够严谨. 在具体回答时, 也可以把tag的内容用某个符号表示, 比如\. "我们感谢陈老师的澄清! -(2) 要修改tag的话,至少要输入28字节,理由见上述分析与栈帧结构图 +
-(3) + *** -使用安全函数fgets即可,例如: + 1. 假设输入长度为19字节时程序运行不会崩溃, 那么输入 "Computer Security" 后, 程序会输出什么?**(3分)** +
+ 答案: + 程序会输出 "your \ is Computer Sec" (data 为输入的前 12 字节) -```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的内容用某个符号表示,比如\”。我们感谢陈老师的澄清! + *** -### 4 + 2. 假设输入长度为19字节时程序不会崩溃, 而输入长度为20字节时程序崩溃, 如果想要修改tag的话, 输入长度应至少为多少字节?为什么?**(4分)** +
+ 答案: + 要修改 tag 的话, 至少要输入 28 字节, 理由见上述分析与栈帧结构图 -(1) 三种云服务部署模型分别是什么?**(3分)** +
-(2) 若想在云上搭建自己的操作系统,应该采取哪种部署模型?为什么?**(3分)** + *** -(3) 如何加固云上的操作系统?**(4分)** + 3. 修改上述代码以避免安全隐患. **(3分)** +
+ 答案: -解: + 使用安全函数fgets即可, 例如: -(1) SaaS, PaaS, IaaS + ``` C + void hello(char * tag) + { + char data[12]; + fgets(data, sizeof(data), stdin); + printf("your %s is %s\n", tag, data); + } + ``` -(2) +
-私有云,用户可自主定制硬件、网络及安全策略,满足操作系统底层架构的灵活部署需求,同时资源独享避免与其他租户冲突,适合对数据隐私和合规性要求高的场景 + *** -(3) 参考书上相关章节,言之有理即可 +4. 回答下列问题 -### 5 + 1. 三种云服务部署模型分别是什么?**(3分)** +
+ 答案: + SaaS, PaaS, IaaS -(1) 用户认证方法有哪些?**(4分)** +
-(2) 为防止明文口令泄露和离线字典攻击,应如何储存口令相关信息?**(4分)** + *** -(3) 假设一个用户有8个属性,每个属性有10个值,如果采用基于角色的访问控制,应设置多少个角色?**(4分)** + 2. 若想在云上搭建自己的操作系统, 应该采取哪种部署模型?为什么?**(3分)** +
+ 答案: + 私有云, 用户可自主定制硬件、网络及安全策略, 满足操作系统底层架构的灵活部署需求, 同时资源独享避免与其他租户冲突, 适合对数据隐私和合规性要求高的场景 -(4) 考虑sql语句: +
-```sql -SELECT * FROM userdata WHERE UID = $_GET["uname"] AND PASSWORD = $_GET["password"]; -``` + *** -该语句有无安全隐患?攻击者如何在不知道任何用户名和口令的情况下,如何攻击得到全部信息?**(4分)** + 3. 如何加固云上的操作系统?**(4分)** +
+ 答案: + 参考书上相关章节, 言之有理即可 -(5) 为防范(4) 中的攻击,应采用何种防火墙?为什么?**(4分)** +
-解: + *** -(1) 个人知道的信息;个人持有的物品;静态生物特征;动态生物特征 +5. 回答下列问题 -(2) 加盐,简述加盐原理 + 1. 用户认证方法有哪些?**(4分)** +
+ 答案: + 个人知道的信息, 个人持有的物品, 静态生物特征, 动态生物特征 -(3) $10^8$ 个 +
-(4) + *** -有隐患,向uname字段输入: OR 1=1 -- 以绕过密码检测 + 2. 为防止明文口令泄露和离线字典攻击, 应如何储存口令相关信息?**(4分)** +
+ 答案: + 加盐, 简述加盐原理 -(5) 应采用应用级防火墙,因为要对sql语句进行检查,这是应用层上的机制 +
+ + *** + + 3. 假设一个用户有8个属性, 每个属性有10个值, 如果采用基于角色的访问控制, 应设置多少个角色?**(4分)** +
+ 答案: + $10^8$ 个 + +
+ + *** + + 4. 考虑sql语句: + + ``` sql + SELECT * FROM userdata WHERE UID = $_GET["uname"] AND PASSWORD = $_GET["password"]; + ``` + + 该语句有无安全隐患?攻击者如何在不知道任何用户名和口令的情况下, 如何攻击得到全部信息?**(4分)** +
+ 答案: + 有隐患, 向 uname 字段输入 OR 1=1 -- 以绕过密码检测 + +
+ + *** + + 5. 为防范(4) 中的攻击, 应采用何种防火墙?为什么?**(4分)** +
+ 答案: + 应采用应用级防火墙, 因为要对sql语句进行检查, 这是应用层上的机制 + +