2017-2018-2 20179305《网络攻防技术》 第十一周做业

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

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

原理

缓冲区溢出(Buffer Overflow)是计算机安全领域内既经典而又古老的话题。随着计算机系统安全性的增强,传统的缓冲区溢出攻击方式可能变得再也不奏效,相应的介绍缓冲区溢出原理的资料也变得“大众化”起来。其中看雪的《0day安全:软件漏洞分析技术》一书将缓冲区溢出攻击的原理阐述得简洁明了。本文参考该书对缓冲区溢出原理的讲解,并结合实际的代码实例进行验证。不过即使如此,完成一个简单的溢出代码也须要解决不少书中没法涉及的问题,尤为是面对较新的具备安全特性的编译器——好比MS的Visual Studio2010。
在计算机内部,输入数据一般被存放在一个临时空间内,这个临时存放的空间就被称为缓冲区,缓冲区的长度事先已经被程序或者操做系统定义好了。向缓冲区内填充数据,若是数据的长度很长,超过了缓冲区自己的容量,那么数据就会溢出存储空间,而这些溢出的数据还会覆盖在合法的数据上,这就是缓冲区和缓冲区溢出的道理。mysql

oracle数据库

Oracle数据库系统是目前世界上应用最普遍的数据库之一,在数据库市场上占有主要份额。鉴于Oracle数据库系统在实际应用中举足轻重的地位,其安全问题的研究就显得尤其重要。缓冲区溢出是一种在各类操做系统应用软件中普遍存在且十分危险的漏洞,利用缓冲区溢出漏洞攻击能够致使程序运行失败,甚至系统崩溃等严重后果,它表明了一类极其严重并且常见的安全威胁。Oracle数据库系统中出现的缓冲区溢出漏洞,给计算机网络带来了严重的危害。如何有效地消除基于缓冲区溢出漏洞的攻击,就成为你们关注的一个焦点。基于缓冲区溢出漏洞的攻击,通常采起以下步骤:首先编写相关程序使缓冲区发生溢出,而后寻找溢出点,最后在溢出点注入恶意代码。其中,寻找溢出点、编写恶意代码是完成攻击的基础,而跳转到溢出点注入恶意代码则是攻击的重难点。程序员

Oracle数据库产品具备如下优良特性

兼容性:Oracle产品采用标准SQL,并通过美国国家标准技术所(NIST)测试。与IBM SQL/DS、DB二、INGRES、IDMS/R等兼容。
可移植性:Oracle的产品可运行于很宽范围的硬件与操做系统平台上。能够安装在70种以上不一样的大、中、小型机上;可在VMS、DOS、UNIX、Windows等多种操做系统下工做。
可联结性:Oracle能与多种通信网络相连,支持各类协议(TCP/IP、DECnet、LU6.2等)。
高生产率:Oracle产品提供了多种开发工具,能极大地方便用户进行进一步的开发。
开放性:Oracle良好的兼容性、可移植性、可链接性和高生产率使Oracle RDBMS具备良好的开放性。sql

mysql数据库

MySQL是一款开放源代码关系型数据库系统。
MySQL包含的mysql_real_connect()函数不充分检查用户提供的参数值,本地或远程攻击者能够利用这个漏洞进行缓冲区溢出攻击,可能用来破坏数据库或执行任意指令。
攻击者能够利用SQL注入攻击,或者可上传恶意脚本到服务器上,经过传递超长的字符串做为mysql_real_connect()函数参数,可触发溢出,精心构建提交数据可能以数据库进程权限在系统上执行任意指令。shell

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

SQL 注入原理

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

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 '%关键字%'。编程

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

防范方法

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

  • 强制写正确的代码的方法
    编写正确的代码是一件很是有意义但耗时的工做,特别像编写C语言那种具备容易出错倾向的程序(如:字符串的零结尾),这种风格是因为追求性能而忽视正确性的传统引发的。尽管花了很长的时间使得人们知道了如何编写安全的程序,具备安全漏洞的程序依旧出现。所以人们开发了一些工具和技术来帮助经验不足的程序员编写安全正确的程序。虽然这些工具帮助程序员开发更安全的程序,可是因为C语言的特色,这些工具不可能找出全部的缓冲区溢出漏洞。因此,侦错技术只能用来减小缓冲区溢出的可能,并不能彻底地消除它的存在。除非程序员能保证他的程序万无一失,不然仍是要用到如下部分的内容来保证程序的可靠性能。
  • 经过操做系统使得缓冲区不可执行,从而阻止攻击者殖入攻击代码
    这种方法有效地阻止了不少缓冲区溢出的攻击,可是攻击者并不必定要殖入攻击代码来实现缓冲区溢出的攻击,因此这种方法仍是存在不少弱点的。
  • 利用编译器的边界检查来实现缓冲区的保护
    这个方法使得缓冲区溢出不可能出现,从而彻底消除了缓冲区溢出的威胁,可是相对而言代价比较大。
  • 在程序指针失效前进行完整性检查
    这样虽然这种方法不能使得全部的缓冲区溢出失效,但它的确确阻止了绝大多数的缓冲区溢出攻击,而可以逃脱这种方法保护的缓冲区溢出也很难实现。

最普通的缓冲区溢出形式是攻击活动纪录而后在堆栈中殖入代码。这种类型的攻击在1996年中有不少纪录。而非执行堆栈和堆栈保护的方法均可以有效防卫这种攻击。非执行堆栈能够防卫全部把代码殖入堆栈的攻击方法,堆栈保护能够防卫全部改变活动纪录的方法。这两种方法相互兼容,能够同时防卫多种可能的攻击。
剩下的攻击基本上能够用指针保护的方法来防卫,可是在某些特殊的场合须要用手工来实现指针保护。全自动的指针保护须要对每一个变量加入附加字节,这样使得指针边界检查在某些状况下具备优点。
最为有趣的是,缓冲区溢出漏洞--Morris蠕虫使用了现今全部方法都没法有效防卫的方法,可是因为过于复杂的缘故却不多有人用到。服务器

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

  • 基于输入字符串的检测方法
  • 基于保护堆栈中的返回地址的检测方法
  • 基于监视系统调用的检测方法。cookie

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

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

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

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

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

  • 经过操做系统使得缓冲区不可执行,从而阻止攻击者植入攻击代码;
  • 强制写正确的代码的方法;
  • 利用编译器的边界检查来实现缓冲区的保护,使得缓冲区溢出不可能出现,从而彻底消除了缓冲区溢出的威胁。

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

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

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

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和盲注两种注入模式,获取数据库权限。 使用时,用户首先使用该工具生成一个配置文件。在配置文件中,设置注入路径以及注入的各项参数,而后再加载该文件,实施渗透测试。

相关文章
相关标签/搜索