20189224 《网络攻防实践》/《网络攻击与防范》第十周学习总结
冯·诺依曼体系结构和图灵机
图灵机是一个计算机的理论模型,本质上是状态机;冯诺依曼体系是图灵机的实现,包括运算、控制、存储、输入、输出五个部分。诺依曼体系相对之前的计算机最大的创新在于程序和数据的存储,以此实现机器内部编程。
图灵机的纸带应对应诺依曼计算机体系中的存储,读写头对应输入和输出,规则(读了一个符号后下一步做什么)对应运算,纸带怎么移动对应控制。
图灵机
图灵机(Turing Machine)是图灵在1936年发表的 “On Computable Numbers, with an Application to the Entscheidungsproblem”(《论可计算数及其在判定性问题上的应用》)中提出的数学模型。并且在文章中被证明了任何可计算问题都可在图灵机上解决。
图灵机的结构包括以下几个部分:
一条无限长的纸带(tape),纸带被分成一个个相邻的格子(square),每个格子都可以写上至多一个字符(symbol)。
一个字符表(alphabet),即字符的集合,它包含纸带上可能出现的所有字符。其中包含一个特殊的空白字符(blank),意思是此格子没有任何字符。
一个读写头(head),可理解为指向其中一个格子的指针。它可以读取/擦除/写入当前格子的内容,此外也可以每次向左/右移动一个格子。
一个状态寄存器(state register),它追踪着每一步运算过程中,整个机器所处的状态(运行/终止)。当这个状态从运行变为终止,则运算结束,机器停机并交回控制权。如果你了解有限状态机,它便对应着有限状态机里的状态。
一个有限的指令集(instructions table),它记录着读写头在特定情况下应该执行的行为。可以想象读写头随身有一本操作指南,里面记录着很多条类似于“当你身处编号53的格子并看到其内容为0时,擦除,改写为1,并向右移一格。此外,令下一状态为运行。”这样的命令。其实某种意义上,这个指令集就对应着程序员所写下的程序了。
冯·诺依曼体系结构
冯·诺依曼体系结构主要由五大部件组成
- 存储器用来存放数据和程序
- 运算器主要运行算数运算和逻辑运算,并将中间结果暂存到运算器中
- 控制器主要用来控制和指挥程序和数据的输入运行,以及处理运算结果
- 输入设备用来将人们熟悉的信息形式转换为机器能够识别的信息形式,常见的有键盘,鼠标等
- 输出设备可以将机器运算结果转换为人们熟悉的信息形式,如打印机输出,显示器输出等
冯诺依曼体系结构的指令和数据均采用二进制码表示;指令和数据以同等地位存放于存储器中,均可按地址寻访;指令由操作码和地址码组成,操作码用来表示操作的性质,地址码用来表示操作数所在存储器中的位置;指令在存储器中按顺序存放,通常指令是按顺序执行的,特定条件下,可以根据运算结果或者设定的条件改变执行顺序;机器以运算器为中心,输入输出设备和存储器的数据传送通过运算器。
程序=指令+数据
- 程序装载后, 程序指令放只读区域, 程序数据放在可读写区域。 可以防止程序被篡改。
- 程序指令和数据指令分开, 可以提高CPU对cache的命中率, 集中了精力哈。
- 程序指令可以被多进程共享, 但程序数据在多进程中相互独立。
缓冲区溢出,XSS攻击,SQL注入攻击
SQL注入攻击
SQL攻击(SQL injection),简称注入攻击,是发生于应用程序之数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的SQL指令而运行,因此遭到破坏或是入侵。
原因
在应用程序中若有下列状况,则可能应用程序正暴露在SQL Injection的高风险情况下:
在应用程序中使用字符串联结方式组合SQL指令。
在应用程序链接数据库时使用权限过大的账户(例如很多开发人员都喜欢用sa(内置的最高权限的系统管理员账户)连接Microsoft SQL Server数据库)。
在数据库中开放了不必要但权力过大的功能(例如在Microsoft SQL Server数据库中的xp_cmdshell延伸预存程序或是OLE Automation预存程序等)
太过于信任用户所输入的数据,未限制输入的字元数,以及未对用户输入的数据做潜在指令的检查。
作用原理
SQL命令可查询、插入、更新、删除等,命令的串接。而以分号字元为不同命令的区别。(原本的作用是用于SubQuery或作为查询、插入、更新、删除……等的条件式)
SQL命令对于传入的字符串参数是用单引号字元所包起来。(但连续2个单引号字元,在SQL资料库中,则视为字串中的一个单引号字元)
SQL命令中,可以注入注解(连续2个减号字元 – 后的文字为注解,或“/”与“/”所包起来的文字为注解)
因此,如果在组合SQL的命令字符串时,未针对单引号字元作取代处理的话,将导致该字元变数在填入命令字符串时,被恶意窜改原本的SQL语法的作用。
XSS攻击
xss表示Cross Site Scripting(跨站脚本攻击),它与SQL注入攻击类似,SQL注入攻击中以SQL语句作为用户输入,从而达到查询/修改/删除数据的目的,而在xss攻击中,通过插入恶意脚本,实现对用户游览器的控制。
xss攻击可以分成两种类型:
非持久型攻击
持久型攻击
非持久型xss攻击
顾名思义,非持久型xss攻击是一次性的,仅对当次的页面访问产生影响。非持久型xss攻击要求用户访问一个被攻击者篡改后的链接,用户访问该链接时,被植入的攻击脚本被用户游览器执行,从而达到攻击目的。
持久型xss攻击
持久型xss攻击会把攻击者的数据存储在服务器端,攻击行为将伴随着攻击数据一直存在
缓冲区溢出
缓冲区溢出的攻击大致分为以下几类:
- 栈溢出(stack smashing)
未检查输入缓冲区长度,导致数组越界,覆盖栈中局部变量空间之上的栈桢指针%ebp以及函数返回地址retaddr, 当函数返回执行ret指令时,retaddr从栈中弹出,作为下一条指令的地址赋给%eip寄存器,继而改变原程序的执行流程指向我们的 shellcode. - 堆溢出(malloc/free heapcorruption)
一种是和传统的栈溢出一样, 当输入超出malloc()预先分配的空间大小,就会覆盖掉这段空间之后的一段存储区域,如果该存储区域有一个重要的变量比如euid,那么我就可以用它 来攻击。另一种是典型的double-free堆腐败,在内存回收操作中,合并相邻空闲块重新插入双向链表时会有一个写4字节内存的操作,如果弱点程序由 于编程错误free()一个不存在的块,我们就可以精心伪造这个块,从而覆盖任何我们想要的值:函数的返回地址、库函数的.plt地址等 - 格式化字符窜漏洞(format stringvulnerability)
如果格式窜由用户定制,攻击者就可以任意伪造格式窜,利用*printf()系列函数的特性就可以窥探堆栈空间的内容,超常输入可以引发传统的缓冲区溢出,或是用”%n”覆盖指针、返回地址等。 - 整形变量溢出(integer variableoverflow)
利用整数的范围、符号等问题触发安全漏洞,大多数整形溢出不能直接利用,但如果该整形变量决定内存分配等操作,我们就有可能间接利用该漏洞。 - 其他的攻击手法(others)
只能算是手法,不能算是一种单独的类别。利用ELF文件格式的特性如:覆盖.plt(过程连接表)、.dtor(析构函数指针)、.got(全局偏移表)、return-to-libc(返回库函数)等的方式进行攻击。