文章目錄

漏洞来源: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报错。
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也没有加单引号。

sql

通过黑盒的方式测试出字段3会回显,获得数据库版本的信息。

sql

文章目錄