- 資訊首頁(yè) > 網(wǎng)絡(luò )安全 >
- PHP繞過(guò)禁用函數漏洞的原理
這篇文章主要講解了“PHP繞過(guò)禁用函數漏洞的原理”,文中的講解內容簡(jiǎn)單清晰,易于學(xué)習與理解,下面請大家跟著(zhù)小編的思路慢慢深入,一起來(lái)研究和學(xué)習“PHP繞過(guò)禁用函數漏洞的原理”吧!
PHP 發(fā)布公告,舊版本的 php_array_merge_recursive 函數中存在UAF風(fēng)險,被利用可能導致用來(lái)繞過(guò)禁用函數。
受影響的版本
PHP 7.2 - 7.4.9
安全專(zhuān)家建議用戶(hù)盡快升級到安全版本,以解決風(fēng)險。
一、array_merge_recursive 函數實(shí)現
在 array_merge_recursive 函數的實(shí)現中,通過(guò)遍歷源數組鍵值,如果鍵值不存在,則將對應的值直接插入目標數組;如果鍵值存在,則查詢(xún)相應的目標數組。在目標數組不存在此鍵值時(shí),將鍵值與相應的值插入目標數組;如果存在相同的鍵值,則會(huì )嘗試將相應的值加入到目標數組中。具體處理如下圖,在目標值為 NULL 時(shí),將其轉變?yōu)閿到M類(lèi)型并在數組中加入 NULL,在源數組中的值為對象類(lèi)型時(shí)將其轉換為數組類(lèi)型,嘗試為 src_entry 添加引用后將 src_zval 添加到數組中;如果源數組中的值類(lèi)型為數組則遞歸調用 php_array_merge_recursive 函數。
二、原理分析
在嘗試為源數組中的值添加引用計數的時(shí)候錯誤地調用了 Z_TRY_ADDREF_P(src_entry), src_entry 此時(shí)為對源數組中的值的引用,此時(shí)引用計數被添加到了引用而不是源數組中的值。
如果在 array_merge_recursive 函數中傳入可變的字符串(通過(guò)直接賦值獲得的字符串不可變,在嘗試添加引用計數時(shí)會(huì )失?。?,此時(shí) src_zval 即可變字符串的引用計數并沒(méi)有增加,在數組被銷(xiāo)毀時(shí),因為可變字符串的引用計數提前變?yōu)?0 導致 UAF。
三、利用分析
注: 以下調試直接在 php 調試而不是在加載 php 調試,但是差別不大。
1、在字符串被釋放后,創(chuàng )建一個(gè)新的對象占位,進(jìn)行類(lèi)型混淆,此時(shí)字符串的 len 被新創(chuàng )建對象的 ce 覆蓋。ce 是一個(gè)地址,所以后續不會(huì )影響字符串的寫(xiě)入。
占位前后對比圖如下:
字符串對象被釋放后,創(chuàng )建對象前:
創(chuàng )建對象后:
2、讀取新創(chuàng )建對象的 handlers 方便之后泄露內存信息,handers 的值即為上圖的 0x0000000008dfe500,在后面可以達到任意內存讀取后可以用來(lái)泄露 php 基地址。讀取新創(chuàng )建對象中包含堆地址的區域,獲取被釋放的字符串地址,例如可以讀取 0x7ffffb080540 中的堆地址,減去 0xc8 即為字符串對象中的字符串地址 hex(0x00007ffffb0805b0 - 0xc8) = 0x7ffffb0804e8 即為字符串對象的 val 屬性的地址。
3、將新創(chuàng )建對象的一個(gè)屬性的值指向的類(lèi)型改寫(xiě)為引用,引用的地址為一個(gè)偽造的引用字符串對象??梢詫⑿聞?chuàng )建對象的第一個(gè)屬性即 properties_table 數組中的第一個(gè)元素的類(lèi)型改為引用,地址改為偽造的引用字符串對象的地址。地址0x7ffffb0804f8 保存的即為新創(chuàng )建對象的第一個(gè)屬性的地址,地址0x7ffffb080500 中存儲的 0xa 代表引用類(lèi)型。
其指向的地址 0x00007ffffb080548 保存的為偽造引用對象的地址,偽造的對象的第三個(gè)八字節需置為 6 (引用對象的類(lèi)型)。引用字符串對象的內存布局如下圖??梢钥吹?,引用中保存類(lèi)型為 0x6 代表字符串類(lèi)型,但是地址為 0x0,之后可以通過(guò)寫(xiě)入任意地址來(lái)達到內存讀取。
4、通過(guò)修改偽造的字符串的起始地址來(lái)達到任意內存讀取,利用之前泄露的 handlers 地址來(lái)獲取 elf 基址,之后遍歷內存獲取 zif_system 函數的地址。
5、偽造一個(gè)閉包對象,從一個(gè)真實(shí)存在的閉包對象拷貝其存儲的值,修改函數類(lèi)型為內置函數類(lèi)型,has_dimension 屬性地址為 zif_system,修改后如下圖。
6、修改對象的一個(gè)屬性地址為偽造的閉包對象的地址,調用對象的屬性函數即可完成禁用函數的繞過(guò)。
一、在7.4.5 版本中進(jìn)行攻擊嘗試
在目標服務(wù)器上傳利用腳本,執行命令。
(視頻地址:https://v.qq.com/x/page/c31651dla6g.html)
二、7.4.10 版本修復分析
修改 Z_TRY_ADDREF_P(src_entry) 為 Z_TRY_ADDREF_P(src_zval)。
免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。
Copyright ? 2009-2022 56dr.com. All Rights Reserved. 特網(wǎng)科技 特網(wǎng)云 版權所有 特網(wǎng)科技 粵ICP備16109289號
域名注冊服務(wù)機構:阿里云計算有限公司(萬(wàn)網(wǎng)) 域名服務(wù)機構:煙臺帝思普網(wǎng)絡(luò )科技有限公司(DNSPod) CDN服務(wù):阿里云計算有限公司 百度云 中國互聯(lián)網(wǎng)舉報中心 增值電信業(yè)務(wù)經(jīng)營(yíng)許可證B2
建議您使用Chrome、Firefox、Edge、IE10及以上版本和360等主流瀏覽器瀏覽本網(wǎng)站