yxcms一个二次注入分析
文章目錄
漏洞来源:http://huakai.paxmac.org/?p=751
分析版本1.2.6
/protected/apps/member/controller/photoController.php
添加图集的时候,public function add() 中$data[‘sort’]=$_POST[‘sort’];post的sort变量进入数据data中,之后插入了数据库if(model(‘photo’)->insert($data))。
添加图集执行的sql如下:
2014/10/22 16:08 INSERT INTO yx_photo (`account`,`sort`,`exsort`,`title`,`keywords`,`picture`,`description`,`content`,`method`,`tpcontent`,`ispass`,`recmd`,`hits`,`norder`,`addtime`,`photolist`,`conlist`) VALUES ('yx_test',',000000,100002\'','','11111111111\\\'','11111111111\\\'','array(1) { [\"Filedata\"]=> array(5) { [\"name\"]=> string(12) \"Penguins.jpg\" [\"type\"]=> string(24) \"application/octet-stream\" [\"tmp_name\"]=> string(47) \"C:\\Users\\pentest\\AppData\\Local\\Temp\\phpB93C.tmp\" [\"error\"]=> int(0) [\"size\"]=> int(777835) }}1410220407112004315418.jpg ','11111111111\\\'','11111111111\\\'','photo/content','photo_content','0','0','0','0','1413965310','array(1) {\r\n [','')
这里可以看到由于yxcms一些防御策略的缺陷,进行了两次转义,插入了数据库。根据前辈的分析,验证发现sql报错。
这里一开始不知道怎么定位分析这个问题。通过一番尝试发现整个的思路可以是这样的。分析添加图集的函数发现sort直接进入了数据库。然后搜索
model\(\'photo\'\)[\s\S]+\['sort'\]
根据yxcms的编码特点,一个文件中进行了photo表的数据库操作,并且该文件中含有sort字符串,匹配的结果就只有两条,基本就可以定位到这个问题了。只是一个猜测~~
跟进到columncontroller的content函数,跟到photocon函数里。
$sortid=substr($info['sort'],-6,6);
$tabid=model('sort')->find("id='{$sortid}'",'extendid');
substr函数反回字符串的子串:
<?php
$rest = substr("abcdef", -1); // 返回 "f"
$rest = substr("abcdef", -2); // 返回 "ef"
$rest = substr("abcdef", -3, 1); // 返回 "d"
?>
所以上面这个点限制了字符串的长度,到270行看到下面的代码:
//获取拓展数据结束
$topsort=substr($info['sort'],0,14); //获取顶级类
$upnews=model('photo')->find("ispass='1' AND id>'$id' AND sort like '{$topsort}%'",'id,title,method','id ASC',1);//上一篇
$downnews=model('photo')->find("ispass='1' AND id<'$id' AND sort like '{$topsort}%'",'id,title,method','id DESC',1);//下一篇
$crumbs=$this->crumbs($info['sort']);//面包屑导航
跟进crumbs函数:
protected function crumbs($path=',000000')
{
$crumb=array();
if(strlen($path)>7){
$ids=substr($path,8);
$crumb=model('sort')->select("id IN($ids)",'id,type,name,ename,method,url,extendid','deep');
foreach ($crumb as $key=>$vo){
$crumb[$key]['url']=getURl($vo['type'],$vo['method'],$vo['url'],$vo['id'],$vo['extendid'],$vo['ename']);
}
}
return $crumb;
}
这里$ids也没有加单引号。
通过黑盒的方式测试出字段3会回显,获得数据库版本的信息。