poscms v3.2.0新版上传shell绕过
首页 > web安全 > 代码审计    作者:webbaozi   2018年10月20日 15:51 星期六   热度:173°   已自动提交收录  
时间:2018-10-20 15:51   热度:173° 

poscms v3.2.0前台无限制getshell
https://bbs.ichunqiu.com/forum.php?mod=viewthread&tid=46060&extra=&highlight=poscms&page=1
新版加入了下面代码进行二次判断

foreach (array( 'php', 'asp', 'jsp', 'aspx', 'exe', 'sh', 'phtml') as $t) {
            if (strpos($ext, $t) === 0) {
                $this->set_error('文件禁止上传', 'debug');
                return FALSE;
            }
        }

绕过方法如下:
在文件diy\module\member\controllers\Api.php
进入do_upload函数

if ($this->upload->do_upload('Filedata')) {
                $info = $this->upload->data();
                $site = (int)$this->input->post('siteid');
                $this->load->model('attachment_model');
                $this->attachment_model->siteid = $site ? $site : SITE_ID;
                $result = $this->attachment_model->upload($uid, $info);
                !is_array($result) && exit('0,'.$result);
                list($id, $file, $_ext) = $result;

跟进do_upload函数
在文件diy\dayrui\libraries\Upload.php文件中
在此文件中进行跟踪调试,会执行如下代码
$this->file_name = $this->_CI->security->sanitize_filename($this->file_name);
跟进sanitize_filename函数
在文件diy\system\core\Security.php文件中

public function sanitize_filename($str, $relative_path = FALSE)
    {
        $bad = $this->filename_bad_chars;

        if ( ! $relative_path)
        {
            $bad[] = './';
            $bad[] = '/';
        }

        $str = remove_invisible_characters($str, FALSE);

        do
        {
            $old = $str;
            $str = str_replace($bad, '', $str);
        }
        while ($old !== $str);

        return stripslashes($str);
    }

查看filename_bad_chars的值

public $filename_bad_chars =    array(
        '../', '<!--', '-->', '<', '>',
        "'", '"', '&', '$', '#',
        '{', '}', '[', ']', '=',
        ';', '?', '%20', '%22',
        '%3c',        // <
        '%253c',    // <
        '%3e',        // >
        '%0e',        // >
        '%28',        // (
        '%29',        // )
        '%2528',    // (
        '%26',        // &
        '%24',        // $
        '%3f',        // ?
        '%3b',        // ;
        '%3d'        // =
    );

$str = str_replace($bad, '', $str);

这段代码非常nice,只要在php中间插入上述字符,即可绕过下面这段代码

foreach (array( 'php', 'asp', 'jsp', 'aspx', 'exe', 'sh', 'phtml') as $t) {
            if (strpos($ext, $t) === 0) {
                $this->set_error('文件禁止上传', 'debug');
                return FALSE;
            }
        }

构造如下:

访问shell地址:

二维码加载中...
本文作者:webbaozi      文章标题: poscms v3.2.0新版上传shell绕过
本文地址:http://www.webbaozi.com/dmsj/103.html
版权声明:若无注明,本文皆为“baozi|学与用”原创,转载请保留文章出处。

返回顶部    首页    手机版本   
版权所有:baozi|学与用    站长: webbaozi  蜀ICP备16032848号-1