漏洞概要 关注数(24) 关注此漏洞
缺陷编号:wooyun-2014-066138
漏洞标题:phpcms最新版绕过全局防御暴力注入(官网演示)
相关厂商:phpcms
漏洞作者: 索马里的海贼
提交时间:2014-06-25 08:23
修复时间:2014-09-20 08:24
公开时间:2014-09-20 08:24
漏洞类型:设计缺陷/逻辑错误
危害等级:高
自评Rank:20
漏洞状态:漏洞已经通知厂商但是厂商忽略漏洞
漏洞来源: http://www.wooyun.org,如有疑问或需要帮助请联系 [email protected]
Tags标签: 无
漏洞详情
披露状态:
2014-06-25: 细节已通知厂商并且等待厂商处理中
2014-06-30: 厂商主动忽略漏洞,细节向第三方安全合作伙伴开放
2014-08-24: 细节向核心白帽子及相关领域专家公开
2014-09-03: 细节向普通白帽子公开
2014-09-13: 细节向实习白帽子公开
2014-09-20: 细节向公众公开
简要描述:
加解密函数缺陷第三发,注入演示
版本20140522
无视全局防御
搬个沙发吧。。这个比destoon那个要麻烦多了。。。
详细说明:
先从函数说起
phpcms/libs/functions/global.func.php行335
这里用的其实是简化版的经典加密函数auth_code由DZ开始广泛用于各类cms
这里去掉了密钥簿的生成和转换 直接用kaya和keyc组合md5之后的值keyd作为密钥簿然后与原始文本处理后的数据进行异或。
讲加密过程有点绕,我也没有刺总的口才能把这个函数说那么细,反正这里知道一点就够了
如果知道原始文本和加密后的文本,而且原始文本的长度够长(准确说是明文内容的长度大于32*2-10-16=38位),是可以逆推出keyd的。
在这个函数中,keyc 就是IV(初始化向量), ckey_length 就是IV的长度:4。keyc影响到每次加密的xor key(也就是keyd)。这里先说这么多,先来看看phpcms的问题
/phpcms/modules/memeber/index.php行176
在注册过程中 如果后台配置了需要邮件认证,那么就会进入这个if生成一串校验值发往注册的邮箱。
这个auth_key其实就是核心加密key,这里居然把md5后的核心key作为参数的一部分写入激活链接发到用户邮箱了。如果能够解开激活链接中的这个code值,我们就可以得到加密key从而任意生成加密串了。参数$code生成方式为
sys_auth()用的密钥为md5('auth_key');
收到邮件中的链接如下
code值为d104CAgCBwZUAVYFVVIBAAVVVwldAAYEXQoNUQAKSFECWgAIAApUUlZUUQJTUlZRAA9UAQFRDABWX10FVVtV
前4位为keyc 这里是"d104"
如果我们能找到另外一处明文和密文都可知 且可以多次用同一明文获取密文的位置 就能通过遍历找出相同的keyc,当keyc相同时 xor key也相同,所以我们就能用前面说方法逆推出keyd来解密出code的内容。
首先是找到一处同样用md5(pc_base::load_config('system', 'auth_key'))作为密钥,且我们可以同时知道明文和密文的地方。
/phpcms/modules/content/down.php 行76
当我们把user-agent置空的时候
$pc_auth_key正好就是我们需要的
加密的字符串为
$i就是下载的id 从页面可以获得$d是downloadtype 一般是1 $s空 $t是时间。可以从http头获取到$ip可知 $m为1 $f是下载文件的url 这里长度肯定超过38了。
先来获取邮件中的code,为了增加碰撞的概率 这里用多个邮箱多次获取了激活链接并收集激活链接中参数code的前4位(IV)记录下来。
先来写一个小脚本来碰撞IV
简单说一下脚本
第一段地址来自http://www.phpcms.cn/index.php?m=content&c=index&a=show&catid=19&id=51中的下载链接
code来自上一步的收集
脚本会不停请求页面并收集下载链接,当iv碰撞成功时停止脚本并输出原始下载链接
运气不错,1000多次请求就碰撞成功了
7763VFRVVlMAVQEJB1MGAgYFUwIPVlQDBlcEB1ALCgVVRFRZVEMVXhYRDAgDAFBVBAdUDQESCEIKV1dXHVMPA0pTBVZKVFdUFggMCBFWXgtCRhMPGBsFXUAICg1SBhlADBJTCRdLBQ0fEwgWDh5WTEZaE1ZaRz5EDkhTTAU9YmQiWh4eDRVADl8BVFVeVF5Q
去掉前面的IV 7763 填入exp中来计算keyb
注意图中的key 前面有10位的0和16位的1 正常流程中 前10位是时间戳后面16位是数据完整性校验的MD5,这里我们没法知道 所以用0和1来填充,因为是按位异或的所以前面有点错没关系。只要后面可以确认的数据段足够长 就能还原出正确的keyd
如图跑完后得到的数据为
按32位长度分段得到
可以看到前面两段都有点不一样 后面两段就相同了 因为后面两段是明确的明文。
到这里已经拿到了IV是7763时的keyd:ddefc0e1970cc62c574a27ffb3b70db0
我们来拿这个keyd解密一下邮箱中的激活链接试试
找到7763开头的激活链接
去掉开头4位IV 将绿色部分写入exp
keyd为上一步获得的ddefc0e1970cc62c574a27ffb3b70db0
成功解开了,这里|后面的就是我们朝思暮想的
md5(pc_base::load_config('system','auth_key'))了
漏洞证明:
拿到这个key之后就能干很多事了。这里以一个简单的注入来证明一下
/api/add_favorite.php行26
userid来自cookie cookie是加密过的 所以无视GPC 无视任何防御
使用上一步得到的key来生成exp
将生成的验证串填入cookie xxxx_auth中并访问
http://www.phpcms.cn/api.php?op=add_favorite&title=asdf&url=asdf
页面直接返回错误信息爆出版本号
修复方案:
你们比我专业
版权声明:转载请注明来源 索马里的海贼@乌云
漏洞回应
厂商回应:
危害等级:无影响厂商忽略
忽略时间:2014-09-20 08:24
厂商回复:
漏洞Rank:20 (WooYun评价)
最新状态:
暂无