[投稿]WordPress cookie伪造漏洞详细分析及exp

0x00前言

本文分析的是wordpress3.8.2更新修复的cookie伪造漏洞(CVE -2014- 0166),并给出对应exp。

根据描述WordPress before 3.7.2 and 3.8.x before 3.8.2 都是受影响的,

本地安装wordpress 3.8.1进行测试。

0x01漏洞分析知识准备

登陆wordpress后台后查看cookie

其中

我们分析下这个cookie的结构

其中cookie名wordpress_bbfa5b726c6b7a9cf3cda9370be3ee91

是 wordpress_md5(siteurl) siteurl为wordpress路径

我的siteurl为 http://localhost/wordpress

Md5后为BBFA5B726C6B7A9CF3CDA9370BE3EE91

再看这个cookie的值

格式为$username|$expiration|$hmac

$username 为用户名

$expiration为cookie有效期

$hamc为登陆成功后服务端赋予客户端的hash

验证过程在wp-includes/pluggable.php 543-549行

$username,expiration从cookie中取得

从 $username,$pass_frag,$expiration,$scheme中计算中$key。

再用$username,$expiration,$key中计算出hash

对比是否与cookie中的$hmac 一致则给予登陆

为了验证我们上面的分析是否正确

我们将上面代码改成

即运行到此时 将所有我们好奇的变量打印出来

输出结果:

我们的分析是正确的!

0X02漏洞原理

对比wordpress3.8.2的修复代码

将!=修改成!==

这便是产生漏洞的地方了

php手册说明如上

==为非严格比较,会进行类型转换后比对

==则要求两个变量类型相同

以上是手册给出的例子

1e2为科学计数法,==运算符中 经过类型转换 是被视为与100相等的。

再回到wordpress上

这个认证cookie中,我们若固定$username的值不变,$hmac固定为0,不断更改$expiration的值,使得

的值不断改变

一旦$hash的值变为科学计数法表示的0如0e+30位0-9任意数字,即可验证通过。

32位下 科学计数法表示0,总共更有:

10^0+10^1+……10^30种情况

而32位md5总共有:

16^32种情况

故攻击成功的概率为:

(10^0+10^1+……10^30)/16^32

约三亿分之一的概率  拼人品了

0x03exp

根据以上分析,我们便可以写出exp了。

 

赏金发放情况:本文获得赏金150RMB,已于4.25日发放到作者账号。

征稿启事:91RI一直相信“你不与人分享,谁与你分享”, 分享的确是件非常有意义的事情。为了让优秀的同学有 地方分享自己的独到见解,也为了让更多同学从分享中受益,同时我们也希望给那些愿意分享的小伙伴们一点点心意作为感谢,所以我们隆重了推出“有奖征文”活 动!本次活动的详情可以围观《征稿启事