20179314-韦依儿

博客园 首页 联系 订阅 管理

1、研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究

缓冲区溢出是指当计算机向缓冲区内填充数据位数时,超过了缓冲区本身的容量,溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区 又被称为"堆栈"。在各个操作进程之间,指令会被临时储存在"堆栈"当中,"堆栈"也会出现缓冲区溢出。

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()函数参数,可触发溢出,精心构建提交数据可能以数据库进程权限在系统上执行任意指令。

2、针对不同数据类型,研究SQL注入点的发现与注入技术

 

2.1、SQL 注入原理

        SQL 注入指黑客利用一些Web应用程序(如:网站、论坛、留言本、文章发布系统等)中某些存在不安全代码或SQL语句不缜密的页面,精心构造SQL语句,把非法的SQL语句指令转译到系统实际SQL语句中并执行它,以获取用户名、口令等敏感信息,从而达到控制主机服务器的攻击方法。 SQL 注入漏洞是发生于应用程序与数据库层的安全漏洞。简而言之,是在输入的字符串之中注入SQL指令,在设计不良的程序当中忽略了检查,那么这些注入进去的指令就会被数据库服务器误认为是正常的 SQL 指令而运行,因此遭到破坏或是入侵。

2.2、SQL 注入分类

按照注入点类型来分类

 数字型注入点

在 Web 端大概是 http://xxx.com/news.php?id=1 这种形式,其注入点 id 类型为数字,所以叫数字型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where id=1

字符型注入点

在 Web 端大概是 http://xxx.com/news.php?name=admin 这种形式,其注入点 name 类型为字符类型,所以叫字符型注入点。这一类的 SQL 语句原型大概为 select * from 表名 where name='admin'。注意多了引号。

搜索型注入点

这是一类特殊的注入类型。这类注入主要是指在进行数据搜索时没过滤搜索参数,一般在链接地址中有“keyword=关键字”,有的不显示在的链接地址里面,而是直接通过搜索框表单提交。 此类注入点提交的 SQL 语句,其原形大致为:select * from 表名 where 字段 like '%关键字%'。

3、研究缓冲区溢出的防范方法,至少针对两种编程语言进行差异化研究

3.1、防范方法

目前有四种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响: 

1、强制写正确的代码的方法 
编写正确的代码是一件非常有意义但耗时的工作,特别像编写C语言那种具有容易出错倾向的程序(如:字符串的零结尾),这种风格是由于追求性能而忽视正确性的传统引起的。尽管花了很长的时间使得人们知道了如何编写安全的程序,具有安全漏洞的程序依旧出现。因此人们开发了一些工具和技术来帮助经验不足的程序员编写安全正确的程序。虽然这些工具帮助程序员开发更安全的程序,但是由于C语言的特点,这些工具不可能找出所有的缓冲区溢出漏洞。所以,侦错技术只能用来减少缓冲区溢出的可能,并不能完全地消除它的存在。除非程序员能保证他的程序万无一失,否则还是要用到以下部分的内容来保证程序的可靠性能。 

2、通过操作系统使得缓冲区不可执行,从而阻止攻击者殖入攻击代码 
这种方法有效地阻止了很多缓冲区溢出的攻击,但是攻击者并不一定要殖入攻击代码来实现缓冲区溢出的攻击,所以这种方法还是存在很多弱点的。 

3、利用编译器的边界检查来实现缓冲区的保护 
这个方法使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁,但是相对而言代价比较大。 

4、在程序指针失效前进行完整性检查 
这样虽然这种方法不能使得所有的缓冲区溢出失效,但它的确确阻止了绝大多数的缓冲区溢出攻击,而能够逃脱这种方法保护的缓冲区溢出也很难实现。 

最普通的缓冲区溢出形式是攻击活动纪录然后在堆栈中殖入代码。这种类型的攻击在1996年中有很多纪录。而非执行堆栈和堆栈保护的方法都可以有效防卫这种攻击。非执行堆栈可以防卫所有把代码殖入堆栈的攻击方法,堆栈保护可以防卫所有改变活动纪录的方法。这两种方法相互兼容,可以同时防卫多种可能的攻击。 
剩下的攻击基本上可以用指针保护的方法来防卫,但是在某些特殊的场合需要用手工来实现指针保护。全自动的指针保护需要对每个变量加入附加字节,这样使得指针边界检查在某些情况下具有优势。 

最为有趣的是,缓冲区溢出漏洞--Morris蠕虫使用了现今所有方法都无法有效防卫的方法,但是由于过于复杂的缘故却很少有人用到。 

在本文中,我们详细描述和分析了缓冲区溢出的原理,并简单介绍了几种防卫方法。由于这种攻击是目前常见的攻击手段,所以进行这个方面的研究工作是有意义和成效的。 

3.2、根据缓冲区溢出攻击的步骤, 可将常用的缓冲区溢出攻击检测技术分为以下 3 种类型:

(1)基于输入字符串的检测方法

(2)基于保护堆栈中的返回地址的检测方法

(3)基于监视系统调用的检测方法。

基于输入字符串的检测方法

       对输入的字符串进行检测,确定其为溢出攻击字符串时采取阻拦措施,使攻击者无法注入攻击代码。一般有以下3 种方法构建溢出攻击字符串
第1种溢出攻击字符串适用于缓冲区大于ShellCode 长度的情况;第2种溢出攻击字符串一般用于缓冲区小于ShellCode 长度的情况;第3种方法是将ShellCode 放在环境变量里,是目前较为常用的方法。

基于保护堆栈中返回地址的检测方法

       缓冲区溢出攻击最关键的步骤是要通过修改函数返回地址来改变程序的流程, 因此, 在函数调用返回前, 通过检查返回地址是否被修改可以判断是否有缓冲区溢出攻击发生。 该检测的实现可以通过在源码中插入一些约束和判断的模块, 然后在编译后的程序运行期间对有关变量和堆栈区域进行监控,检测是否有攻击发生。 StackGuard 和StackShield 就是这一类型的工具,它们都是 gcc 编译器的扩展工具,用于监控调用的函数返回地址是否正常。

 目前有三种基本的方法保护缓冲区免受缓冲区溢出的攻击和影响: 1、通过操作系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码; 2、强制写正确的代码的方法; 3、利用编译器的边界检查来实现缓冲区的保护,使得缓冲区溢出不可能出现,从而完全消除了缓冲区溢出的威胁。

基于监视系统调用的检测方法

       通过检测是否有 ShellCode 运行可以检测是否发生缓冲区溢出攻击。攻击者既希望 ShellCode 利用获得的权限启动一个交互式的 shell 进程来完成尽量多的事情,又希望 ShellCode 尽量短小从而更加隐蔽,所以绝大多数 ShellCode 都会调用系统函数。 由于监视所有系统调用会耗费大量系统资源, 因此只对 ShellCode 常用的系统调用进行监视, 根据某些特征判断受监视的系统调用是否为非法调用就可确定被保护系统是否遭到缓冲区溢出攻击。

4、至少使用两种数据库注入攻击工具

Sqlmap

Sqlmap是一种开源的渗透测试工具,可以自动检测和利用SQL注入漏洞以及接入该数据库的服务器。它拥有非常强大的检测引擎、具有多种特性的渗透测试器、通过数据库指纹提取访问底层文件系统并通过外带连接执行命令.

 sqlmap支持的数据库有

 MySQL, Oracle, PostgreSQL, Microsoft SQL Server, Microsoft Access, IBM DB2, SQLite, Firebird, Sybase和SAP MaxDB

 检测注入

 基本格式

 sqlmap -u “http://www.vuln.cn/post.php?id=1″

 默认使用level1检测全部数据库类型

 sqlmap -u “http://www.vuln.cn/post.php?id=1″ –dbms mysql –level 3

 指定数据库类型为mysql,级别为3(共5级,级别越高,检测越全面)

 跟随302跳转

 当注入页面错误的时候,自动跳转到另一个页面的时候需要跟随302,

当注入错误的时候,先报错再跳转的时候,不需要跟随302。
目的就是:要追踪到错误信息。

 

cookie注入

 当程序有防get注入的时候,可以使用cookie注入

sqlmap -u “http://www.baidu.com/shownews.asp” –cookie “id=11″ –level 2(只有level达到2才会检测cookie)

 

从post数据包中注入

 

可以使用burpsuite或者temperdata等工具来抓取post包

 

sqlmap -r “c:\tools\request.txt” -p “username” –dbms mysql 指定username参数

sqlmap详细命令:

  • –is-dba 当前用户权限(是否为root权限)
  • –dbs 所有数据库
  • –current-db 网站当前数据库
  • –users 所有数据库用户
  • –current-user 当前数据库用户
  • –random-agent 构造随机user-agent
  • –passwords 数据库密码
  • –proxy http://local:8080 –threads 10 (可以自定义线程加速) 代理
  • –time-sec=TIMESEC DBMS响应的延迟时间(默认为5秒)
sqlsus
     sqlsus是使用Perl语言编写的MySQL注入和接管工具。它可以获取数据库结构,实施注入查询,下载服务器的文件,爬取可写目录并写入后门,以及复制数据库文件等功能。它提供Inband和盲注两种注入模式,获取数据库权限。
 使用时,用户首先使用该工具生成一个配置文件。在配置文件中,设置注入路径以及注入的各项参数,然后再加载该文件,实施渗透测试。
posted on 2018-05-20 22:10  20179314-韦依儿  阅读(274)  评论(0编辑  收藏  举报