WebGoat实验之Buffer Overflow(缓冲区溢出)- 2016.01.08

来源:互联网 发布:十字绣制作软件 编辑:程序博客网 时间:2024/04/28 13:04

Buffer Overflow(缓冲区溢出),这已经是一个老生常谈的话题了,不仅在软件的制作上回出现这样的问题,其实在网络上也存在这样的问题。更准确的说应该是在有用户输入的地方都存在缓冲区溢出的可能性。那么什么是缓冲区溢出呢?百度是这么说的“计算机程序一般都会使用到一些内存,这些内存或是程序内部使用,或是存放用户的输入数据,这样的内存一般称作缓冲区。溢出是指盛放的东西超出容器容量而溢出来了,在计算机程序中,就是数据使用到了被分配内存空间之外的内存空间。而缓冲区溢出,简单的说就是计算机对接收的输入数据没有进行有效的检测(理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符),向缓冲区内填充数据时超过了缓冲区本身的容量,而导致数据溢出到被分配空间之外的内存空间,使得溢出的数据覆盖了其他内存空间的数据。

看起来好烦,其实就是:在数据进行操作时没有正确考虑所使用的字符串的长度,使为其分配的空间小于其长度,进而导致占据其他空间所导致的漏洞。这些漏洞往往会引起程序的运行错误(产生一些未知的错误或者结果),同样也可以被攻击者利用进而执行一些自己特定的程序,那么其危险性就不言而喻了。其大致可分为栈缓冲区溢出和堆缓冲溢出。至于栈缓冲溢出和堆缓冲区是怎么回事,以及怎样利用,或者说有什么危害,在这里我不会做太多的解释。不过大家可以看我的其他博客,我会对每一项都做详细的讲解。

接下来说一下这个实验的大概意思:这个实验大概是说让我们找一个 VIP 客人的房间号,可是我们没有任何线索。我们的操作分为两步,第一步我们首先需要输入用户的相关信息以保存用户的信息,第二步,然后我们需要选择时间段和这段时间的费用;最后会给出相应的信息。那么问题就很明确了,第一步我们提交用户的基本信息和第二步我们提交时间段都存在换成去溢出的可能性,但是由于第一次提交数据只是向数据库保存数据,并未根据时间段进行选择判断,也就是查询了,那么我们就没有必要进行第一部分的溢出,我们只需要进行第二部分的溢出然后让数据库再返回值得时候发生溢出进而发生错误,返回给客户端多余的信息。

其实我做这个实验的时候,也不是一次就成功了的,前几次都因为输入的数据太短而未能发生溢出,后来又因为输入数据太长导致浏览器崩溃。接下来就和大家分享一下怎么顺利的完成这个实验吧!首先,如图 1 所示,我们随便输入一些信息,进入第二步,然后我们再第二步中不做任何修改的情况下,直接点击提交按钮,用Webscarab截获数据,然后对房间号进行大量的注入数据(因为在做查询操作的时候是根据时间点和房间号进行查询的,所以注入其他的也没有用,另外本人建议在第一注入的时候不要注入太多的数据,我们可以循序渐进), 如图 2 所示,然后我们用 Webscarab 释放数据,如果数据较小,我们会得到如图 3 的页面,这就证明我们注入的数据太短了,这是我们可以舒心页面,再次提交数据,然后在Webscarab截获数据的页面扩展数据(教给大家一个扩展数据的好方法,不用使用任何工具,那就是Ctrl + A 全选数据,然后 Ctrl + C 复制数据 ,然后再 Ctrl + V 黏贴数据,往复循环,很快的,那可是指数级增长啊!),慢慢来,不建议一次性扩展太多数据,否则可能引起浏览器崩溃。就这样尝试,直到我们遇到如图 4 所示的页面。这就证明我们的缓冲区溢出成功了。这时我们就可以任选一组数据用于再次做这次实验,这时就会发现实验通过了。(在这里我选的是John,Smith,56这组数据)最后结果如图 5 所示。


图 1


图 2


图 3


图 4


图 5

老规矩总结一下这个实验,首先不得不说的是真的是一个头疼的实验,数据小的时候不溢出,数据大的时候浏览器崩溃了,真的是看来这两个极端有的时候是不好走啊,有的时候是需要循序渐进啊!缓冲区溢出是一种非常普遍、非常危险的漏洞,在各种操作系统、应用软件和网络环境中均广泛存在。利用缓冲区溢出攻击,可以导致程序运行失败、系统宕机、重新启动等后果。更为严重的是,可以利用它执行非授权指令,甚至可以取得系统特权,进而进行各种非法操作。不过也不是没有办法进行预防的,这同样涉及到了程序员的编程习惯问题,这就要求我们对系统边界外的所有数据均进行边界检查。

1 0