最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

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

 更新時間:2024年08月06日 17:11:17   投稿:shichen2014  
這篇文章主要介紹了PHP強制轉(zhuǎn)換類型及遠(yuǎn)程管理插件的安全隱患,需要的朋友可以參考下

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

ManageWP, InfiniteWP, and CMS Commander

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

管理服務(wù)器注冊一個客戶端插件的私鑰,用來計算每一條消息的消息認(rèn)證碼,而不是要求用戶提供管理員憑證(MAC,我們平時看到它會將其當(dāng)做硬件的MAC地址,這里是Message Authentication Code)。當(dāng)一條消息通過使用共享密鑰的消息摘要算法后就生成了消息摘要。該MAC隨后附在消息后面一起發(fā)送出去,接收方收到后用共享秘鑰對收到的消息進(jìn)行計算,生成MAC2,然后和MAC1進(jìn)行比較。消息摘要用于驗證消息的真實性和完整性(學(xué)過密碼學(xué)的同學(xué)對此應(yīng)該都知道),這是一個確保通信安全的好方法,但是這三項服務(wù)的客戶端插件在實現(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)格的等于意味著在比較前會發(fā)生類型“欺騙”[類型轉(zhuǎn)換]。md5()函數(shù)的輸出永遠(yuǎn)都是字符串,但是如果$signature變了是一個整數(shù),那么比較時發(fā)生的類型轉(zhuǎn)換就容易偽造一個匹配的MAC。例如,如果真實的MAC是以”0”開頭,或者非數(shù)字字符開頭,那么0就能匹配上,如果是”1xxx”這樣的,那么整數(shù)1就能匹配,以此類推。(這里其實是php的一個特性,當(dāng)然其他語言也會有,當(dāng)一個字符串和數(shù)字進(jìn)行非嚴(yán)格等于的比較時,如果第一個字符是數(shù)字就會將其轉(zhuǎn)換成對應(yīng)的整數(shù)進(jìn)行比較,如果是非0-9的字符,就會將其當(dāng)做0,php.net官方的說明:如果比較一個數(shù)字和字符串或者比較涉及到數(shù)字內(nèi)容的字符串,則字符串會被轉(zhuǎn)換為數(shù)值并且比較按照數(shù)值來進(jìn)行)。

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

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

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

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

<?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
var_dump('abcdefg' == 0); // true 
var_dump('1abcdef' == 1); // true 
var_dump('2abcdef' == 2); // true 
?>

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

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 
}

這個偽造的例子可能沒法直接使用,首先,id的鍵值需要比之前合法消息的值更大(使用增加的消息ID用于防止重放攻擊,今天既有請求偽造,又有重放,這讓我想到了CSRF,跨站請求偽造,下面是不是還有中間人攻擊呢),其次要有用于匹配簽名的整數(shù)。

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

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

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

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

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

WORPIT

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

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

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

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

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

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

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

結(jié)論:

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

相關(guān)文章

  • 分析PHP中單雙引號的誤區(qū)和雙引號小隱患

    分析PHP中單雙引號的誤區(qū)和雙引號小隱患

    PHP中單雙引號常常會給人帶來很多的誤區(qū),其中雙引號還有些小隱患,下面是小編給大家整理的,需要的可以參考。
    2016-07-07
  • php從數(shù)組中隨機(jī)抽取一些元素的代碼

    php從數(shù)組中隨機(jī)抽取一些元素的代碼

    php從數(shù)組中隨機(jī)抽取一些元素的代碼,需要的朋友可以參考下
    2012-11-11
  • PHP實現(xiàn)時間軸函數(shù)代碼

    PHP實現(xiàn)時間軸函數(shù)代碼

    我們在論壇發(fā)帖、發(fā)表評論、或者是使用QQ空間發(fā)布日志、微博發(fā)表言論時,會看到發(fā)表的內(nèi)容后的時間顯示為“剛剛”、“5分鐘前”、“昨天10:23”等,而不是直接顯示具體日期和時間
    2011-10-10
  • 使用PHPOffice/PHPWord實現(xiàn)讀取Word內(nèi)容

    使用PHPOffice/PHPWord實現(xiàn)讀取Word內(nèi)容

    這篇文章主要為大家詳細(xì)介紹了如何使用PHPOffice/PHPWord實現(xiàn)讀取Word內(nèi)容的功能,文中的示例代碼講解詳細(xì),感興趣的小伙伴可以了解一下
    2023-07-07
  • 詳解PHP框架EasySwoole

    詳解PHP框架EasySwoole

    EasySwoole是一款常駐內(nèi)存型的分布式swoole框架,專為API而生,支持同時混合監(jiān)聽HTTP、WebSocket、自定義TCP、UDP協(xié)議,且擁有豐富的組件,例如協(xié)程 連接池、TP風(fēng)格的協(xié)程ORM、協(xié)程微信SDK等諸多組件。讓開發(fā)者編寫出多進(jìn)程,可異步,高可用的應(yīng)用服務(wù)。
    2021-05-05
  • 高并發(fā)php uniqid不重復(fù)唯一標(biāo)識符生成方案

    高并發(fā)php uniqid不重復(fù)唯一標(biāo)識符生成方案

    這篇文章主要介紹了高并發(fā)php uniqid不重復(fù)唯一標(biāo)識符生成方案,對高并發(fā)感興趣的同學(xué),一定要看一下
    2021-04-04
  • PHP基礎(chǔ)知識詳細(xì)講解

    PHP基礎(chǔ)知識詳細(xì)講解

    PHP是安全中需要掌握的一門語言,就這么一點兒時間教網(wǎng)絡(luò)安全,不可能精通,這里就不要求你精通PHP,但是對于一些基礎(chǔ)代碼能夠認(rèn)識、能夠編寫那么就可以了
    2022-12-12
  • 巧用php中的array_filter()函數(shù)去掉多維空值的代碼分享

    巧用php中的array_filter()函數(shù)去掉多維空值的代碼分享

    在我們開發(fā)過程中,判斷數(shù)組為空時你會想到什么方法呢?首先想到的應(yīng)該是empty函數(shù),不過直接用empty函數(shù)判斷為空是不對的,因為當(dāng)這個值是多維數(shù)的時候,empty結(jié)果是有值的
    2012-09-09
  • PHP獲取對象屬性的三種方法實例分析

    PHP獲取對象屬性的三種方法實例分析

    這篇文章主要介紹了PHP獲取對象屬性的三種方法,結(jié)合實例形式分析了php面向?qū)ο蟪绦蛟O(shè)計中獲取對象屬性的常見操作技巧,需要的朋友可以參考下
    2019-01-01
  • PHP和XSS跨站攻擊的防范

    PHP和XSS跨站攻擊的防范

    PHP和XSS跨站攻擊的防范...
    2007-04-04

最新評論

赤峰市| 衡南县| 东港市| 南城县| 行唐县| 扎兰屯市| 兖州市| 富平县| 台北市| 象山县| 鹤岗市| 安国市| 博湖县| 平远县| 长垣县| 浦北县| 康平县| 全南县| 高密市| 油尖旺区| 海城市| 泽普县| 视频| 石柱| 海门市| 都安| 鹿泉市| 湛江市| 平遥县| 连州市| 于田县| 都江堰市| 营口市| 邳州市| 梁平县| 留坝县| 堆龙德庆县| 突泉县| 来宾市| 赣州市| 康定县|