天天躁日日躁狠狠躁AV麻豆-天天躁人人躁人人躁狂躁-天天澡夜夜澡人人澡-天天影视香色欲综合网-国产成人女人在线视频观看-国产成人女人视频在线观看

解析PHP強(qiáng)制轉(zhuǎn)換類(lèi)型及遠(yuǎn)程管理插件的安全隱患

遠(yuǎn)程管理插件是目前廣受WordPress站點(diǎn)管理員歡迎的實(shí)用工具,它允許用戶(hù)同時(shí)對(duì)多個(gè)站點(diǎn)執(zhí)行相同的操作,如更新到最新的發(fā)行版或安裝插件等。但是,為了實(shí)現(xiàn)這些操作,客戶(hù)端插件需要賦予遠(yuǎn)程用戶(hù)很大的權(quán)限。因此,確保管理服務(wù)器和客戶(hù)端插件之間的通信安全且不能被攻擊者偽造就變得相當(dāng)重要了。本文淺析幾款可用插件,利用其弱點(diǎn),攻擊者甚至可以完全危及到運(yùn)行這些插件的站點(diǎn)本身。

ManageWP, InfiniteWP, and CMS Commander

這三個(gè)服務(wù)有著相同的客戶(hù)端插件基礎(chǔ)代碼(目測(cè)最初是ManageWp實(shí)現(xiàn),然后另外兩個(gè)對(duì)其進(jìn)行了調(diào)整),因而它們都有簽名繞過(guò)漏洞并且會(huì)導(dǎo)致遠(yuǎn)程代碼執(zhí)行。

管理服務(wù)器注冊(cè)一個(gè)客戶(hù)端插件的私鑰,用來(lái)計(jì)算每一條消息的消息認(rèn)證碼,而不是要求用戶(hù)提供管理員憑證(MAC,我們平時(shí)看到它會(huì)將其當(dāng)做硬件的MAC地址,這里是Message Authentication Code)。當(dāng)一條消息通過(guò)使用共享密鑰的消息摘要算法后就生成了消息摘要。該MAC隨后附在消息后面一起發(fā)送出去,接收方收到后用共享秘鑰對(duì)收到的消息進(jìn)行計(jì)算,生成MAC2,然后和MAC1進(jìn)行比較。消息摘要用于驗(yàn)證消息的真實(shí)性和完整性(學(xué)過(guò)密碼學(xué)的同學(xué)對(duì)此應(yīng)該都知道),這是一個(gè)確保通信安全的好方法,但是這三項(xiàng)服務(wù)的客戶(hù)端插件在實(shí)現(xiàn)上的缺陷就導(dǎo)致了嚴(yán)重的漏洞。

一條由helper.class.php認(rèn)證的傳入消息如下所示:

// $signature is the MAC sent with the message // $data is part of the message if (md5($data . $this->get_random_signature()) == $signature) { // valid message }

使用非嚴(yán)格的等于意味著在比較前會(huì)發(fā)生類(lèi)型“欺騙”[類(lèi)型轉(zhuǎn)換]。md5()函數(shù)的輸出永遠(yuǎn)都是字符串,但是如果$signature變了是一個(gè)整數(shù),那么比較時(shí)發(fā)生的類(lèi)型轉(zhuǎn)換就容易偽造一個(gè)匹配的MAC。例如,如果真實(shí)的MAC是以”0”開(kāi)頭,或者非數(shù)字字符開(kāi)頭,那么0就能匹配上,如果是”1xxx”這樣的,那么整數(shù)1就能匹配,以此類(lèi)推。(這里其實(shí)是php的一個(gè)特性,當(dāng)然其他語(yǔ)言也會(huì)有,當(dāng)一個(gè)字符串和數(shù)字進(jìn)行非嚴(yán)格等于的比較時(shí),如果第一個(gè)字符是數(shù)字就會(huì)將其轉(zhuǎn)換成對(duì)應(yīng)的整數(shù)進(jìn)行比較,如果是非0-9的字符,就會(huì)將其當(dāng)做0,php.NET官方的說(shuō)明:如果比較一個(gè)數(shù)字和字符串或者比較涉及到數(shù)字內(nèi)容的字符串,則字符串會(huì)被轉(zhuǎn)換為數(shù)值并且比較按照數(shù)值來(lái)進(jìn)行)。

字符串轉(zhuǎn)換為數(shù)值:

當(dāng)一個(gè)字符串被當(dāng)作一個(gè)數(shù)值來(lái)取值,其結(jié)果和類(lèi)型如下:

如果該字符串沒(méi)有包含 '.','e' 或 'E' 并且其數(shù)字值在整型的范圍之內(nèi)(由 php_INT_MAX 所定義),該字符串將被當(dāng)成integer 來(lái)取值。其它所有情況下都被作為 float 來(lái)取值。

該字符串的開(kāi)始部分決定了它的值。如果該字符串以合法的數(shù)值開(kāi)始,則使用該數(shù)值。否則其值為 0(零)。合法數(shù)值由可選的正負(fù)號(hào),后面跟著一個(gè)或多個(gè)數(shù)字(可能有小數(shù)點(diǎn)),再跟著可選的指數(shù)部分。指數(shù)部分由 'e' 或 'E' 后面跟著一個(gè)或多個(gè)數(shù)字構(gòu)成。

<?phpvar_dump(0 == "a"); // 0 == 0 -> truevar_dump("1" == "01"); // 1 == 1 -> truevar_dump("10" == "1e1"); // 10 == 10 -> truevar_dump(100 == "1e2"); // 100 == 100 -> truevar_dump('abcdefg' == 0); // true var_dump('1abcdef' == 1); // true var_dump('2abcdef' == 2); // true ?>

遺憾的是,攻擊者可以提供一個(gè)整數(shù)作為簽名。init.php中,傳入的請(qǐng)求將會(huì)使用base64_decode()解碼,然后反序列化其結(jié)果。Unserialize()的使用意味著可以控制輸入數(shù)據(jù)的類(lèi)型,一個(gè)偽造的序列化消息如下:

a:4:{s:9:"signature";i:0;s:2:"id";i:100000;s:6:"action";s:16:"execute_php_code";s:6:"params";a:2:{s:8:"username";s:5:"admin";s:4:"code";s:25:"exec('touch /tmp/owned');";}}
這條消息使用整數(shù)0作為簽名,然后使用插件提供的execute_php_code執(zhí)行任意的php代碼。

$signature = 0; // $data is the action concatenated with the message ID $data = 'execute_php_code' . 100000; if (md5($data . $this->get_random_signature()) == $signature) {   // valid message if the output of   // md5() doesn't start with a digit }

這個(gè)偽造的例子可能沒(méi)法直接使用,首先,id的鍵值需要比之前合法消息的值更大(使用增加的消息ID用于防止重放攻擊,今天既有請(qǐng)求偽造,又有重放,這讓我想到了CSRF,跨站請(qǐng)求偽造,下面是不是還有中間人攻擊呢),其次要有用于匹配簽名的整數(shù),這兩點(diǎn)要求可以進(jìn)行暴力破解來(lái)突破。

for i from 100,000 to 100,500:  for j from 0 to 9:    submit request with id i and signature j

上面的偽代碼嘗試發(fā)送具有很大ID值得虛假消息,并且對(duì)每個(gè)ID都進(jìn)行十次單獨(dú)的數(shù)字指紋匹配(前面說(shuō)到過(guò),對(duì)于一個(gè)字符串,只要一個(gè)數(shù)字就可以在比較時(shí)進(jìn)行匹配,這里從0-9是因?yàn)槊恳环N情況都能遇到)。

這一缺陷可以通過(guò)使用全等運(yùn)算符[===]和對(duì)傳入的指紋進(jìn)行檢查來(lái)修復(fù)。這幾個(gè)插件服務(wù)都通過(guò)使用嚴(yán)格的全等運(yùn)算符進(jìn)行了修復(fù)(php.NET的說(shuō)明:a===b,則a和b值相等,且類(lèi)型也相等;a==b,在發(fā)生類(lèi)型轉(zhuǎn)換后再判斷其值是否相等)。

另外還有一些其他的問(wèn)題,但是他們還沒(méi)有采取行動(dòng)。首先,這一做法是有弱點(diǎn)的(密鑰追加到$data,然后進(jìn)行散列),應(yīng)該用HMAC(Hash-based Message Authentication Code,以一個(gè)密鑰和一個(gè)消息為輸入,生成一個(gè)消息摘要作為輸出)。其次,僅用于操作的action和消息ID被用于創(chuàng)建簽名。這意味著,一個(gè)活躍的網(wǎng)絡(luò)攻擊者可以改變消息中的參數(shù)而簽名依舊是有效的(例如改變execute_php_code消息執(zhí)行任意代碼)。為了進(jìn)行保護(hù),MAC應(yīng)該包含整條消息。

(注意,基于MD5的消息摘要是一種后退,可以的話(huà)這些插件使用openssl_verify();***2014-04公布出來(lái)的Openssl 1.0.f heartbleed漏洞號(hào)稱(chēng)世紀(jì)級(jí)漏洞***)

WORPIT

Worpit是另一個(gè)遠(yuǎn)程管理服務(wù),但它使用從頭開(kāi)始構(gòu)建的客戶(hù)端插件,它同樣有強(qiáng)制類(lèi)型轉(zhuǎn)換漏洞,可以讓攻擊者以管理員權(quán)限登陸。

該插件提了遠(yuǎn)程管理員登陸的方法,使用僅Woprit傳遞系統(tǒng)可配置的臨時(shí)的token值。這款插件會(huì)檢查請(qǐng)求中提供的token值是否和存儲(chǔ)在數(shù)據(jù)庫(kù)中的值匹配。

if ( $_GET['token'] != $oWpHelper->getTransient( 'worpit_login_token' ) ) {   die( 'WorpitError: Invalid token' ); }

令牌是從一次使用的數(shù)據(jù)庫(kù)中刪除。這意味著大多數(shù)的時(shí)候都是在數(shù)據(jù)庫(kù)中沒(méi)有令牌。因此,在調(diào)用getTransient()方法可能返回false。非嚴(yán)格的比較是,這意味著任何“falsey價(jià)值,比如字符串0,將被視為一個(gè)有效的令牌。一個(gè)例子網(wǎng)址以管理員身份登錄:

這個(gè)token一經(jīng)使用就會(huì)從數(shù)據(jù)庫(kù)中刪除,這意味著,大多數(shù)時(shí)候數(shù)據(jù)庫(kù)中是沒(méi)有token的。因此,對(duì)getTransient()方法的調(diào)用很可能返回false。非嚴(yán)格的比較也用到了,這意味著任何相當(dāng)于false的值,例如字符串0會(huì)被當(dāng)做一個(gè)有效的token,以管理員身份登陸的例子如:http://victim/?worpit_api=1&m=login&token=0

至此,該站點(diǎn)就為攻擊者所控制了,他有權(quán)限安裝惡意插件或修改已有的插件。

這里的修復(fù)方案是使用!==并進(jìn)行其他檢查及從數(shù)據(jù)庫(kù)進(jìn)行檢索。

結(jié)論:

一定要記住檢查用戶(hù)輸入的是預(yù)期的類(lèi)型并在安全性很重要的函數(shù)中使用進(jìn)行嚴(yán)格比較,如檢查身份驗(yàn)證令牌。

php技術(shù)解析PHP強(qiáng)制轉(zhuǎn)換類(lèi)型及遠(yuǎn)程管理插件的安全隱患,轉(zhuǎn)載需保留來(lái)源!

鄭重聲明:本文版權(quán)歸原作者所有,轉(zhuǎn)載文章僅為傳播更多信息之目的,如作者信息標(biāo)記有誤,請(qǐng)第一時(shí)間聯(lián)系我們修改或刪除,多謝。

主站蜘蛛池模板: 丰满少妇被猛烈进出69影院 | 久久aa毛片免费播放嗯啊 | 国产成人h在线视频 | 亚洲精品无码国产爽快A片 亚洲精品无码成人AAA片 | 最近中文字幕完整版免费高清 | 国产美女又黄又爽又色视频网站 | 免费成年人在线观看视频 | 人人澡人人爽人人精品 | 午夜亚洲WWW湿好大 午夜性爽视频男人的天堂在线 | 中文字幕在线视频网站 | 97伦理电影在线不卡 | 主播蜜汁丝袜精品自拍 | 欧美日韩在线亚洲一 | 老师系列高H文 | 亚洲欧美一级久久精品 | 国产 亚洲 日韩 欧美 在线观看 | 亚洲电影第1页 | 久久国产露脸老熟女熟69 | 色偷偷综合网 | 免费精品国偷自产在线在线 | 久久精品熟女亚洲AV国产 | 日日噜噜夜夜爽爽 | 亚洲精品国产自在现线最新 | 国产成人在线小视频 | 久欠热视频精品首页 | 狂野猛交xxxx吃奶 | 99E久热只有精品8在线直播 | 高H高肉强J短篇NP | 九九热这里有精品 | 吃奶摸下的激烈免费视频 | 午夜啪啪免费视频 | 91国在线视频 | 在线观看精品视频看看播放 | 亚洲 日韩 在线 国产 精品 | 哪灬你的鸣巴好大 | 用快播看黄的网站 | 在线免费观看毛片网站 | 69xx欧美 | 忘忧草日本在线WWW日本 | 久久久擼擼擼麻豆 | 美女诱点第6季 |