【代码审计】BootCMS v1.1.3 文件上传漏洞分析

 

0x00 环境准备

BootCMS官网:http://www.kilofox.net

网站源码版本:BootCMS v1.1.3  发布日期:2016年10月17日

程序源码下载:http://www.kilofox.net/download-v1-1-3

测试网站首页:

 【代码审计】BootCMS v1.1.3 文件上传漏洞分析_第1张图片

0x01 代码分析

1、漏洞文件位置:/application/classes/controller/manage.php 第2082-2134行:

  1. public function action_create_media()  
  2. {  
  3.     if ($this->request->method() == 'POST')  
  4.     {  
  5.         $output = new stdClass();  
  6.         $output->status = 0;  
  7.         $output->title = '操作失败';  
  8.         $output->content = '您没有足够的权限进行此项操作。';  
  9.         $this->accessLevel = Admin::minimumLevel('create_media');  
  10. 10.         if ($this->user->role_id == $this->accessLevel)  
  11. 11.         {  
  12. 12.             $groupId = (int) $this->request->post('gid');  
  13. 13.             $group = Model::factory('media_group')->load($groupId);  
  14. 14.             if (!$group->id)  
  15. 15.             {  
  16. 16.                 $output->status = 2;  
  17. 17.                 $output->title = '操作失败';  
  18. 18.                 $output->content = '请选择媒体分组。';  
  19. 19.                 exit(json_encode($output));  
  20. 20.             }  
  21. 21.             if (isset($_FILES['qqfile']) && $_FILES['qqfile']['name'])  
  22. 22.             {  
  23. 23.                 $file = Validation::factory($_FILES);  
  24. 24.                 $file->rule('qqfile', 'Upload::not_empty');  
  25. 25.                 $file->rule('qqfile', 'Upload::valid');  
  26. 26.                 $file->rule('qqfile', 'Upload::image');  
  27. 27.                 $file->rule('qqfile', 'Upload::size', array(':value', '2M'));  
  28. 28.                 if (!$file->check())  
  29. 29.                 {  
  30. 30.                     $output->status = 3;  
  31. 31.                     $output->title = '无效的文件';  
  32. 32.                     $output->content = '这个文件是无效的。';  
  33. 33.                     exit(json_encode($output));  
  34. 34.                 }  
  35. 35.                 $extension = Functions::nameEnd($file['qqfile']['name'], '.');  
  36. 36.                 $fileName = date('ymdHis') . mt_rand(10, 99) . $extension;  
  37. 37.                 $directory = getcwd() . '/assets/uploads/' . $group->slug;  
  38. 38.                 $filePath = $directory . DIRECTORY_SEPARATOR . $fileName;  
  39. 39.                 if (!file_exists($filePath))  
  40. 40.                 {  
  41. 41.                     $filePath = Upload::save($file['qqfile'], $fileName, $directory);  
  42. 42.                 }  
  43. 43.                 else  
  44. 44.                 {  
  45. 45.                     $filePath = Upload::save($file['qqfile'], NULL, $directory);  
  46. 46.                 }  
  47. 47.                 if ($filePath === false)  
  48. 48.                 {  
  49. 49.                     $output->status = 4;  
  50. 50.                     $output->title = '文件上传失败';  
  51. 51.                     $output->content = '无法保存上传的文件!';  
  52. 52.                     exit(json_encode($output));  
  53. 53.                 }  

这段代码中,首先进行权限验证,然后获取qqfile参数,将文件上传到服务器,最后进行调整生成缩略图,注意看红色代码部分,并没有对文件类型进行过滤,可以构造脚本文件上传到服务器,导致程序在实现上存在文件上传漏洞,攻击者可以通过上传脚本木马,控制服务器权限。

0x02 漏洞利用

1、登录网站后台,在媒体—媒体库—添加新媒体—上传图片木马—抓包修改为PHP后缀—成功上传:

 【代码审计】BootCMS v1.1.3 文件上传漏洞分析_第2张图片

2、程序生成缩略图过程报错,直接爆出上传后脚本木马文件的物理路径,通过URL访问:

 【代码审计】BootCMS v1.1.3 文件上传漏洞分析_第3张图片

3、通过菜刀连接,成功控制网站服务器

 【代码审计】BootCMS v1.1.3 文件上传漏洞分析_第4张图片

0x03 修复建议

1、通过白名单限制上传文件后缀

2、禁止上传目录脚本执行权限。

最后

欢迎关注个人微信公众号:Bypass--,每周原创一篇技术干货。 

 

你可能感兴趣的:(【代码审计】BootCMS v1.1.3 文件上传漏洞分析)