网站地图    收藏   

主页 > 后端 > 网站安全 >

ThinkSNS 2.8任意文件上传漏洞及修复 - 网站安全

来源:自学PHP网    时间:2015-04-17 12:00 作者: 阅读:

[导读] 微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。\api\StatusesApi.class.phpfunction uploadpic(){ if( $_FILES[#39;pic#39;] ){ //执行上传操作 $savePath = $this-_getS......

微博上传图片时只在前端进行验证, 服务器端没有进行安全过滤。
 
\api\StatusesApi.class.php
 
function uploadpic(){
      if( $_FILES['pic'] ){
    //执行上传操作
    $savePath =  $this->_getSaveTempPath();
    $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
       {
        $result['boolen']    = 1;
        $result['type_data'] = 'temp/'.$filename;
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
       } else {
        $result['boolen']    = 0;
        $result['message']   = '上传失败';
       }
    }else{
        $result['boolen']    = 0;
        $result['message']   = '上传失败';
    }
return $result;
    }
unloadpic()方法没有对文件类型进行验证
 
可以构建表单, 选择任意文件, 提交到
/index.php?app=w3g&mod=Index&act=doPost
 
在新提交的微博上可以找到上传的文件地址(去掉small_、middle_ 前缀)


在登录thinksns官方微博后,
构建以下表单:
 
<form action="http://t.thinksns.com/index.php?app=w3g&mod=Index&act=doPost" method="post" enctype="multipart/form-data" />
<textarea name="content">test</textarea>
file: <input id="file" type="file" name="pic" />
<input type="submit" value="Post" />
</form> www.2cto.com
去掉缩略图的前缀(small_ )
 
 
 
 
修复方案:

\api\StatusesApi.class.php
 
function uploadpic(){
    /**
    * 20121018 @yelo
    * 增加上传类型验证
    */
    $pathinfo = pathinfo($_FILES['pic']['name']);
    $ext = $pathinfo['extension'];
    $allowExts = array('jpg', 'png', 'gif', 'jpeg');
 
    $uploadCondition = $_FILES['pic'] && in_array(strtolower($ext),$allowExts,true);
 
    if( $uploadCondition ){
    //执行上传操作
    $savePath =  $this->_getSaveTempPath();
    $filename = md5( time().'teste' ).'.'.substr($_FILES['pic']['name'],strpos($_FILES['pic']['name'],'.')+1);
    if(@copy($_FILES['pic']['tmp_name'], $savePath.'/'.$filename) || @move_uploaded_file($_FILES['pic']['tmp_name'], $savePath.'/'.$filename))
       {
        $result['boolen']    = 1;
        $result['type_data'] = 'temp/'.$filename;
        $result['picurl']    = SITE_PATH.'/uploads/temp/'.$filename;
       } else {
        $result['boolen']    = 0;
        $result['message']   = '上传失败';
       }
    }else{
        $result['boolen']    = 0;
        $result['message']   = '上传失败';
    }
return $result;
    }

自学PHP网专注网站建设学习,PHP程序学习,平面设计学习,以及操作系统学习

京ICP备14009008号-1@版权所有www.zixuephp.com

网站声明:本站所有视频,教程都由网友上传,站长收集和分享给大家学习使用,如由牵扯版权问题请联系站长邮箱904561283@qq.com

添加评论