分析 WordPress 3.8.2 修復的cookie偽造漏洞

4月8日,wordpress發布了一個重要更新,在該次更新中,修復了一系列安全漏洞。其中最顯眼的就是cookie伪造漏洞(CVE -2014- 0166)。

我們來看修補的代碼:

$key = wp_hash($username . $pass_frag . '|' . $expiration, $scheme);
$hash = hash_hmac('md5', $username . '|' . $expiration, $key);
- if ( $hmac != $hash ) { 
+  if ( hash_hmac( 'md5', $hmac, $key ) !== hash_hmac( 'md5', $hash, $key ) ) {

前日嘗試分析該漏洞,奈何知識匱乏,對php特性不夠了解,一連用了幾個小時都想不出。想不通為何加了一次hash_hmac就可以修復漏洞。當時的我以為是涉及到了加密算法上的一些問題,就放棄了。

今日突然看到一篇文章,頓悟是comparision operator的問題。其實之前也有注意到 “!=” 與 “!==” 這兩個符號的不同,不過大致想了一下沒想到利用的可能,就把重點放在了hash_hmac上。也許這是wordpress的障眼法?呵呵,說笑。

我們把全部的關注點放到 “!=” 與 “!==” 上來:

我們知道php比較相等性的運算符有兩種,一種是strict,一種是non-strict。php manual中是這樣定義的:

"==="和"!=="即strict比較符,只有在類型相同時才相等。"=="和"!="即non-strict比較符,會在類型轉換後進行比較。

再看php manual中給出的例子:

<?php
var_dump(0 == "a"); // 0 == 0 -> true
var_dump("1" == "01"); // 1 == 1 -> true
var_dump("10" == "1e1"); // 10 == 10 -> true
var_dump(100 == "1e2"); // 100 == 100 -> true
?>

字符串在與數字比較前會自動轉換為數字,所以0=="a"了。

另外兩個字符串比較,如果兩個都是數字形式,則同時轉換為數字進行比較,所以"1"=="01"。

這時你要問了,wordpress的代碼中是將cookie中的hash和真實hash這兩個hash的字符串進行比較,和這個有什麼關係呢?

我們注意上面"10"=="1e1"這個例子,php智能的將科學計數形式的字符串轉換為對應數字(1e1 = 1*10^1 = 1)。兩個不同的字符居然相等了,不知到這裡你是否得到了啟示?

好吧,來一個明顯的,你一定會恍然大悟:

var_dump("0e123456789012345678901234567890"==="0") //false
var_dump("0e123456789012345678901234567890"=="0") //true

當hash以"0exxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx"之類的形式出現時,與"0"相等。

讓我們回到wordpress的驗證代碼上來。先生成根據用戶名($username)、密碼($pass_frag)、cookie有效期($expiration)、wp-config.php中的key($key)四個信息計算出對應的$hash (算法很簡單,不細說), 然後用cookie中取得的$hmac值與之進行比較($hmac != $hash ?),從而驗證cookie有效性。

另外提下,cookie的格式是這樣的:wordpress_hashofurl=username|expiration|hmac

我們能控制的變量有$username和$expiration,其中$username需要固定。於是我們可以通過控制cookie中的$expiration去改變$hash的值,然後將cookie中的$hmac設置為0

只要不斷改變$expiration,直到滿足$hash=="0"的$hash出現,就成功偽造了有效的cookie。

當然,通過粗略的數學概率運算即可推知,滿足條件的hash出現概率非常之低:

P = Sum(10^n,n=0,30)/16^32 = 3.26526*10^-9

接近三億個請求才有一個可碰上的概率,嗚嗚~

但是,相信我,天長日久、海枯石爛的付出終歸是會有結果的。

有時看人品,人品好的很快就碰到了,人品不好的就如我,幾乎五億了:

怎麼樣,少年,寫一個多線程腳本跑起?

跑哪個站呢?當然freebuf啦(至發帖時尚未更新至3.8.2)

小编:感谢Ettack提醒,freebuf已第一时间修复了漏洞。

原文发布于微信公众号 - FreeBuf(freebuf)

原文发表时间:2014-04-13

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏吉浦迅科技

微软新一代瀏覽器「斯巴達」将支持GPU

由互聯網開始盛行時,一直由 Netscape 及 Internet Explorer (IE) 兩個瀏覽器主導整個瀏覽器市場,其後 Google Cho...

359150
来自专栏小狼的世界

推荐给开发和设计人员的iPad应用

葫芦瓢送了一部iPad,把玩几天后,不管是从iTunes商店的推荐,还是各种应用推荐软件的列表中,没有找到特别好的应用。还是利用搜索引擎,找到了一些对开发人员...

21120
来自专栏吉浦迅科技

NVIDIA Tegra X1 移動處理器

NVIDIA 5 日發佈推出最新移動處理器 - Tegra X1 ,其主要針對各種移動裝置及車載裝置設計,上代 Tegra K1 亦受到多間廠商青睞,...

34870
来自专栏黑泽君的专栏

壁挂式空调漏水怎么办?如何解决?

一:安装不牢固:室内机安装膨胀螺丝未打稳,安装不牢固影响平衡,导致排水管引出一侧位置偏高,造成排水困难,从而发生空调机机体滴水现象。

38740
来自专栏吉浦迅科技

辣眼睛,看别人如何用Jetson TX1花式逗猫!

如果你最近在阅读人工智能(artificial intelligence,简称AI)、深度学习(deep learning)和神经网络(neural netwo...

31150
来自专栏进击的程序猿

英语语法常见缩写常用缩写英文单词五种基本句型

13810
来自专栏hotqin888的专栏

golang知识图谱NLP实战第二节——解析依存句法分析结果

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/hotqin888/article/det...

28940
来自专栏大数据挖掘DT机器学习

用python做NLP:中文文本预处理

一 得到原始文本内容 def FileRead(self,filePath): f = open(filePath) raw=f.r...

68750
来自专栏疯狂的小程序

微信小程序「学科排名」发布了

前几天,教育部公布了《全国第四轮学科评估结果》,在手机上看起来不太方便,于是本人就“撸起袖子加油干”,写了一套脚本把数据收集了一下,做成了微信小程序,叫「学科排...

27790
来自专栏练小习的专栏

搞来两端模拟自由落体与抛物运动的JS玩

这里有更详细的讲解呵呵 http://www.cnblogs.com/cloudgamer/archive/2009/01/06/Tween.html 自由...

23180

扫码关注云+社区

领取腾讯云代金券