中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

PHP強制轉換類型及遠程管理插件的安全隱患

發布時間:2021-06-30 16:37:32 來源:億速云 閱讀:107 作者:chen 欄目:開發技術

本篇內容介紹了“PHP強制轉換類型及遠程管理插件的安全隱患”的有關知識,在實際案例的操作過程中,不少人都會遇到這樣的困境,接下來就讓小編帶領大家學習一下如何處理這些情況吧!希望大家仔細閱讀,能夠學有所成!

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

ManageWP, InfiniteWP, and CMS Commander

這三個服務有著相同的客戶端插件基礎代碼(目測最初是ManageWp實現,然后另外兩個對其進行了調整),因而它們都有簽名繞過漏洞并且會導致遠程代碼執行。

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

一條由helper.class.php認證的傳入消息如下所示:

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

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

字符串轉換為數值:

當一個字符串被當作一個數值來取值,其結果和類型如下:

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

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

<?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 
?>

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

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');";}}
這條消息使用整數0作為簽名,然后使用插件提供的execute_php_code執行任意的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,跨站請求偽造,下面是不是還有中間人攻擊呢),其次要有用于匹配簽名的整數,這兩點要求可以進行暴力破解來突破。

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

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

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

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

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

WORPIT

Worpit是另一個遠程管理服務,但它使用從頭開始構建的客戶端插件,它同樣有強制類型轉換漏洞,可以讓攻擊者以管理員權限登陸。

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

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

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

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

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

這里的修復方案是使用!==并進行其他檢查及從數據庫進行檢索。

結論:

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

“PHP強制轉換類型及遠程管理插件的安全隱患”的內容就介紹到這里了,感謝大家的閱讀。如果想了解更多行業相關的知識可以關注億速云網站,小編將為大家輸出更多高質量的實用文章!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

php
AI

苏州市| 海宁市| 依安县| 新竹县| 乐陵市| 平凉市| 闸北区| 岳普湖县| 南皮县| 余庆县| 福州市| 磴口县| 图木舒克市| 仙桃市| 东阳市| 通州区| 永城市| 滦平县| 民丰县| 桐城市| 叶城县| 依安县| 泾源县| 溧阳市| 扶绥县| 高雄市| 彩票| 曲阜市| 顺义区| 巨鹿县| 温州市| 大田县| 根河市| 抚顺县| 喀什市| 天水市| 航空| 乡城县| 岱山县| 繁峙县| 南木林县|