无框架的php cms审计,通读审计之DOYOCMS

原标题:通读审计之DOYOCMS

前言

首先大家看到我文章的标题,我这里所谓的“通读审计”就是把整个代码审计过程一字不差的记录下来。因为审计过很多CMS,也看过很多代码审计文章,大多数都是把漏洞点提一下然后文章结束,对于不懂MVC的审计者来说,看其他人代码审计文章,很多细节问题搞不明白(因为我自己也是从那里过来的),所以读起来不是太舒畅,自己学习起来也有点吃力,尤其到MVC框架一块。然后这把就是给大家分享一下我个人的整个代码审计过程,以及如何发现漏洞,如何自己构造语句等等。这次审计的cms是DOYOCMS建站系统,因为我们学校使用的该系统,就随便拿一套过来记录吧。也是给自己做个记录,给大家分享个人经验。

一、MVC的了解

这里就不再废话了,直接就开始吧。

85d419ed66450ad3c8e3bbd6de02aaab.png

Index.php第二行,上来直接require进来一个config.php,我们来看一下该文件到底做了哪些操作。

09f8b73b5a58cadeb9d83c4eea77baac.png

OK,config.php文件定义了一些常量以及数据库信息。

Index.php第三行。

$doyoConfig[ 'view'][ 'config'][ 'template_dir'] = APP_PATH. '/template/'.$doyoConfig[ 'ext'][ 'view_themes'];

如下图的变量值赋给

$doyoConfig[ 'view'][ 'config'][ 'template_dir']

acb07ef5ec7faa5e9fbc4c5c6277ffa4.png

Index.php的第四行的

require(DOYO_PATH. "/sys.php");

把config.php的两个定义常量

define( "APP_PATH",dirname( __FILE__));

define( "DOYO_PATH",APP_PATH. "/include");

的DOYO_PATH与sys.php拼接起来并且包含(包含include/sys.php)

我们看一下包含进来的sys.php文件进行了哪些操作

b298cb6a53650b7634e0220866cd40d0.png

Sys.php的第四行包含进来一个Functions.php文件。从文件名上来看来猜测是包含来的一些方法吧。

打开看一下

cecf3ca1d30a5b810e8241ada17654b8.png

好,确定包含方法。回到sys.php文件继续通读

Sys.php文件的第五行

$GLOBALS[ 'G_DY'] = spConfigReady( require(DOYO_PATH. "/inc.php"),$doyoConfig);

Require进来inc.php文件并且使用spConfigReady函数处理(之前提到的functions.php方法文件还记得吧)

跟进spConfigReady方法

2b98be65f45660f2bee77bef6b9d60f9.png

可以看到第218行进行判断传入进来的$useconfig是否为数组,如果为数组进行遍历该数组,并且把传递过来的$useconfig保存到$preconfig内(合并数组)。

从他调用该方法中给形参1传递一个require进来的文件可以判断。该文件直接return一个数组。

打开包含进来的require(DOYO_PATH.”/inc.php”)文件来看一番

231fadb0dff80c3580d896f8d35b310a.png

直接return一个数组

好,把inc.php文件return的数组与之前在index.php中定义过的$doyoConfig['view']['config']['template_dir']保存到全局变量$GLOBALS['G_DY']

回来继续读取sys.php

3511443be15d230b9e568f22066e47c7.png

在functions文件中,跟进import方法。

2e7d050f7dab0b8fb97291d727d5c8da.png

再来看一下传递进来的值

05200cb1435cd372bada6f7dbe9c507d.png

39-43行的

if( TRUE== @is_readable($sfilename) ){

require($sfilename);

$GLOBALS[ 'G_DY'][ 'import_file'][md5($sfilename)] = TRUE;

returnTRUE;

}

进行判断形参$sfilename是否可读,可读即包含。

OK,了解完import是用来读取文件之后,我们随着依次打开

这三个文件,看一下都有哪些操作。

a52207a14ff39812e247cf9f8c7d228c.png

哈哈,三个文件都是定义的类文件。

从字面上来看

syController:Controller的表面意思为控制器

syModel:Model的表面意思为模型

syView:View的表面意思为视图

MVC…

再回来读sys.php文件的第29-36行

ff2a41ba503203da45dbfa864e5423e6.png

判断分支给$GLOBALS['G_DY']['url']["url_path_base"]进行赋值

再读取sys.php文件的第42-50行

看到!empty($_SERVER['PATH_INFO'],是用来实现伪静态化的操作的

下面的52-58行是作为重点。

587128009169d65418fb38a8f2765294.png

判断分支给$GLOBALS['G_DY']['url']["url_path_base"]进行赋值

再读取sys.php文件的第42-50行

看到!empty($_SERVER['PATH_INFO'],是用来实现伪静态化的操作的

下面的52-58行是作为重点。

b4c40e44573d561fea73887fa659cff9.png

跟进syClass与spLaunch方法

functionsyClass($class_name, $args = null, $sdir = null, $force_inst = FALSE){

if(preg_match( "/^[a-zA-Z0-9_\-]*$/",$class_name)== 0)syError( "类定义不存在,请检查。");

if( TRUE!= $force_inst) if( isset($GLOBALS[ 'G_DY'][ "inst_class"][$class_name])) return$GLOBALS[ 'G_DY'][ "inst_class"][$class_name];

if( null!= $sdir && !import($sdir) && !import($sdir. '/'.$class_name. '.php')) returnFALSE;

$has_define = FALSE;

if(class_exists($class_name, false) || interface_exists($class_name, false)){

$has_define = TRUE;

} else{

if( TRUE== import($class_name. '.php')){

$has_define = TRUE;

}

}

if( FALSE!= $has_define){

$argString = '';$comma = '';

if( null!= $args) for($i = 0; $i < count($args); $i ++) { $argString .= $comma . "\$args[$i]"; $comma = ', ';}

eval( "\$GLOBALS['G_DY']['inst_class'][\$class_name]= new \$class_name($argString);");

return$GLOBALS[ 'G_DY'][ "inst_class"][$class_name];

}

syError($class_name. "类定义不存在,请检查。");

}

1a75c73a1a49b70d1ae26ac4da1de234.png

二、 PHP任意文件替换漏洞

紧接着上面继续往下分析

我们打开sysession文件看一下。

55a814b58f4d6de190f6a03fb526d779.png

自改了session存储机制。注意看write方法。写入session操作。

看到在file_put_contents写入前拼接了” ”关键字。首先我们想到php://filter进行绕过。但是我们可以看到前面拼接了一个$filedir。$filedir变量是路径信息。不可控。则php://filter无法绕过。

file_put_contents在windows下我们可以进行写入冒号文件流的格式。例如:xxx.php:.php。可以逃逸。但是生成后的文件却是空的。再进行xxx.php<<

我们没有任何机会来通过session文件来getshell

但是从另一个角度讲,file_put_contents函数是由fopen函数与fwrite函数封装起来的。使用了’w’的写入规则。

58bd84fbbab7f4c685a01bf3289c00dd.png

比如,这里有一个1.php。文件内容为123,当你file_put_contents(‘1.php’,’xxx’);的时候,1.php文件内容”123”会被替换为我们传入的”xxx”

再来看看程序自写的session存储机制居然没有对路径做任何过滤。

那么就比较有趣了。我们可以通过修改session的值。来进行替换任何文件。

573958d4015de0ae4a4914c583faee50.png

就可以成功把根目录下的 /include/inc.php 文件内容给替换掉。include/inc.php 文件内容为网站配置。该框架中有运行。再结合之前程序写入session文件内容所定义的。可以导致网站无法正常访问。(被die暂停程序运行)。

验证漏洞结果:

9111acb70da87f746c6d7a56ec520973.png

三、继续观察MVC

我们再回到functions.php文件进行读取第11行

$handle_controller = syClass($__controller, null, $GLOBALS['G_DY']["controller_path"].’/’.$__controller.”.php”);

进行syClass函数处理。我们之前了解到syClass方法是用来处理类文件并包含的。

709bd7e68d97d337893bfb004ae459b5.png

传入的第三个参数亮了。

0c516c65abf7d557005caa83eeba8c25.png

根据我们传递的参数,则/source/$_GET[‘c’]是我们所包含的文件。我们在source文件夹下创建test.php进行验证一下

d84c8218e46986ade1b11404fc14f882.png

看来逻辑是没有问题的

接着我们继续往下看functions.php文件的第16行

fa3260672ac3e8fcdae735d7885ef720.png

这样来,我们整个的处理逻辑搞清楚开始挖掘漏洞

四、SSRF漏洞

当前我在functions.php这个文件。既来之,则安之。我通过危险自定义的一些方法来寻找漏洞

我从functions.php文件的第100-117行发现了

4d3f8f44153cf36b9c8977667a731f02.png

该函数传入的$url如果没有严谨的过滤,则会造成SSRF漏洞

全局搜索一下这个函数。

ee1f898049426e91cbacc2ef6b436ac7.png

看到大名鼎鼎的a_sys类文件($_REQUEST[‘c’])与调用该漏洞的方法($_REQUEST[‘a’])

153d30c039706269ec61dbf5c931dc6c.png

可是问题来了,我们所包含类文件的路径是 /source,而不是/source/admin/xxx.php

那么我们如何引入呢?不慌。

78d79a1e7944314b2e10a6bee53a5c37.png

全局搜索一下哪里修改了$doyoConfig['view']['config']['template_dir']的值(该值影响包含路径)

在admin.php中重现了index.php的操作。只是略有一些不同

20817a9033a9d56bbb8ab8676324fc85.png

那么我们SSRF漏洞利用点也只能在后台了,有一定的局限性

登陆后台后

我们包含a_sys.php文件并实例化该类,然后调用template_cache方法

f8bb04e897a1ccb3a20fda631a2dc5f3.png

这里是传入的$y。我们再该文件内翻半天也不会翻到syArgs方法的。

原因很简单,继承了一个类。

e5b715362ec0fd9fdf54b5b644c5e953.png

这里构造方法有了和template_cache方法相同的步骤

我们之前所看过的这个类的一个syArgs方法

可是在syController中也没有找到syArgs方法,那么我们就需要看一下__call魔术方法的处理了

bf590fb26a5f67e278a9706ab12abfbf.png

第48行

return syClass($name)->__input($args);

syClass我们之前了解到的功能就是进行包含syArgs这个类文件或实例化该类,随后调用__input方法,把我们__construct的$this->a=$this->syArgs(‘a’,1);中’a’,1以数组的形式传递给__input方法

9c370cf739cc9c4026deb2beaa49f3fa.png

看一下get方法

e0937c39c801a4702960093ceaeaed84.png

调用了has方法,把字符串’a’传递进去了

跟进has方法

0e5cc0e7617d35fcdb417327036164ef.png

咦?多了一个成员属性$this->args

我们看一下构造方法是否初始化该属性

该类的构造方法

063d3491c3939af98a448fb317e565a0.png

args成员属性是$_REQUEST进来的变量

如果我们传入的?a=template_cache,返回true

再回来看一下该分支结构

7bc0ed7b39e96faa224e1f185adc4d10.png

继续跟进filters方法

92b77d8d3b68a28ab032b596beac8678.png

看到该方法是用来过滤传入数据内容的。在其中的 case 0,1,2,3,4,5,中,可以看到都对传入的数据进行过滤操作。可是在case 2中,漏洞出现了。这里涉及到array_walk_recursive函数利用问题。

edac78ed652033d2bf188b35c88127ab.png

看着arrays方法的代码块,好像过滤的还挺全的。不仔细想一想还真不知道。

array_walk_recursive函数并不会影响到数组本身。例如:

31eda4decaf4aa6bc1664544d2ff7263.png

可以看到我们放入的 test=>’aaa,单引号并没转义。好了,现在了解到syArgs的第二个参数存在未过滤问题。

我们继续回到第102-105行的操作

再回到我们之前这一步

1f5080a56bf5d9fddc32b9caf0629efe.png

把我们传入的y进行实体化编码(htmlspecialchars)以及防注入(addslashes)操作,但是我们当前发现的漏洞输入SSRF类型的,所以对我们毫无影响~

好了,构造payload: admin.php?c=a_sys&a=template_cache&y=127.0.0.1:3306

验证漏洞结果:

3b1b84bbe3f64e6c082e6b0c55ac4110.png

五、SQL注入漏洞

那么我们知道syArgs(x,2)的第二个参数存在漏洞问题之后。我们全局搜索:,2)。来查找哪一地方使用了该函数。

6d9432089e21f1282f1714d1fcb4b6e0.png

可以看到update关键词。这东西对我们非常敏感。审计突然就像喝了红牛一样。精神杠杠的。

PS:这里if验证跟进就不再说了。直接看update。

af24da294c43524828d4db3045db75b6.png

果然,是自己封装的update语句。

那么构造

Payload:?c=a_classtypes&a=alledit&orders[]=1′ or updatexml(2,concat(0x7e,(version)),0) or’

验证漏洞结果:

454cca2b248a52c2cff102f17c744d56.png

*本文作者:Heihu577,转载请注明来自FreeBuf.COM返回搜狐,查看更多

责任编辑:

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
软件介绍1、架构轻盈,完全免费与开源 采用轻量MVC架构开发,兼顾效率与拓展性。全局高效缓存,打造飞速体验。 2、功能自由搭配,保证系统纯净 全插件机制,安装卸载全绿色操作,无残留,对系统臃肿零容忍,最小仅数百K。 3、让简洁与强大并存 强大字段自定义功能,完善的后台开关模块,不会编程也能搭建各类网站系统。 4、会员、留言、投稿神马一个不能少 不断升级完善的模块与插件,灵活的组装与自定义设置,满足你的多样需求。 5、安装、升级、备份、转移一键完成 一键安装、一键升级、一键备份、一键转移。从此,让你的网站维护变得如此轻松。 6、顶级的配套服务 超级精美的模版库,精选国内性价比、速度、安全最佳的空间,让你远离挑选的烦恼。 DOYO通用建站系统系统功能: 1、功能频道:内容频道(强大自定义功能)、留言频道 2、插件模块:会员管理、广告管理、专题管理、评论管理、链接管理等 3、系统功能:静态HTML生成、自定义模板标签、附件清理、数据备份恢复 4、在线升级:一键自动在线安全补丁升级,免除维护烦恼 5、自定义字段:强大的自定义字段功能,可按栏目、频道添加各种输入字段,包括文本、数字、单选、多选、编辑器、单附件、多附件 6、SEO优化:独立的页面SEO信息设置,方便快捷 7、HTML静态:全站纯静态生成功能 8、附件检测:自动附件清理功能,一键清除未使用多余附件,保持系统纯净 9、高效缓存:全站高效缓存机制,运行飞速体验 10、模板代码生成器:自带模板调用生成器,零基础也能快速制作模板标签 11、全功能权限设定:分组机制管理权限设定,全功能全栏目均可指定管理权限 12、数据库操作:一键备份、一键恢复、一键转移空间,方便快捷 本次更新内容: 1、框架核心升级 3、修正当前栏目tid错误 4、修正修改投稿错误 5、去除后台留言多余链接 6、修正留言自定义字段错误 升级方法: 进入系统后台 系统—>在线升级(按提示操作升级即可) 其他版本请先在线升级到20120618版,然后再次执行在线升级即可
DOYO通用建站系统 2.3 增加与完善功能如下:2014-04-25 1、支付、购物功能,其中包括:支付平台、购物车、虚拟商品、实物商品、内容商品、会员充值、订单、商品属性、虚拟货物自动发货、财务记录、会员级别优惠等功能。 2、水印缩略强化,支持按栏目按字段指定缩略图大小设置。 3、调整程序目录接口,开放修改后台入口及文件名。 4、加入表单调用标签,可以在任意位置调用表单发布form 5、自定义频道功能,可以自由增加自定义频道,独立数据表结构。 6、自定义字段增加频道关联类型,可指定不同频道内容互相关联。 7、loop、sql标签增加分页功能。 8、html生成目录增加栏目目录标签 9、优化远程图片自动获取功能,图片抓取更精准,优化验证码显示。 10、调整会员登陆状态、评论为ajax刷新,实现静态化下的实时更新。 11、优化html静态生成功能,建议开启curl函数,大幅提升生成效率。 12、增加模板导入导出工具,同步备份现有模板及数据,方便模板安装转移和分享。 13、增加模板附件(图片、样式表、js)目录,增强模板安全性。 14、全新的会员权限机制,增加会员找回密码等功能。 15、上传功能采用全新的DOYO原创图片上传插件,大幅提高上传效率及兼容性。 16、更换编辑器为kindeditor 17、增加系统安全密钥功能,对隐私数据进行加密处理,进一步提高安全性能 18、其他多达50处细节功能优化调整,进一步提成兼容性、执行效率等。    1、架构轻盈,完全免费与开源 采用轻量MVC架构开发,兼顾效率与拓展性。全局高效缓存,打造飞速体验。 2、功能自由搭配,保证系统纯净 全插件机制,安装卸载全绿色操作,无残留,对系统臃肿零容忍,最小仅数百K。 3、让简洁与强大并存 强大字段自定义功能,完善的后台开关模块,不会编程也能搭建各类网站系统。 4、会员、留言、投稿神马一个不能少 不断升级完善的模块与插件,灵活的组装与自定义设置,满足你的多样需求。 5、安装、升级、备份、转移一键完成 一键安装、一键升级、一键备份、一键转移。从此,让你的网站维护变得如此轻松。 6、顶级的配套服务 超级精美的模版库,精选国内性价比、速度、安全最佳的空间,让你远离挑选的烦恼。 DOYO通用建站系统系统功能: 1、功能频道:内容频道(强大自定义功能)、留言频道 2、插件模块:会员管理、广告管理、专题管理、评论管理、链接管理等 3、系统功能:静态HTML生成、自定义模板标签、附件清理、数据备份恢复 4、在线升级:一键自动在线安全补丁升级,免除维护烦恼 5、自定义字段:强大的自定义字段功能,可按栏目、频道添加各种输入字段,包括文本、数字、单选、多选、编辑器、单附件、多附件 6、SEO优化:独立的页面SEO信息设置,方便快捷 7、HTML静态:全站纯静态生成功能 8、附件检测:自动附件清理功能,一键清除未使用多余附件,保持系统纯净 9、高效缓存:全站高效缓存机制,运行飞速体验 10、模板代码生成器:自带模板调用生成器,零基础也能快速制作模板标签 11、全功能权限设定:分组机制管理权限设定,全功能全栏目均可指定管理权限 12、数据库操作:一键备份、一键恢复、一键转移空间,方便快捷       相关阅读 同类推荐:企业网站源码
DOYO通用建站系统采用PHP与MYSQL开发,是免费开源的CMS建站、企业建站系统,可广泛用于个人、企业、政府、机构等众多网站建设。DOYO通用建站系统 2.3 增加与完善功能如下:2014-04-251、支付、购物功能,其中包括:支付平台、购物车、虚拟商品、实物商品、内容商品、会员充值、订单、商品属性、虚拟货物自动发货、财务记录、会员级别优惠等功能。2、水印缩略强化,支持按栏目按字段指定缩略图大小设置。3、调整程序目录接口,开放修改后台入口及文件名。4、加入表单调用标签,可以在任意位置调用表单发布form5、自定义频道功能,可以自由增加自定义频道,独立数据表结构。6、自定义字段增加频道关联类型,可指定不同频道内容互相关联。7、loop、sql标签增加分页功能。8、html生成目录增加栏目目录标签9、优化远程图片自动获取功能,图片抓取更精准,优化验证码显示。10、调整会员登陆状态、评论为ajax刷新,实现静态化下的实时更新。11、优化html静态生成功能,建议开启curl函数,大幅提升生成效率。12、增加模板导入导出工具,同步备份现有模板及数据,方便模板安装转移和分享。13、增加模板附件(图片、样式表、js)目录,增强模板安全性。14、全新的会员权限机制,增加会员找回密码等功能。15、上传功能采用全新的DOYO原创图片上传插件,大幅提高上传效率及兼容性。16、更换编辑器为kindeditor17、增加系统安全密钥功能,对隐私数据进行加密处理,进一步提高安全性能18、其他多达50处细节功能优化调整,进一步提成兼容性、执行效率等。 特色: 1、架构轻盈,完全免费与开源 采用轻量MVC架构开发,兼顾效率与拓展性。全局高效缓存,打造飞速体验。 2、功能自由搭配,保证系统纯净 全插件机制,安装卸载全绿色操作,无残留,对系统臃肿零容忍,最小仅数百K。 3、让简洁与强大并存 强大字段自定义功能,完善的后台开关模块,不会编程也能搭建各类网站系统。 4、会员、留言、投稿神马一个不能少 不断升级完善的模块与插件,灵活的组装与自定义设置,满足你的多样需求。 5、安装、升级、备份、转移一键完成 一键安装、一键升级、一键备份、一键转移。从此,让你的网站维护变得如此轻松。 6、顶级的配套服务 超级精美的模版库,精选国内性价比、速度、安全最佳的空间,让你远离挑选的烦恼。 系统功能: 1、功能频道:内容频道(强大自定义功能)、产品频道(强大自定义功能)、交互(留言)频道,可以自由添加频道2、插件模块:支付管理、购物管理、会员管理、广告管理、专题管理、评论管理、链接管理等3、系统功能:静态HTML生成、自定义模板标签、附件清理、数据备份恢复4、在线升级:一键自动在线安全补丁升级,免除维护烦恼5、自定义字段:强大的自定义字段功能,可按栏目、频道添加各种输入字段,包括文本、数字、单选、多选、编辑器、单附件、多附件、频道关联,并可针对附件单独制定缩略图设置6、搜索引擎优化:独立的页面优化信息设置,方便快捷7、HTML静态:全站纯静态生成功能8、伪静态:全站伪静态功能,可自由指定伪静态规则9、附件检测:自动附件清理功能,一键清除未使用多余附件,保持系统纯净10、高效缓存:全站高效缓存机制,运行飞速体验11、模板代码生成器:自带模板调用生成器,零基础也能快速制作模板标签12、全功能权限设定:分组机制管理权限设定,全功能全栏目均可指定管理权限13、数据库操作:一键备份、一键恢复、一键转移空间,方便快捷
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值