【太原理工大学】软件系统安全—分析题

07-17 1174阅读

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参数如下:

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' order by 1 --+
//如果页面正常显示,增加数字直到出现错误,比如:
1' order by 3 --+  //如果页面出错,说明查询语句涉及3个字段
// 在语法上--会使之后的语句变成注释,由此破坏查询命令

步骤3:获取当前数据库名

利用SQL注入点,尝试获取当前数据库的名称

' union select database() --+

步骤4:获取数据库中的表名

在确认了数据库名后,下一步是获取数据库中包含的表名

' union select table_name from information_schema.tables where table_schema='[target_db_name]' --+
//这里的[target_db_name]是你要入侵的数据库名字,同样使用--+使后面的语句变成注释,不影响你的“入侵”

步骤5:获取表中的字段名

确定表名后,可以进一步获取表中各字段的名称。

' union select column_name from information_schema.columns where table_name='[target_table_name]' --+
//[target_table_name]是实际的表名,你想康康那一列就康哪一列(。ì _ í。)

步骤6:下载数据

最后一步是尝试获取敏感数据,如用户名和密码

' union select user, password from [target_table_name] --+
//裤衩子都给他看光

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

如果是前面的实验是在讲“攻”,那这个实验就是在说“防”了,怎样的设计可以提高软件的安全性

首先登陆页面是必不可少的,由此也就延伸出了本实验所讨论的内容。

邮箱注册登录方式

  • 优点:免费、方便、安全、多功能。
  • 缺点:垃圾邮件、邮箱泄露风险、容量限制。
  • 验证方式:用户名和密码、邮箱验证码、手机短信验证、安全问题验证。

    手机号注册登录方式

    • 优点:方便快捷、安全性高、信息真实性高。
    • 缺点:依赖手机网络、隐私泄露风险、无法记住账号。
    • 验证方式:短信验证码、语音验证码、手机号验证链接。

      传统账号密码登录

      • 优点:安全性高、稳定性好、用户习惯。
      • 缺点:操作繁琐、容易忘记密码、安全性不足。

        根据实验报告中的登录界面需求分析,以下是可能存在的一些软件安全漏洞:

        1. **注入漏洞**:

           - 如果输入未经适当过滤,攻击者可能会利用SQL注入或命令行注入攻击来操纵数据库查询或执行恶意命令。

        2. **跨站脚本攻击(XSS)**:

           - 如果用户输入数据(如用户名或密码)未经适当处理就显示在网页上,可能会引起存储型或反射型XSS攻击。

        3. **暴力破解**:

           - 如果系统没有有效的防暴力破解措施,如登录尝试次数限制或验证码,攻击者可能会尝试无限次登录来猜测密码。

        4. **密码安全问题**:

           - 如果密码策略不够强,允许用户设置简单密码或不要求密码复杂度,密码容易被破解。

        5. **信息泄露**:

           - 如果用户信息(如密码、身份证号等)未经加密存储或传输,可能会在传输过程中或存储时被窃取。

        为了保障实现注册和登录功能时对用户信息及相关数据的保护,在设计时必须实现以下功能点。(4-6点)

        1. 安全漏洞修复:系统必须及时修复已知的安全漏洞,以保障用户信息的安全。同时,系统必须定期进行安全检查和漏洞扫描,及时发现并修复潜在的安全问题。

        2. 防暴力破解策略:系统必须设置防暴力破解策略,例如限制用户登录次数、增加验证码等,以防止恶意攻击者通过暴力破解获取用户信息。

        3. 用户信息传输加密:用户在注册或登录时,输入的信息必须经过加密处理后再传输到服务器,以防止信息被窃取或篡改。

        4. 用户信息加密存储:用户的敏感信息(如密码、身份证号等)必须经过加密处理后再存储到数据库中,以防止数据泄露和恶意攻击。

        实验四:编写正则表达式

        正则表达式(RegEx)是一种文本模式,包括普通字符和特殊元字符,用于匹配制定规则的字符串。编译器中的词法分析器会使用正则表达式去匹配代码中的关键字,网站上的注册表单会用他去判断密码的强弱,在爬虫中同样有用。

        正则表达式实例:

        1. 用户名验证:必须字母开头,6~16位,包含字母、数字和其他字符。
        2. 密码验证:8-16字符,必须包含数字、字母和其他字符。
        3. 强密码验证:16-24字符,不能有连续数字,包含数字、字母和其他字符。
        4. 身份证号验证:18位,最后一位可以是数字或X。
        5. E-mail地址验证:包含用户名和域名,支持字母、数字、下划线、短横线和点号。
        6. 电话号码验证:11位,开头必须是1,全数字。
        7. IP地址验证:四组数字,每组0~255,用点分隔。
        8. 中文字符验证:字符串必须全是汉字。
        9. 域名验证:字母或数字开头,可含中划线,后缀至少两个字符。
        10. 数字验证:匹配整数或小数。

        现在来介绍正则表达式的规则:

        1.used?  //?是一个特殊字符,表示?前的字符可有可无,例如本例可以匹配到used,也可以匹配到use
        2.ab*c  //*代表前面的字符可以出现0次获多次,例如本例可以匹配到ac,abc,abbbbbc
        3.ab+c  //+会匹配出现一次及以上的字符,例如abc,abbbc
        4.ab{6}c  //比+更精确,能够匹配出现了六次的字符,abbbbbbc,这种写法还可以是{2,6}2到6次之间,{2,}两次以上等
        5.a(cat|dog)  //或限定符,匹配到a cat,a dog
        6.[abc]+  //方括号要求匹配的字符只能取自于他们,比如abcc,cacb,bbc
        7.[a-z] //所以小写字符
          [a-zA-Z] //所有英文字符
          [a-zA-Z0-9]  //所有英文字符和数字
        8.[^0-9]  //^代表所有非括号内的字符,本例中表示所有非数字字符,包括换行符
        

        同时,正则表达式还规定了很多元字符,这里不多赘述了,想看的自己下去了解吧。

        来看两个简单实例:

        1.颜色值匹配

        【太原理工大学】软件系统安全—分析题

        2.IPv4地址匹配

        【太原理工大学】软件系统安全—分析题

        【太原理工大学】软件系统安全—分析题

        好了,至此,四篇实验全部讲完,我们来进入实战。

        实战1:给你一段代码问你代码相关的东西(相关实验2,3)
        // 假设的PHP代码,用于从数据库检索用户信息
        if (isset($_POST['username'])) {
            $username = $_POST['username'];
            // 构造SQL查询
            $query = "SELECT * FROM users WHERE username = '$username' AND password = '" . md5($_POST['password']) . "'";
            // 执行查询
            $result = mysqli_query($conn, $query);
            // ...
        }

        问可能受到的攻击和防范措施:

        可能的攻击方法:

        1. SQL注入:

          • 攻击者可以通过在username输入框中输入如' OR 1=1 --,绕过登录验证,因为SQL查询没有进行适当的转义或使用参数化查询。
        2. 密码绕过:

          • 如果攻击者发现密码字段的MD5值总是相同,他们可能会尝试使用这个值来绕过密码验证。

        避免攻击的基本对策:

        1. 使用预处理语句:

          • 使用预处理语句和参数化查询,确保用户输入作为参数处理,而不是作为SQL代码的一部分。
        2. 输入过滤和验证:

          • 对所有输入进行严格的过滤和验证,确保它们不包含潜在的恶意代码。
        3. 密码存储安全:

          • 不要使用MD5存储密码,因为它不安全且容易受到彩虹表攻击。使用更强的哈希函数,如bcrypt。

        此类题其实就是考察你对这门课教过的各种攻击记忆有多少,有哪些种类的攻击,是通过什么原因导致的。(对于此,我个人认为其实不算是分析,而更像是简答,把你记住的攻击全往上怼就行了。考试卷面有限,不会把完整代码都给你写出来的,既然有省略,我们就可以钻空子,最常见的就是SQL注入攻击,再其次就是XSS,你能说他省略的地方一定没有用户输入回显的方法吗?既然有,那就很有可能存在XSS漏洞。诸如此类,所以这题更看重的是你心态稳不稳,看不懂也别慌)

        对于易受SQL注入攻击的Web应用程序,可能的攻击方法包括但不限于以下几种:

        1. **经典SQL注入**:

           - 攻击者通过输入特殊的SQL代码片段,尝试改变原有查询逻辑,获取、篡改或删除数据库中的敏感数据。(看到输入的内容直接作为查询语句的,不用想,SQL注入)

        // 直接将用户输入拼接到SQL查询中,易受SQL注入攻击
        if (isset($_POST['username']) && isset($_POST['password'])) {
            $username = $_POST['username'];
            $password = $_POST['password'];
            $query = "SELECT * FROM users WHERE username = '$username' AND password = '$password'";
            $result = mysqli_query($conn, $query);
            // ...
        }

        2. **XSS跨站脚本攻击**:

           - 用户输入直接输出到页面,没有进行HTML编码,易受XSS攻击。(看到有输入回显相关的,OK,XSS)

        // 假设的PHP代码,用于显示用户输入的评论
        echo "Welcome, " . $_GET['name'] . "!";

        3. **不安全的文件上传**:

           - 直接使用用户上传的文件名,可能包含相对路径或特殊字符,易导致文件权限提升或敏感文件覆盖。(看到文件看到file了,可能会有不安全的文件上传)

        // 假设的PHP代码,用于处理文件上传
        if ($_FILES['file']['error'] == 0 && $_FILES['file']['size'] 
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]