数据库缓冲区溢出漏洞原理解析

数据库缓冲区溢出漏洞原理解析

ID:9996319

大小:107.95 KB

页数:9页

时间:2018-05-20

数据库缓冲区溢出漏洞原理解析_第1页
数据库缓冲区溢出漏洞原理解析_第2页
数据库缓冲区溢出漏洞原理解析_第3页
数据库缓冲区溢出漏洞原理解析_第4页
数据库缓冲区溢出漏洞原理解析_第5页
资源描述:

《数据库缓冲区溢出漏洞原理解析》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、数据库缓冲区溢出漏洞原理(栈)安华金和思成一.背景在数据库系统中已经发现了许多安全漏洞,其中比较严重且危害性比较大的有:缓冲区溢出和SQL注入2种。SQL注入主要依赖于结构化查询语言,每种数据库略有出入;SQL注入漏洞的利用,最主要的威胁是提权;后台维护人员或黑客攻击,可以借此获得DBA权限。需要说明的是,这里所说的SQL注入并不是应用系统的SQL注入,而是数据库自身的注入漏洞,这种漏洞比应用系统的注入漏洞危险性更高;对于SQL注入漏洞的存在,主要是由于数据库中提供的系统或用户函数存在的参数检查不严和语句执行的缺陷。SQL注入漏洞不

2、是本文的探讨重点,将在安华金和数据库安全实验室发表的其它文章中进行探讨。而对于缓冲区溢出的漏洞,风险性更高,因为通过缓冲区溢出漏洞不仅可以危害数据库,还可以控制操作系统,从而以数据库服务器为跳板,控制整个内网系统。缓冲区溢出的漏洞,不仅在数据库系统中有,在操作系统上运行的相关应用软件也有,但对于数据库由于要提供大量外部访问,防火墙、IPS等传统不能对其进行禁止,这些攻击隐藏在数据库的通讯协议中,具有更大的隐蔽性,更是难以防范。缓冲区溢出的攻击实现不仅需要注入点(注入点,是数据库的漏洞提供的),同时还要依赖于操作系统的程序调用机制来实

3、现;现在的操作系统对此,都在逐步加强防守,但攻击者总是能够找出方法进行突破,这种突破主要依赖于shellcode的编写。缓冲区溢出本质上是因为操作系统无法区分数据和指令的区别,把数据当指令来执行,从而产生了无法预计的结果。安华金和数据库安全实验室将在本文将以windowsXP为依托,借助代码对如何利用缓冲区溢出做原理性介绍,以便于我们未来对其防范原理进行更好的讨论。-9-DBSEC©2016www.dbsec.cn一.缓冲区溢出缓冲区溢简单说,是大的数据存入了小缓冲区,又不对存入数据进行边界判断,最终导致小缓冲区被撑爆。大的数据污染

4、了小缓冲区附近的内存。污染的内存可能带来改变程序控制流、夺取操作系统、禁止访问等多种结果。下文所有的讨论都是在windowsxp上进行。缓冲区溢出主要可以分成三种:静态数据溢出、栈溢出和堆溢出。产生这三种不同的溢出根源在于win的内存结构;win的内存可以被分成两个层面:物理内存和虚拟内存。我们一般看到的其实只是windows的虚拟内存。在XP下windows会给所有进程都分配4G内存(无论物理内存真实多大);windows会把4G内存分成代码区、数据区、堆区、栈区。数据区存储的是进程的全局变量。如果利用这里的数据进行缓冲区溢出那么

5、就被称为静态数据溢出。同样利用栈区和堆区进行缓冲区溢出,则相应被称作栈溢出和堆溢出。静态数据溢出虽然技术难度低但是灵活性和可以利用范围低,所以本文就不介绍了。堆溢出相对复杂,将在别的文章介绍。本文介绍的是windows下的栈溢出,想要知道WINDOWS下的栈溢出如何利用,首先要理解windows下的栈结构。1.1栈结构为了直观的说清楚windows下的栈结构。我们构造一段代码见下图。这段代码将完成3个任务:1.演示WIN下栈的结构2.演示缓冲区溢出改变函数控制流程3.演示缓冲区溢出覆盖返回地址(劫持函数)下面的程序包含一个主函数ma

6、in和另外一个子函数re_choose。re_choose函数用于把从main函数中取得的输入字符串和存储的字符串liusicheng做对比。如果输入的字符串和存储的字符串一致则返回0。如果不一致则可能返回1或者-1。同时还人为制造了一个缓冲区溢出点strcpy(buffer,input)。input有1024的空间,而buffer只有44的空间。只要input超过44则就会引发缓冲区溢出。main函数取re_choose返回值如果返回1或-1走if。如果返回0则走else。将用缓冲区溢出来让返回1或者-1也走else。#inclu

7、de#include#defineture_password"liusicheng"intre_choose(char*input)-9-DBSEC©2016www.dbsec.cn{intresult;charbuffer[44];result=strcmp(input,ture_password);strcpy(buffer,input);//缓冲注入点returnresult;}voidmain(){intchoose=0;charinput[1024];scanf("%s",input)

8、;choose=re_choose(input);if(choose==1

9、

10、choose==-1){printf("error");}else{printf("ture");}}编译出上面代码的release版,放入IDAp

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。