WooYun-2014-79041:Supesite 前台注入 #2 (Insert)

漏洞作者: ′雨。认证白帽子

来源:http://www.wooyun.org/bugs/wooyun-2014-079041

简要描述

Insert 无视GPC 装supesite会有ucenter 如果在一个裤的话 可以尝试把uckey注入出来 然后……

详细说明

来看看全局文件

if(!(get_magic_quotes_gpc())) {

    $_GET = saddslashes($_GET);

    $_POST = saddslashes($_POST);

    $_COOKIE = saddslashes($_COOKIE);

}

判断gpc 是否开启 如果没有开启 就对get post cookie 转义

这里没有对files转义。


在batch.upload.php中

elseif (!empty($_POST)) { //如果POST不为空

    //编辑标题

    if(!empty($_GET['editaid']) && $editaid = intval($_GET['editaid'])) {

        $editsubject = cutstr(trim(shtmlspecialchars($_POST['editsubject'])), 50);

        updatetable('attachments', array('subject'=>$editsubject), array('aid'=>$editaid));

        print <<<END

        <script language="javascript">

        var div = parent.document.getElementById("div_upload_" + $editaid);

        var pf = parent.document.getElementById("phpframe");

        pf.src = "about:blank";

        div.innerHTML = "$editsubject";

        </script>

END;

        exit;

    }

    //上传文件

    //上传模式

    $mode = intval(postget('mode')); 

    if($mode>3) exit; //mode 直接让他为空

    $hash = trim(preg_replace("/[^a-z0-9\-\_]/i", '', trim($_POST['hash'])));

    if(strlen($hash) != 16) showresult($blang['unable_to_complete_this_craft']);//这里只判断hash的长度为不为16 没有进一步的验证 那么就让hash为1111111111111111

    //个数

    $filecount = 1;

    $query = $_SGLOBAL['db']->query('SELECT COUNT(*) FROM '.tname('attachments').' WHERE hash=\''.$hash.'\'');

    $count = $_SGLOBAL['db']->result($query, 0);

    $allowmax = intval($_POST['uploadallowmax']);

    if($allowmax > 0 && $count + $filecount > $allowmax) showresult($blang['the_number_has_reached_maximum']);

    //类型

    $allowtypearr = getallowtype(trim($_POST['uploadallowtype']));//取得上传的类型

    //空间

    $attachsize = 0;

    include_once(S_ROOT.'./function/upload.func.php');

    if(empty($mode)) { //让$mode为空即可

        //本地上传

        //检查

        $filearr = $_FILES['localfile'];//获取files

        if(empty($filearr['size']) || empty($filearr['tmp_name'])) showresult($blang['failure_to_obtain_upload_file_size']);

        $fileext = fileext($filearr['name']);//获取后缀

        if(!empty($allowtypearr)) {

            if(empty($allowtypearr[$fileext])) showresult($blang['upload_not_allow_this_type_of_resources']." ($allowtype_ext)");

            if($filearr['size'] > $allowtypearr[$fileext]['maxsize']) showresult($blang['file_size_exceeded_the_permissible_scope']);

        }

        //缩略图

        if(!empty($_POST['uploadthumb0']) && !empty($_SCONFIG['thumbarray'][$_POST['uploadthumb0']])) {

            $thumbarr = $_SCONFIG['thumbarray'][$_POST['uploadthumb0']];

        } else {

            $thumbarr = array($_POST['thumbwidth'], $_POST['thumbheight']);

        }

        //上传

        $newfilearr = savelocalfile($filearr, $thumbarr);

        if(empty($newfilearr['file'])) showresult($blang['uploading_files_failure']);

        //数据库

        if(empty($_POST['uploadsubject0'])) $_POST['uploadsubject0'] = cutstr(filemain($filearr['name']), 50);

//下面就带入到insert当中啦

        $insertsqlarr = array(

            'uid' => $uid,

            'dateline' => $_SGLOBAL['timestamp'],

            'filename' => saddslashes($filearr['name']),//对文件的名字转义

            'subject' => trim(shtmlspecialchars($_POST['uploadsubject0'])),

            'attachtype' => $fileext,//这里没有对文件的后缀转义

            'isimage' => (in_array($fileext, array('jpg','jpeg','gif','png'))?1:0),

            'size' => $filearr['size'],

            'filepath' => $newfilearr['file'],

            'thumbpath' => $newfilearr['thumb'],

            'hash' => $hash

        );

        inserttable('attachments', $insertsqlarr)//insert;

'filename' => saddslashes($filearr['name']) 在查询的时候名字被转义了

'attachtype' => $fileext 来看一下$fileext

$fileext = fileext($filearr['name']);

function fileext($filename) {

    return strtolower(trim(substr(strrchr($filename, '.'), 1)));

}

获取点以后的 没做转义 所以可以在后缀这进行注入了。

可以看到 名字被转义 后缀那成功引入单引号

出数据

漏洞证明

修复方案

转义之