WordPress 3.5.1 拒绝服务漏洞分析

2013-06-17 17:11:51 12 4106
首先原文地址 https://vndh.net/note:wordpress-351-denial-service  写的步骤比较跳   欢迎拍砖

首先看/wp-includes/post-template.php的post_password_required函数,看图

包含了 wp-includes/class-phpass.php
并且执行 CheckPassword()函数

CheckPassword()函数就在/wp-includes/class-phpass.php文件里,看图

执行 crypt_private()函数 ,还是在class-phpass.php文件里


重点来了, 标志1
$count_log2 = strpos($this->itoa64, $setting[3]);   //获取$setting[3]在$this->itoa64的位置
$setting参数来自 图2 CheckPassword()函数的$stored_hash,$stored_hash来自图1的$hash
$hash = stripslashes( $_COOKIE[ 'wp-postpass_' . COOKIEHASH ] ); 即设置cookie,cookie可控

说到这 $this->itoa64 是啥,看图

$this->itoa64 = './0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz';

图2 的标志2 是啥   $count = 1 << $count_log2;
看标志3 即知道$count是执行MD5的次数,  如果执行的次数比较大,大到上亿是不是就产生拒绝服务了呢,哈哈
怎么触发  ,标志1 中有限制
if ($count_log2 < 7 || $count_log2 > 30)
/* 124 */         return $output;
即在itoa64中出现的位置小于7或者大于30则退出,不会执行md5计算
我们只要设置$_COOKIE['wp-postpass_' . COOKIEHASH] = "$P$Spaddding"  ,$setting[3]即$P$Spaddding的第三个,从0开始就是'S'
S在itoa64正好处在第30个位置,绕过限制,执行MD5计算

$count_log2=30,$count = 1 << $count_log2; = 1<<30     //1左移30 就是  1000000...    1后面30个0
执行1000000000000000000000000....次MD5计算    产生拒绝服务

最后  为什么cookie设置成$P$前缀,因为

crypt_private()函数中
/* 119 */     if ($id != '$P$' && $id != '$H$')
/* 120 */         return $output;
不等于$P$即退出。

忘了说 设置cookie在 wp-login.php文件中

action=postpass  。。。

发现写的很乱  欢迎拍砖。 http://t.qq.com/fake_wang

关于作者

fakes4篇文章32篇回复

评论12次

要评论?请先  登录  或  注册