加入收藏 | 设为首页 | 会员中心 | 我要投稿 应用网_丽江站长网 (http://www.0888zz.com/)- 科技、建站、数据工具、云上网络、机器学习!
当前位置: 首页 > 服务器 > 安全 > 正文

Phpcms v9漏洞解析

发布时间:2022-05-18 10:07:15 所属栏目:安全 来源:互联网
导读:最近研究源码审计相关知识,会抓起以前开源的CMS漏洞进行研究,昨天偶然看见了这个PHPCMS的漏洞,就准备分析研究一番,最开始本来想直接从源头对代码进行静态分析,但是发现本身对PHPCMS架构不是很熟悉,导致很难定位代码的位置,***就采用动态调试静态分析
        最近研究源码审计相关知识,会抓起以前开源的CMS漏洞进行研究,昨天偶然看见了这个PHPCMS的漏洞,就准备分析研究一番,最开始本来想直接从源头对代码进行静态分析,但是发现本身对PHPCMS架构不是很熟悉,导致很难定位代码的位置,***就采用动态调试&静态分析的方式对漏洞的触发进行分析,下面进入正题。
 
1. 漏洞触发代码定位
 
        通过漏洞的POC(/phpcms/index.php?m=member&c=index&a=register&siteid=1 )判断,漏洞触发点的入口位于/phpcms/modules/member/index.php文件中的register()方法中,在代码中插入一些echo函数,观察输出(见下)的变化。从下面的结果变化可知,img标签的src属性是在执行完下面的get()函数:
 
        复制
$user_model_info = $member_input->get($_POST['info'])
1.
后发生变化,因此基本可以确定,漏洞的触发点就是位于这个函数中。
 
屏幕快照 2017-04-12 下午2.59.37.png
 
屏幕快照 2017-04-12 下午3.02.04.png
 
2. 定位member_input->get()跟进分析
 
跟进该函数,该函数位于/phpcms/modules/member/fields/member_input.class.php文件中,此处本来还想故技重施,在该方法中对代码进行插桩,但是发现插桩后的居然无法打印到页面上,没辙(原因望各位大神指点一二),只能对代码进行一行行推敲,先把代码贴上,方便分析:
 
复制
function get($data) {
    $this->data = $data = trim_script($data);
    $model_cache = getcache('member_model', 'commons');
    $this->db->table_name = $this->db_pre.$model_cache[$this->modelid]['tablename'];
    $info = array();
    $debar_filed = array('catid','title','style','thumb','status','islink','description');
    if(is_array($data)) {
        foreach($data as $field=>$value) {
            if($data['islink']==1 && !in_array($field,$debar_filed)) continue;
            $field = safe_replace($field);
            $name = $this->fields[$field]['name'];
            $minlength = $this->fields[$field]['minlength'];
            $maxlength = $this->fields[$field]['maxlength'];
            $pattern = $this->fields[$field]['pattern'];
            $errortips = $this->fields[$field]['errortips'];
            if(empty($errortips)) $errortips = "$name 不符合要求!";
            $length = empty($value) ? 0 : strlen($value);
            if($minlength && $length < $minlength && !$isimport) showmessage("$name 不得少于 $minlength 个字符!");
            if (!array_key_exists($field, $this->fields)) showmessage('模型中不存在'.$field.'字段');
            if($maxlength && $length > $maxlength && !$isimport) {
                showmessage("$name 不得超过 $maxlength 个字符!");
            } else {
                str_cut($value, $maxlength);
            }
            if($pattern && $length && !preg_match($pattern, $value) && !$isimport) showmessage($errortips);
                        if($this->fields[$field]['isunique'] && $this->db->get_one(array($field=>$value),$field) && ROUTE_A != 'edit') showmessage("$name 的值不得重复!");
            $func = $this->fields[$field]['formtype'];
            if(method_exists($this, $func)) $value = $this->$func($field, $value);
 
            $info[$field] = $value;
        }
    }
    return $info;
 
代码整体比较容易,可能比较难理解的就是$this->fields这个参数,这个参数是初始化类member_input是插入的,这个参数分析起来比较繁琐,主要是对PHPCMS架构不熟,那就在此走点捷径吧,在1中,直接将初始化完成后的member_input类dump出来,效果还不错,所有的参数都dump到页面上了,下面主要摘取比较重要的$this->fields[$field],即:【$this->fields["content"]】这个参数。

(编辑:应用网_丽江站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读