一、研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究
1.1 原理
在计算机内部,输入数据通常被存放在一个临时空间内,这个临时存放的空间就被称为缓冲区,缓冲区的长度事先已经被程序或者操作系统定义好了。向缓冲区内填充数据,如果数据的长度很长,超过了缓冲区本身的容量,那么数据就会溢出存储空间,而这些溢出的数据还会覆盖在合法的数据上,这就是缓冲区和缓冲区溢出的道理。
1.2 对抗缓冲区溢出攻击
1.2.1 栈随机化
为了在系统中插入攻击代码,攻击者不但要插入代码,还要插入指向这段代码的指针,这个指针也是攻击字符串的一部分。产生这个指针需要知道这个字符串放置的栈地址。在过去,程序的栈地址非常容易预测,在不同的机器之间,栈的位置是相当固定的。
栈随机化的思想使得栈的位置在程序每次运行时都有变化。因此,即使许多机器都运行相同的代码。它们的栈地址都是不同的。
实现的方式是:程序开始时,在栈上分配一段0--n字节之间的随机大小空间。程序不使用这段空间,但是它会导致程序每次执行时后续的栈位置发生了变化。
在Linux系统中,栈随机化已经变成了标准行为。(在linux上每次运行相同的程序,其同一局部变量的地址都不相同)
1.2.2 栈破坏检测
在C语言中,没有可靠的方法来防止对数组的越界写,但是,我们能够在发生了越界写的时候,在没有造成任何有害结果之前,尝试检测到它。
最近的GCC版本在产生的代码中加入了一种栈保护者机制,用来检测缓冲区越界,其思想是在栈中任何局部缓冲区与栈状态之间存储一个特殊的金丝雀值。这个金丝雀值是在程序每次运行时随机产生的,因此,攻击者没有简单的办法知道它是什么。
在恢复寄存器状态和从函数返回之前,程序检查这个金丝雀值是否被该函数的某个操作或者函数调用的某个操作改变了。如果是,那么程序异常终止。
1.2.3、限制可执行代码区域
限制那些能够存放可执行代码的存储器区域。在典型的程序中,只有保存编译器产生的代码的那部分存储器才需要是可执行的,其他部分可以被限制为只允许读和写。
现在的64位处理器的内存保护引入了”NX”(不执行)位。有了这个特性,栈可以被标记为可读和可写,但是不可执行,检查页是否可执行由硬件来完成,效率上没有损失。
1.3 数据库
MySQL是一款开放源代码关系型数据库系统。
MySQL包含的mysql_real_connect()函数不充分检查用户提供的参数值,本地或远程攻击者可以利用这个漏洞进行缓冲区溢出攻击,可能用来破坏数据库或执行任意指令。
攻击者可以利用SQL注入攻击,或者可上传恶意脚本到服务器上,通过传递超长的字符串作为mysql_real_connect()函数参数,可触发溢出,精心构建提交数据可能以数据库进程权限在系统上执行任意指令。
二、针对不同数据类型,研究SQL注入点的发现与注入技术
2.1 sql注入
SQL注入攻击通过构建特殊的输入作为参数传入Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作。
SQL注入即是指web应用程序对用户输入数据的合法性没有判断,攻击者可以在web应用程序中事先定义好的查询语句的结尾上添加额外的SQL语句,以此来实现欺骗数据库服务器执行非授权的任意查询,从而进一步得到相应的数据信息。
- SQL注入威胁表现形式可以体现为以下几点:
绕过认证,获得非法权限
猜解后台数据库全部的信息
注入可以借助数据库的存储过程进行提权等操作
- SQL注入攻击的典型手段:
判断应用程序是否存在注入漏洞
收集信息、并判断数据库类型
根据注入参数类型,重构SQL语句的原貌
猜解表名、字段名
获取账户信息、攻击web或为下一步攻击做准备
三、研究缓冲区溢出的防范方法,至少针对两种编程语言进行差异化研究
根据缓冲区溢出攻击的步骤,可将常用的缓冲区溢出攻击检测技术分为以下3种类型:
基于输入字符串的检测方法
基于保护堆栈中的返回地址的检测方法
基于监视系统调用的检测方法
3.1 基于输入字符串的检测方法
对输入的字符串进行检测,确定其为溢出攻击字符串时采取阻拦措施,使攻击者无法注入攻击代码。一般有以下3 种方法构建溢出攻击字符串
溢出攻击字符串适用于缓冲区大于ShellCode 长度的情况
溢出攻击字符串一般用于缓冲区小于ShellCode 长度的情况
方法是将ShellCode 放在环境变量里,是目前较为常用的方法
3.2 基于保护堆栈中返回地址的检测方法
缓冲区溢出攻击最关键的步骤是要通过修改函数返回地址来改变程序的流程,因此,在函数调用返回前,通过检查返回地址是否被修改可以判断是否有缓冲区溢出攻击发生。
缓冲区溢出攻击占了远程网络攻击的绝大多数,这种攻击可以使得一个匿名的Internet用户有机会获得一台主机的部分或全部的控制权。如果能有效地消除缓冲区溢出的漏洞,则很大一部分的安全威胁可以得到缓解。 目前有三种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响:
(1)通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码
(2)强制写正确的代码的方法
(3)利用编译器的边界检查来实现缓冲区的保护,使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁
四、 至少使用两种数据库注入攻击工具
4.1 tnscmd10g
允许我们向Oracle数据库中注入命令
4.2 Sqlsus
sqlsus是一个开放源代码的MySQL注入和接管工具,sqlsus使用perl编写,基于命令行界面。sqlsus可以获取数据库结构,注入你自己的SQL语句,从服务器下载文件,爬行web站点可写目录,上传和控制后门,克隆数据库等等。最好用的两点就是注射获取数据速度非常快,另一个最大的特点就是自动搜索可写目录。
生成配置文件
编辑配置文件
修改 our $url_start = "":写入地址
启动并且测试`sqlsus test.conf`
获取数据库数据
查看全部数据库名字
sqlsus > get database