2017-2018-2 20179225 《网络攻防与实践》 第11周作业

SqL注入攻击实践

实践要求

1. 研究缓冲区溢出的原理,至少针对两种数据库进行差异化研究
2. 针对不同数据类型,研究SQL注入点的发现与注入技术
3. 研究缓冲区溢出的防范方法,至少针对两种编程语言进行差异化研究
4. 至少使用两种数据库注入攻击工具

实践过程

1 缓冲区溢出原理

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

**文本**
    文本区域由程序确定的, 包括代码(指令)和只读数据. 该区域相当于可执行文件的文本段. 这个区域通常被标记为只读, 任何对其写入的操作都会导致段错误
**数据**
    数据区域包含了已初始化和未初始化的数据. 静态变量储存在这个区域中. 数据区域对应可执行文件中的data-bss段. 它的大小可以用系统调用brk(2)来改变.如果bss数据的扩展或用户堆栈把可用内存消耗光了, 进程就会被阻塞住, 等待有了一块更大的内存空间之后再运行. 新内存加入到数据和堆栈段的中间.
**堆栈**
    堆栈是一个在计算机科学中经常使用的抽象数据类型. 堆栈中的物体具有一个特性:最后一个放入堆栈中的物体总是被最先拿出来, 这个特性通常称为后进先处(LIFO)队列.

为什么使用堆栈?

    现代计算机被设计成能够理解人们头脑中的高级语言. 在使用高级语言构造程序时最重要的技术是过程(procedure)和函数(function). 从这一点来看, 一个过程调用可以象跳转(jump)命令那样改变程序的控制流程, 但是与跳转不同的是, 当工作完成时,函数把控制权返回给调用之后的语句或指令. 这种高级抽象实现起来要靠堆栈的帮助.
    堆栈也用于给函数中使用的局部变量动态分配空间, 同样给函数传递参数和函数返回值也要用到堆栈.

Linux 下进程地址空间的布局

1.2 Oracle数据库缓冲区溢出攻击
消除基于缓冲区溢出漏洞的攻击的步骤
1 首先编写相关程序使缓冲区发生溢出。
2 然后寻找溢出点。
其中,寻找溢出点、编写恶意代码是完成攻击的基础,而跳转到溢出点注入恶意代码则是攻击的重难点。在寻找溢出点的过程中,通常采用了使用两次不同的参数填充确定溢出点和二分法测试溢出点这两种方法。
3 最后在溢出点注入恶意代码。
在攻击的过程中,可以根据实际情况选取不同的方法。编写的恶意代码即通常所说的shellcode,它是一组能完成想要功能的机器代码,通常以16进制数组的形式存在,可以通俗的理解为程序执行指令(也就是汇编指令)对应的机器码。编写shellcode的一般方法是先写出C代码,然后找出里面用到的库函数的地址,再把C代码改编为汇编代码,利用调试器调试汇编代码,最后从中提取机器代码。接下来的问题就是如何跳转到shellcode。
针对不同缓冲区溢出的类型,目前通常采用的是jmp esp和SEH这两种跳转方法。同样,针对Oracle数据库缓冲区溢出攻击主要的问题就是如何写出相关程序来使缓冲区发生溢出,以及寻找溢出点,并且在溢出点注入相关的恶意代码,使之能够实现在正常访问的情况下所不能获得的权限或者相关效果。缓冲区溢出漏洞本身是在Oracle数据库中普遍存在的一种漏洞,目前绝大多数的Oracle数据库缓冲区溢出漏洞已经被人们进行了一系列的深入研究,但是随着Oracle数据库的不断更新与发展,新的漏洞不断出现并被人们所发现与研究。本文首先从发现缓冲区漏洞的基本问题入手,讨论了缓冲区溢出漏洞的成因。在发现了相关的缓冲区溢出漏洞之后,选择了其中一个缓冲区溢出漏洞——Oracle数据库中自带函数NUMTOYMINTERVAL在调用过程中存在缓冲区溢出漏洞作为切入点,对缓冲区溢出漏洞进行了深入的研究,以此来发现溢出点,之后需要进一步解决如何在溢出点注入相关的恶意代码。

2 研究SQL注入点的发现与注入技术

在没有源代码的情况下,并不知道函数局部变量的大小,所以定位溢出点的方法一般是利用不同大小的参数反复调用该函数,直到系统报错,再根据系
统的错误信息定位溢出点。如果系统没有报错,说明你的参数的大小还没有超过局部变量的大小,这时你要不断地增加参数的大小,以达到溢出点定位的目的。
针对本文函数 NUMTOYMINTERVAL 中缓冲区溢出漏洞的特点,需要找到一个让本文开始可以控制程序流程的地方作为溢出点。寻找溢出点,本文需要利用 Oracle 数据库的数据库操作日志文件。这个文件(alert_数据库名)存放在 Oracle数据库安装目录下的“admin数据库名cdump”文件夹中,所有对于数据库的操作都会在这个日志文件中记录下来。利用这个日志文件,可以很直观地观察到溢出漏洞被触发时当前的 PC 的值,从而确定溢出点的位置。
编写 shellcode 目前流行的有两种方法:第一种是用 C 语言编写,然后提取;第二种是用汇编语言编写,然后提取。本文选择第一种方法,因为直接使用 C语言编写,方便编写、修改、调试。先写出 C代码,再转变为汇编代码,最后通过调试器提取机器代码

3 缓冲区溢出的防范方法

静态防范策略
静态防范着重于通过对代码的静态分析消除可能引起缓冲区溢出的代码漏洞,是一种预防策略。
这类防范策略中比较有代表性的方法有词典分析、语义注释、改造C语言编译系统等。此外,已出现的静态检测缓冲区溢出的系统,还有Wagner等人开发的系统,它成功地从sendmail软件中检查出已知和未知的缓冲区溢出漏洞;CeogreG.Necula等人开发的Poor-carrying code等。
动态防范策略
动态策略通过对存在问题的软件进行技术上的弥补来消除缓冲区溢出漏洞。
动态防范的策略主要体现在运行时检测和阻止缓冲区溢出的攻击.其中Crispin Cowan等人开发的堆栈卫士是到目前为止最成功的方法.

4 数据库注入攻击工具

Pangolin
Pangolin是一款帮助渗透测试人员进行SQL注入(SQL Injeciton)测试的安全工具。Pangolin与JSky(Web应用安全漏洞扫描器、Web应用安全评估工具)都是NOSEC公司的产品。Pangolin具备友好的图形界面以及支持测试几乎所有数据库(Access、MSSql、MySql、Oracle、Informix、DB2、Sybase、PostgreSQL、Sqlite)。Pangolin能够通过一系列非常简单的操作,达到最大化的攻击测试效果。它从检测注入开始到最后控制目标系统都给出了测试步骤。Pangolin是目前国内使用率最高的SQL注入测试的安全软件。
Sqlmap
Sqlmap是一个自动SQL 注入工具。其可胜任执行一个广泛的数据库管理系统后端指纹,检索DBMS数据库、usernames、表格、列、并列举整个DBMS信息。Sqlmap提供转储数据库表以及MySQL、PostgreSQL、SQL Server服务器下载或上传任何文件并执行任意代码的能力。

参考链接:http://www.cnblogs.com/coderzh/archive/2008/08/20/1272183.html
                 缓冲区溢出攻击手段及防范策略分析_万春
原文地址:https://www.cnblogs.com/2017yaya/p/9065224.html