漏洞概要
关注数(24)
关注此漏洞
漏洞标题:phpok前台任意文件上传getshell(官网已shell)
提交时间:2014-06-02 13:54
修复时间:2014-07-17 15:29
公开时间:2014-07-17 15:29
漏洞类型:文件上传导致任意代码执行
危害等级:高
自评Rank:20
漏洞状态:厂商已经确认
Tags标签:
无
漏洞详情
披露状态:
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行:
调用了upload_base,跟进去看看:
调用了$this->upload来上传文件。继续跟进去看看:
仔细观察最后两个if语句,第一个是copy,第二个才是判断后缀名。也就是说它先把我上传的任意文件copy到web目录下,再判断了这个文件后缀是否合法。而且判断完毕后并没有删除不合法的文件。
所以我们可以利用这一点来上传任意文件,虽然最后我不知道上传后的文件名,但这个文件名是可以爆破出来的。
文件名命名规则:substr(md5(time().rand(0,9999)),9,16)
取当前时间 和 0-9999之前的随机数的md5值。这个好说,当前时间基本就在发包以后的1~3秒,4位随机数。也就说我只用爆破大概1W到3W次就能找到我上传的文件了。
漏洞证明:
本地构造一个上传单页:
拉一个shell点击上传。中途抓包,查看返回包:
可以看到返回包的时间,这个时间基本上就是生成文件名的时候取的time()。
通过返回包里的Date计算出此时的时间戳,也就是重命名时候取的time()值(就算不是,相差也不会太大,一两秒内)
我计算出的时间戳值为1401619111
然后我简单写一个单线程脚本(py需要安装requests库),来跑一下数据包。上传的文件默认放在/res目录下,我们就来爆破一下这个文件名:
因为是本地,所以很快就跑出了shell的地址:
访问可见phpinfo:
危害性证明:
官网shell地址,也是我跑出来的,运气比较好,随机数比较小,跑了一分钟就出来了
http://www.phpok.com/res/49d39bf998b3e28e.php
修复方案:
漏洞回应
厂商回应:
危害等级:高
漏洞Rank:20
确认时间:2014-06-03 10:14
厂商回复:
感谢您的意见,我真心没有想到有这么严重问题。我们正在努力处理
最新状态:
暂无