安全测试之缓冲区溢出(BO)

一、缓冲区溢出的概念

BO的概念很简单,就是你申请了一点内存,而你填入的数据超过了内容的大小,这样你填入的数据就会占用其他的内容,这种情况就是缓冲区溢出。

void copy(char* info)
{
char buf[100];
strcpy(buf, info);
}

如果info的长度大于100,就会产生buffer overflow了。

二、怎样利用BO来实施攻击?

BO听起来只是会占用其他的内存,貌似最多也只是网站的崩溃,但是不会造成安全问题。但是,BO能够引起很严重的安全问题的原因在于:攻击者可以利用缓冲区溢出带来的漏洞来实施攻击或浸入,从而使计算机能够执行攻击者填入的恶意代码,例如改变程序的返回地址(或者返回值)到攻击者想到用户访问的地址等,从而控制计算机。

三、受缓冲区影响的语言

缓冲区溢出主要影响的语言是C语言和C++,但是对于java,.net等托管的语言并不意味着不会产生这种漏洞,如果java语言编写的程序中调用了C或者C++或者windows的一些API等,都有可能会产生缓冲区溢出的漏洞。

四、实例解析缓冲区溢出为什么是安全问题?

下面有一段代码,主要功能是通过用户的姓名来判断是否是admin用户,如果用户名就是“admin”,说明其是一个admin用户,否则,认为其是一个普通用户。

bool check_login(char *name)
{
      int x = 0;
      char small_buffer[10];
      if(strcmp(name,"admin")==0)
                 x = 1;
       strcpy(small_buffer, name);
       if(x>0){
               printf("login as admin!\n");
               return true;
               }else{
               printf("login as common user!\n");
               return false;
               }
}
int main(int argc, char *argv[] )
{
  char *name = argv[1]; // char *name="1234567";
  int res = check_login(name);
  printf("%d\n",res);
  return 0;
}

以上的这段代码,通过运行调试可以发现,若把char *name = argv[1];变为char *name="admin";,会输出”login as admin”;如果把char * name = argv[1];变为char *name = "123456";,会输出”login as common user”,以上这两种情况都是正确的,是因为name都没有超过缓冲区的最大值,现在测试把char * name = argv[1];变为char *name = "12345678901234668";(内存超过预定义的small_buffer[10]),则会输出login as admin,这个结果是错误的,而且12345678901234668这个用户可以操作管理员权限,会给安全问题带来严重影响,观察下图内存的分布就可以知道这个问题的原因:

这里写图片描述

五、缓冲区溢出可能发生在哪些情况下?

  1. 字符串输出没有限制大小长度等。

  2. 代码不正确,没有对特殊情况作出异常处理等。

Note:
缓冲区溢出一般在测试的时候并不把它归结于安全测试,一般都是在功能测试-输入数据的边界值测试中体现。


注:了解缓冲区溢出的具体分类,可参考:
http://www.51testing.com/html/62/n-7562.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值