ToB企服应用市场:ToB评测及商务社交产业平台

标题: 【太原理工大学】软件系统安全—分析题 [打印本页]

作者: 南飓风    时间: 2024-7-10 20:15
标题: 【太原理工大学】软件系统安全—分析题
OK了,又是毫无准备的一场仗,我真是ありがとうございます 凸^o^凸

根据前几年传下来的信息,所谓“分析”,就是让你根据情节自行计划,比方如何计划表单等,这类多从实验中出,王老师强调好好做实验一定有他的道理。

实验一:毛病分析实验

   对于实验一我实在想不出来他会怎么考,索性就把实验顺一遍。但是百分之八十不会考这么细,时间紧张的同砚可以把一跳了(反正看了也一知半解的,我也研究不透),直接看后面吧 (。ì _ í。)  
  解释什么是栈溢出毛病以及它如何被利用:
栈溢出毛病是一种常见的软件安全毛病,主要发生在使用C或C++等语言编写的程序中。这种毛病是由于程序在处理处罚输入数据时,没有正确地检查数据的长度,导致输入数据超出了预定的栈空间,覆盖了栈上的其他紧张数据。
在实验报告中提到的例3-6中,如果程序没有正确处理处罚输入数据,攻击者可以构造一个很长的字符串作为输入,这个字符串的长度超出了程序为其分配的缓冲区巨细。当这个长字符串被复制到栈上的局部变量时,就会发生栈溢出。如果攻击者控制了溢出数据的内容,就可以覆盖栈上的返回地址,使得程序实行攻击者指定的代码。

函数栈结构分析:

比方本图带给我们的信息:
0018XXXX:0018开头的内存地址是Win7系统栈空间在VC6下的特性;
0xCCCCCCCC:函数局部变量初始化为一片0xCCCCCCCC,符合debug版的特性,这是编译情况为我们调试程序赋予的便利。有4片0xCCCCCCCC(如图),分析有4个函数。

栈底:18FF88、18FF48、18FED4、18FE74,貌似一串连续的栈底(如图),形成4个栈结构,且存在函数的嵌套调用,由于四个栈堆起来,如果不是嵌套调用,一个函数实行完毕,栈空间会释放掉,调用下一个函数时,栈还在原来的位置,就不会堆起来。
解释:栈帧是函数调用时在栈上分配的一块内存区域,包罗了局部变量、参数、返回地址等信息。每个函数调用都会在栈上创建一个新的栈帧。根据提供的内存地址(比方18FF88、18FF48、18FED4、18FE74),我们可以看到这些地址是连续的,这表明它们可能是同一个栈的差异部分。如果存在多个连续的栈帧,这通常意味着有函数的嵌套调用。当一个函数调用另一个函数时,新的栈帧会在当前栈帧的顶部创建。

接下来,我们来看函数调用过程:
1.参数入栈
2.返回地址入栈
3.生存栈底
4.变量入栈
5.生存CPU情况
main函数:

1.参数入栈--------------------------------------01 00 00 00 B8 0F 2D 00 50 10 2D 00
2.返回地址入栈--------------------------------------B9 12 40 00
3.生存栈底--------------------------------------88 FF 18 00
4.变量入栈--------------------------------------42 CC CC CC --0A 00 00 00
5.生存CPU情况(/Zi 稳定生存12字节)-----00 00 00 00 00 00 00 00 00 E0 FD 7E
   1.三个参数分析是main函数,命令行个数是1个,命令行字符指针数组和情况变量字符指针数组的首地址分别为0x002D0FB8和0x2D1050;
  2.main函数返回地址是0x004012B9;
  3.调用方栈底是0x0018FF88;
  4.变量看情势有5个,1个int型0A 00 00 00(值为10),1个char型字符串68 65 6C 6C 00(内容为“hell”,00为字符串竣事字符‘\0’),1个double型33 33 33 33 33 33 2F 40(值为15.6),1个float型00 00 28 41(值为10.5),1个char型0x42(值为‘B’);
  5.当前CPU三个寄存器的值分别为0x7EFDE000、0x00000000、0x00000000。
  从main函数自下至上,三个函数临时称作fun1、fun2、fun3(先声明,再使用)。
  fun 1函数:
fun 1被main调用

1.参数入栈--------------------------------------2C FF 18 00
2.返回地址入栈--------------------------------------02 11 40 00
3.生存栈底--------------------------------------48 FF 18 00
4.变量入栈--------------------------------------CD CC 5C 41 0A 00 00 00
5.生存CPU情况(/Zi 稳定生存12字节)------48 FF 18 00 00 00 00 00 00 E0 FD 7E
   1.参数是0x0018FF2C,是指向main函数char型变量的地址,由此可以推断main函数的5个变量有可能是一个结构体的5个成员,否则,仅仅传地址要么造成后面的变量偶然义,要么造成不合理的指针运算;
  2.fun1函数返回地址是0x00401102;
  3.fun1函数的调用方main函数的栈底是0x0018FF48;
  4.变量有两个,1个int型0A 00 00 00(值为10),1个float型CD CC 5C 41(值是13.8f);
  5.当前CPU三个寄存器的值分别为0x7EFDE000、0x00000000、0x0018FF48,此时fun1的栈顶被更新为其栈底生存的值。
  第2、3个函数同理,2被1调用,3被2调用,一层套一层,直接上图


   

  一个不严谨的方法:一片C为一块,信息都是从这一片C的前后得出的,前三组为生存CPU情况,后面几组main和调用函数有区别,自己看看。
  
实验二:SQL注入

   本实验中最紧张的就是一个SQL注入,至于前面安装设置小皮另有靶场什么的不说了
  SQL的本质就是“故意写错填空内容”,将本来要输入的数据填写为代码,使得服务器向数据库的正常查询变成了不正常的代码实行,以此来达到入侵。
SQL 手工注入(非盲注)的根本步骤如下:
1)判定是否存在注入,注入是字符型照旧数字型。
2)猜解 SQL 查询语句中的字段数及字段顺序。
3)获取当前数据库名。
4)获取数据库中的表名。
5)获取表中的字段名。
6)下载数据。
案例背景
假设你正在测试一个电子商务网站的安全性,该网站有一个搜索功能,允许用户通过用户名搜索用户信息。搜索框的URL参数如下:
  1. http://example.com/search?username=[user_input]
复制代码

步骤1:判定是否存在注入
首先,必要确定目的应用是否存在SQL注入毛病,并判定注入类型(字符型或数字型)
   字符型注:输入 `'`(单引号)导致查询失败或出现异常(你输入的数据实在是作为SQL查询语句提交给数据库的,加一个单引号后会将本来的查询语句打乱,导致报错)。
  数字型注入:输入特殊字符或SQL语句片段,如 `1' or '1'='1`,如果返回效果与预期不符,可能存在注入(通过1=1这个恒等式(不是1==1,SQL中语法与C不一样)来使or这条语句判定为真,以达到侵入的目的)。
  
步骤2:猜解字段数及字段顺序
通过SQL注入点,实验改变查询效果的排序,来确定SQL查询中涉及的字段数目和顺序。
输入以下字符串来确定查询语句中的字段数:
  1. 1' order by 1 --+
  2. //如果页面正常显示,增加数字直到出现错误,比如:
  3. 1' order by 3 --+  //如果页面出错,说明查询语句涉及3个字段
  4. // 在语法上--会使之后的语句变成注释,由此破坏查询命令
复制代码
步骤3:获取当前数据库名
利用SQL注入点,实验获取当前数据库的名称
  1. ' union select database() --+
复制代码
步骤4:获取数据库中的表名
在确认了数据库名后,下一步是获取数据库中包罗的表名
  1. ' union select table_name from information_schema.tables where table_schema='[target_db_name]' --+
  2. //这里的[target_db_name]是你要入侵的数据库名字,同样使用--+使后面的语句变成注释,不影响你的“入侵”
复制代码
步骤5:获取表中的字段名
确定表名后,可以进一步获取表中各字段的名称。
  1. ' union select column_name from information_schema.columns where table_name='[target_table_name]' --+
  2. //[target_table_name]是实际的表名,你想康康那一列就康哪一列(。ì _ í。)
复制代码
步骤6:下载数据
最后一步是实验获取敏感数据,如用户名和密码
  1. ' union select user, password from [target_table_name] --+
  2. //裤衩子都给他看光
复制代码

实验三:登陆界面的需求分析

如果是前面的实验是在讲“攻”,那这个实验就是在说“防”了,怎样的计划可以提高软件的安全性
首先登陆页面是必不可少的,由此也就延伸出了本实验所讨论的内容。
邮箱注册登录方式

手机号注册登录方式

传统账号密码登录

根据实验报告中的登录界面需求分析,以下是可能存在的一些软件安全毛病:
1. **注入毛病**:
   - 如果输入未经适当过滤,攻击者可能会利用SQL注入或命令行注入攻击来利用数据库查询或实行恶意命令。
2. **跨站脚本攻击(XSS)**:
   - 如果用户输入数据(如用户名或密码)未经适当处理处罚就体现在网页上,可能会引起存储型或反射型XSS攻击。
3. **暴力破解**:
   - 如果系统没有有效的防暴力破解步调,如登录实验次数限制或验证码,攻击者可能会实验无穷次登录来推测密码。
4. **密码安全问题**:
   - 如果密码计谋不够强,允许用户设置简单密码或不要求密码复杂度,密码轻易被破解。
5. **信息泄漏**:
   - 如果用户信息(如密码、身份证号等)未经加密存储或传输,可能会在传输过程中或存储时被窃取。
为了保障实现注册和登录功能时对用户信息及相关数据的保护,在计划时必须实现以下功能点。(4-6点)
2. 防暴力破解计谋:系统必须设置防暴力破解计谋,比方限制用户登录次数、增加验证码等,以防止恶意攻击者通过暴力破解获取用户信息。
3. 用户信息传输加密:用户在注册或登录时,输入的信息必须经过加密处理处罚后再传输到服务器,以防止信息被窃取或篡改。
4. 用户信息加密存储:用户的敏感信息(如密码、身份证号等)必须经过加密处理处罚后再存储到数据库中,以防止数据泄漏和恶意攻击。

实验四:编写正则表达式

正则表达式(RegEx)是一种文本模式,包罗普通字符和特殊元字符,用于匹配制定规则的字符串。编译器中的词法分析器会使用正则表达式去匹配代码中的关键字,网站上的注册表单会用他去判定密码的强弱,在爬虫中同样有效。
正则表达式实例:
现在来介绍正则表达式的规则:
  1. 1.used?  //?是一个特殊字符,表示?前的字符可有可无,例如本例可以匹配到used,也可以匹配到use
  2. 2.ab*c  //*代表前面的字符可以出现0次获多次,例如本例可以匹配到ac,abc,abbbbbc
  3. 3.ab+c  //+会匹配出现一次及以上的字符,例如abc,abbbc
  4. 4.ab{6}c  //比+更精确,能够匹配出现了六次的字符,abbbbbbc,这种写法还可以是{2,6}2到6次之间,{2,}两次以上等
  5. 5.a(cat|dog)  //或限定符,匹配到a cat,a dog
  6. 6.[abc]+  //方括号要求匹配的字符只能取自于他们,比如abcc,cacb,bbc
  7. 7.[a-z] //所以小写字符
  8.   [a-zA-Z] //所有英文字符
  9.   [a-zA-Z0-9]  //所有英文字符和数字
  10. 8.[^0-9]  //^代表所有非括号内的字符,本例中表示所有非数字字符,包括换行符
复制代码
同时,正则表达式还规定了很多元字符,这里不多赘述了,想看的自己下去相识吧。
来看两个简单实例:
1.颜色值匹配

2.IPv4地址匹配


   好了,至此,四篇实验全部讲完,我们来进入实战。
  
实战1:给你一段代码问你代码相关的东西(相关实验2,3)

  1. // 假设的PHP代码,用于从数据库检索用户信息
  2. if (isset($_POST['username'])) {
  3.     $username = $_POST['username'];
  4.     // 构造SQL查询
  5.     $query = "SELECT * FROM users WHERE username = '$username' AND password = '" . md5($_POST['password']) . "'";
  6.     // 执行查询
  7.     $result = mysqli_query($conn, $query);
  8.     // ...
  9. }
复制代码
问可能受到的攻击和防范步调:
可能的攻击方法:
制止攻击的根本对策
   此类题实在就是观察你对这门课教过的各种攻击记忆有多少,有哪些种类的攻击,是通过什么缘故原由导致的。(对于此,我个人认为实在不算是分析,而更像是简答,把你记着的攻击全往上怼就行了。考试卷面有限,不会把完备代码都给你写出来的,既然有省略,我们就可以钻空子,最常见的就是SQL注入攻击,再其次就是XSS,你能说他省略的地方一定没有效户输入回显的方法吗?既然有,那就很有可能存在XSS毛病。诸如此类,以是这题更看重的是你心态稳不稳,看不懂也别慌)
  对于易受SQL注入攻击的Web应用程序,可能的攻击方法包罗但不限于以下几种:
1. **经典SQL注入**:
   - 攻击者通过输入特殊的SQL代码片段,实验改变原有查询逻辑,获取、篡改或删除数据库中的敏感数据。(看到输入的内容直接作为查询语句的,不用想,SQL注入)
  1. // 直接将用户输入拼接到SQL查询中,易受SQL注入攻击
  2. if (isset($_POST['username']) && isset($_POST['password'])) {
  3.     $username = $_POST['username'];
  4.     $password = $_POST['password'];
  5.     $query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
  6.     $result = mysqli_query($conn, $query);
  7.     // ...
  8. }
复制代码
2. **XSS跨站脚本攻击**:
   - 用户输入直接输出到页面,没有进行HTML编码,易受XSS攻击。(看到有输入回显相关的,OK,XSS)
  1. // 假设的PHP代码,用于显示用户输入的评论
  2. echo "Welcome, " . $_GET['name'] . "!";
复制代码
3. **不安全的文件上传**:
   - 直接使用用户上传的文件名,可能包罗相对路径或特殊字符,易导致文件权限提升或敏感文件覆盖。(看到文件看到file了,可能会有不安全的文件上传)
  1. // 假设的PHP代码,用于处理文件上传
  2. if ($_FILES['file']['error'] == 0 && $_FILES['file']['size'] <= 1024 * 1024 * 5) {
  3.     if (move_uploaded_file($_FILES['file']['tmp_name'], 'uploads/' . $_FILES['file']['name'])) {
  4.         echo "File uploaded successfully.";
  5.     } else {
  6.         echo "File upload failed.";
  7.     }
  8. }
复制代码
4. **不安全的直接对象引用**:
   - 用户ID直接用于查询,易受不安全的直接对象引用攻击。(和SQL注入差不多,要查那个直接就查了,可能会出现不安全的直接对象引用)
  1. // 假设的PHP代码,用于显示用户配置文件
  2. $user_id = $_GET['user_id'];
  3. $query = "SELECT * FROM user_profiles WHERE id = $user_id";
  4. $result = mysqli_query($conn, $query);
  5. // ...
复制代码
5. **文件上传毛病利用**:
    - 如果SQL注入毛病存在于文件上传功能中,攻击者可能会上传恶意文件来实行代码。
6. **远程命令实行**:
    - 在某些情况下,SQL注入可能被用来实行操纵系统命令,导致远程命令实行。
### 防御步调:
- **使用预处理处罚语句和参数化查询**:制止直接将用户输入拼接到SQL语句中。
- **输入验证和过滤**:确保所有输入都符合预期格式,过滤掉潜在的危险字符。
- **最小权限原则**:数据库账号应具有实行必要操纵的最小权限。
- **错误处理处罚**:不要向用户展示详细的数据库错误信息。
- **定期安全审计**:定期对应用程序进行安全审计,检查潜在的安全问题。
通过这些步调,可以显著提高应用程序的安全性,减少被SQL注入攻击的风险。
   好了,这类题就是如许,其中SQL和XSS比较紧张,剩下几个恣意吧,大概写点就有几分呢,别放弃 (。ì _ í。)
  
实战2:给你一个登陆页面回答相关问题(关联实验3)

   既然实验做了登陆页面的分析,那大题应该会考一个登陆页面相关的。实在本质来说跟上一道差不多,也是记着了可能有哪些毛病,看图说话罢了。
  首先根据实验,来看三种登陆方式可能出现的问题,这是最有可能得分点:
电子邮件登录、手机号码登录和账号密码登录是常见的登录方式,每种方式都有其潜在的安全问题:
### 电子邮件登录可能存在的问题:
1. **电子邮件被截获**:
   - 使用电子邮件进行通信时,如果未加密,邮件内容可能在传输过程中被截获。
2. **电子邮箱被非法登录控制**:
   - 邮箱账户若被攻破,攻击者可能获取用户的登录令牌或其他敏感信息。
3. **电子邮件系统被攻击控制**:
   - 电子邮件服务提供商若存在安全毛病,可能被攻击者控制,影响所有效户。
4. **针对特定用户的电子邮件社会工程学攻击**:
   - 通过发送敲诈性邮件,诱导用户泄漏密码或其他敏感信息。
5. **Cookie和Session的安全性问题**:
   - 如果Session ID存放在Cookie中,而且没有适当的安全步调,可能遭受CSRF攻击。
### 手机号码登录可能存在的问题:
1. **依赖手机网络**:
   - 如果用户在没有网络的情况下,可能无法接收验证码,影响登录。
2. **隐私泄漏风险**:
   - 使用手机号码作为登录凭据可能会增加个人信息泄漏的风险。
3. **短信服务被攻击**:
   - 短信服务若被攻击者截获或篡改,验证码可能被拦截。
4. **手机装备安全**:
   - 手机若被植入恶意软件,可能影响登录安全。
### 账号密码登录可能存在的问题:
1. **密码强度不足**:
   - 用户可能使用弱密码,轻易被推测或通过暴力破解手段破解。
2. **密码存储安全**:
   - 如果服务器端未对密码进行加密或使用不安全的哈希算法,密码可能被泄漏。
3. **键盘记录器攻击**:
   - 恶意软件可能记任命户的键盘输入,从而获取账号密码。
4. **暴力破解攻击**:
   - 攻击者可能实验多次登录,推测密码。
5. **交际工程攻击**:
   - 通过诱导用户提供密码或其他敏感信息。
以是,第一步先看题干,如果是账密登陆,就可以答密码强度、密码存储等问题;邮箱就是截获、非法控制这种;手机也是一个道理。
其次,另有可能出现:
通用的安全步调:

通过实施这些安全步调,可以显著提高登录系统的安全性,减少被攻击的风险。

实战3:缓冲区溢出,栈相关(相关实验1)

   实验一能考的我认为只有溢出一个点了,可能还混淆着一些密码安全相关的东西。话不多说,直接看题。
  1. #include <stdio.h>
  2. #include <string.h>
  3. int main() {
  4.     char password[20] = "mysecurepassword";
  5.     char input[20];
  6.     printf("Enter your password: ");
  7.    
  8.     // 危险:使用gets()可能导致缓冲区溢出
  9.     gets(input); // 危险函数,已被废弃
  10.     if (strcmp(input, password) == 0) {
  11.         printf("Access granted.\n");
  12.     } else {
  13.         printf("Access denied.\n");
  14.     }
  15.    
  16.     return 0;
  17. }
复制代码
此C语言程序片段,用于从用户那里获取输入并检查是否与预设密码匹配:
可能出现的问题:
解决对策:
   这种类型的标题通常观察对C语言编程中常见安全毛病的理解和防御计谋,包罗但不限于缓冲区溢出、不安全的输入处理处罚、密码安全、内存安全等凸^-^凸
  
实战4:正则表达式编写

   这个实在有点难,不是死记硬背能解决的了,可能上考场后一个点没有想到就答不出尺度答案,不外做不到和尺度答案一摸一样,大差不差照旧可以的。限定小写字母会写吧,限定命字会写吧,限定出现反复会写吧,把会写的写写就行
  背景: 在开发一个用户注册功能时,必要验证用户输入的邮箱地址是否有效。为了确保用户填写的邮箱符合尺度的格式,你必要编写一个正则表达式来验证邮箱地址。
要求: 编写一个正则表达式,满足以下条件:
示例:

任务: 请根据以上要求编写一个正则表达式,并分析每个部分的作用。
答案:
  1. ^[a-zA-Z0-9._-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$
复制代码
  ^:匹配字符串的开始。
  [a-zA-Z0-9._-]+:匹配一个或多个字母、数字、下划线、点或短横线。
  @:字面意义上的@符号。
  [a-zA-Z0-9.-]+:匹配一个或多个字母、数字、点或短横线(域名部分)。
  \.:字面意义上的点,由于点在正则表达式中是一个特殊字符,以是必要使用反斜杠进行转义。
  [a-zA-Z]{2,}:匹配两个或更多的字母(顶级域名)。
  $:匹配字符串的竣事。
  
上一届似乎还考了“谈谈你这学期做过的实验和心得体会这种题”,大有“你这学期的任课老师叫什么名字”的感觉,四个实验咱们之前都说过,这里不再赘述。选择题应该是把上一篇总结的知识点挖空变成选择,难度不大,看过上一篇的能答个七七八八。至此,本科考试知识点全部讲解完毕。
之后如果想到可以或许增补的会继承发,可以订阅一下专栏。

稳住心态,不要慌,结课考试而已,总有人要过,为什么不能是认真准备了的各位呢?把前面的简答认真看了,胜利一定

英国优秀法弟子祝您考试顺利


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。




欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/) Powered by Discuz! X3.4