自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

技術(shù)分析:剖析HikaShop PHP對(duì)象注入漏洞

安全 漏洞
HikaShop是基于著名開(kāi)源CMS Joomla!的電子商務(wù)程序,可以幫助用戶(hù)輕松的開(kāi)發(fā)電子商務(wù)網(wǎng)站或網(wǎng)店。今天要講的HikaShop PHP對(duì)象注入漏洞這個(gè)漏洞允許黑客向網(wǎng)站發(fā)送惡意指令,從而造成遠(yuǎn)程代碼執(zhí)行。

HikaShop是基于著名開(kāi)源CMS Joomla!的電子商務(wù)程序,可以幫助用戶(hù)輕松的開(kāi)發(fā)電子商務(wù)網(wǎng)站或網(wǎng)店。

技術(shù)分析:剖析HikaShop PHP對(duì)象注入漏洞

距離上次我們發(fā)現(xiàn)Joomla!的HikaShop擴(kuò)展對(duì)象注入漏洞(影響版本<2.3.3)已經(jīng)兩月有余了。今天要講的這個(gè)漏洞允許黑客向網(wǎng)站發(fā)送惡意指令,從而造成遠(yuǎn)程代碼執(zhí)行。

小科普

由于本篇文技術(shù)含量稍高,這里小編做一些術(shù)語(yǔ)科普,希望對(duì)大家有用:

魔術(shù)方法:在 PHP中以?xún)蓚€(gè)下劃線開(kāi)頭的方法,調(diào)用時(shí)需要在類(lèi)中預(yù)定義。
析構(gòu)函數(shù):當(dāng)對(duì)象脫離其作用域時(shí),系統(tǒng)自動(dòng)執(zhí)行析構(gòu)函數(shù),做好“清理善后”的工作。
回調(diào)函數(shù):把函數(shù)的指針(地址)作為參數(shù)傳遞給另一個(gè)函數(shù),該指針被用來(lái)調(diào)用其所指向的函數(shù)。
序列化:將對(duì)象的狀態(tài)信息轉(zhuǎn)換為可以存儲(chǔ)或傳輸?shù)男问健?
類(lèi)實(shí)例:必須通過(guò)對(duì)象名來(lái)訪問(wèn),也就是說(shuō)要想使用類(lèi)實(shí)例,必須創(chuàng)建對(duì)象。

對(duì)象注入的原理

對(duì)象注入通常發(fā)生在用戶(hù)的輸入,被傳遞給unserialize()函數(shù)然后進(jìn)行調(diào)用的時(shí)候。黑客可以通過(guò)構(gòu)造輸入內(nèi)容,向WEB服務(wù)器發(fā)送當(dāng)前WEB應(yīng)用下的一個(gè)序列化的類(lèi)實(shí)例,保證這些被定義為魔術(shù)方法的類(lèi),在特定的時(shí)候會(huì)被觸發(fā),從而執(zhí)行其中的惡意代碼。

漏洞的罪魁禍?zhǔn)?/strong>

代碼中的124行和132行有兩個(gè)重要的點(diǎn)值得我們注意,$infos變量被設(shè)置為JRequest::getVar()的返回值,這就意味著它可以接收$_GET['infos']或者$_POST['infos']的值。接著,$infos的值被base64編碼后,會(huì)傳遞給unserialize()函數(shù)。

Hikashop漏洞的攻擊利用方法如圖:

技術(shù)分析:剖析HikaShop PHP對(duì)象注入漏洞

我們?cè)诹私膺@些信息后,就需要想辦法達(dá)成我們的邪惡目的。在我們的POC調(diào)用了Joomla! 3.3.x的類(lèi),并且定義成功后,我們就可以讀取WEB服務(wù)器上的/etc/passwd。#p#

找出利用方法,直擊問(wèn)題核心

我們首先要做的,就是分析該程序代碼的執(zhí)行順序。同時(shí),我們也需要使用Joomla!類(lèi)的魔術(shù)方法。值得一提的時(shí)候,PHP類(lèi)的析構(gòu)方法__destruct(),在腳本執(zhí)行完畢時(shí)會(huì)自動(dòng)執(zhí)行析構(gòu)函數(shù)。

在這個(gè)特定案例下,我們選擇了JDatabaseDriverMysqli類(lèi)的析構(gòu)方法來(lái)達(dá)成我們的需求,這可以讓我們從任何存在的類(lèi)里去調(diào)用方法。Destruct函數(shù)調(diào)用disconnect方法如圖:

技術(shù)分析:剖析HikaShop PHP對(duì)象注入漏洞

這里采用了$this->disconnectHandlers調(diào)用那些回調(diào)函數(shù),Disconnect函數(shù)如圖:

技術(shù)分析:剖析HikaShop PHP對(duì)象注入漏洞

我們準(zhǔn)備通過(guò)創(chuàng)建一個(gè)改版過(guò)的JDatabaseDriverMysqli類(lèi),它可以讓我們更改變量的默認(rèn)值。特別需要指出的是,我們需要滿足幾個(gè)條件來(lái)實(shí)現(xiàn)序列化。一旦Hikashop被反序列化,會(huì)生成一些實(shí)例,然后析構(gòu)函數(shù)會(huì)執(zhí)行我們提供的任何函數(shù)或者方法。

為了實(shí)現(xiàn)上述的需求,我們需要做到以下幾點(diǎn):

1.一定要把$this->connection的值設(shè)為“True”(否則我們不能調(diào)試到call_user_func_array()函數(shù)里面去)

2.使用某個(gè)包含如下內(nèi)容的數(shù)組(以下任意一點(diǎn)即可)賦給$this->disconnectHandlers:

(1)包含我們目標(biāo)函數(shù)名的字符串

(2)包含方法名稱(chēng)和對(duì)應(yīng)類(lèi)的一個(gè)實(shí)例,比如這個(gè)數(shù)組(new ourClass(), “ourClassMethod”)

我們不能控制傳遞給目標(biāo)函數(shù)的參數(shù)內(nèi)容(它永遠(yuǎn)是我們類(lèi)的實(shí)例),這就限制了我們?cè)谝韵颅h(huán)境里研究方法:

1.那些我們不能使用任何參數(shù)的時(shí)候

2.那些函數(shù)的第一個(gè)參數(shù)類(lèi)型并沒(méi)有針對(duì)黑客進(jìn)行限制的時(shí)候

3.那些因環(huán)境需要,而使用的多參數(shù)模式(事實(shí)上我們只需構(gòu)造發(fā)送一個(gè)參數(shù),因?yàn)槠渌膮?shù)可能被置為默認(rèn)值或者空值,并且記入服務(wù)器的錯(cuò)誤日志)#p#

發(fā)現(xiàn)有趣的方法

使用一些grep命令,我們會(huì)看到PHPMailer類(lèi)的這個(gè)方法,PHPMailer類(lèi)的require_once方法如圖:

技術(shù)分析:剖析HikaShop PHP對(duì)象注入漏洞

很容易是不是?傳遞PHPMailer的一個(gè)實(shí)例,把$this->PluginDir設(shè)置指向?yàn)榭梢赃M(jìn)行hack的地址(這可以產(chǎn)生一個(gè)絕妙的LFI/RFI攻擊,可以想象一下我們把$this->PluginDir指向http://blog.sucuri.net/)。然而不幸的是,有兩個(gè)難題阻礙了我們前進(jìn)的道路:

問(wèn)題1– PHPMailer類(lèi)在當(dāng)前環(huán)境下沒(méi)有做定義

這絕對(duì)是一個(gè)讓人頭疼的問(wèn)題,但我們真的什么也做不了麼?當(dāng)然不是!謝天謝地,Joomla!采用了一些非常規(guī)則的類(lèi)進(jìn)行自動(dòng)加載,這使得我們?cè)趯?dǎo)入PHPMailer類(lèi)的過(guò)程中,自動(dòng)導(dǎo)入JMail組件。

為了解決這個(gè)問(wèn)題,我們?cè)跊](méi)有使用過(guò)的JDatabaseDriverMysqli的變量中創(chuàng)建了JMail的一個(gè)實(shí)例。這樣的話,自動(dòng)導(dǎo)入機(jī)制可以在導(dǎo)入JMail組件的文件的同時(shí),加載PHPMailer的定義。

問(wèn)題2– SmtpSend()方法被定義為保護(hù)模式,防止外部使用

這倒不是事兒,如果你不能直接調(diào)用SmtpSend(),可以找出另一個(gè)public方法,對(duì)SmtpSend()進(jìn)行調(diào)用!然而幸運(yùn)女神再次眷顧了我們,確實(shí)存在這樣一種方法!PostSend函數(shù)調(diào)用SmtpSend()如圖:

技術(shù)分析:剖析HikaShop PHP對(duì)象注入漏洞

我們唯一剩下的工作,就是將$this->Mailer的值設(shè)為smtp!

這樣就完了?

當(dāng)然不是,我們確實(shí)找出了一些LFI/RFI的漏洞,但離我們最初的目標(biāo)還很遙遠(yuǎn)。我們的最終目的是:發(fā)送簡(jiǎn)單的命令,一鍵把后門(mén)植入網(wǎng)站根目錄!

我們可以使用RFI漏洞進(jìn)行遠(yuǎn)程文件包含,那么現(xiàn)在問(wèn)題來(lái)了,它需要WEB容器開(kāi)啟allow_url_include選項(xiàng),而這個(gè)選項(xiàng)默認(rèn)是關(guān)閉的。也許,我們需要尋求另一種方法來(lái)達(dá)成目標(biāo)。#p#

Sendmail拯救世界!

你們可能注意到了該截圖,那是一個(gè)帶有PostSend()函數(shù)的方法,即$this->SendmailSend(),Sendmail函數(shù)如圖:

技術(shù)分析:剖析HikaShop PHP對(duì)象注入漏洞

這里展示了一個(gè)非常有趣的方法,可以用來(lái)在目標(biāo)服務(wù)器的絕對(duì)路徑下寫(xiě)文件。

popen()函數(shù)使用了$sendmail變量($sendmail變量通常包含“/usr/sbin/sendmail -oi -t”或者“/usr/sbin/sendmail -oi -f’EMAIL@HERE.COM’ -t”)來(lái)執(zhí)行shell命令,所以我們才可以使用Sendmail函數(shù)來(lái)發(fā)電子郵件。經(jīng)過(guò)進(jìn)一步分析,可以發(fā)現(xiàn)它使用了兩個(gè)變量,即$this->Sender和$this->Sendmail,前者可以為空。

它們使用了不同的函數(shù):escapeshellcmd()和escapeshellarg()。在escapeshellcmd()里調(diào)用$this->Sendmail的話,以下這些特殊字符會(huì)被編碼:#&;`|*?~^()[]{}$\, \x0A以及\xFF。最后我們只能使用字母、數(shù)字以及少量如“/”和“-”這樣的字符。

這距離我們的目標(biāo)還遠(yuǎn)遠(yuǎn)不夠!我們可以在Sendmail函數(shù)的原始命令中加入我們需要的參數(shù)。

所以,如果我們把“/usr/sbin/sendmail -OQueueDirectory=/tmp -X/tmp/smtp.php”這樣的參數(shù)加進(jìn)去會(huì)如何?同樣,如果我們使用現(xiàn)有的poc,同時(shí)對(duì)代碼中其他所有的變量進(jìn)行設(shè)置后,發(fā)送一個(gè)頭部含有以下的內(nèi)容的郵件又會(huì)怎樣呢?

頭部?jī)?nèi)容:

確實(shí)是個(gè)難題吧?如果那樣做的話會(huì)產(chǎn)生如下后果:

1.“-OQueueDirectory=/tmp -X/tmp/smtp.php”,這部分代碼會(huì)將/tmp/smtp.php發(fā)送的郵件給保存起來(lái)。

2.我們發(fā)送的頭部?jī)?nèi)容,會(huì)被保存起來(lái)進(jìn)行反序列化處理。

現(xiàn)在我們需要做的,就是把整個(gè)流程整理一下,最后才能達(dá)到我們的目標(biāo)!

完整利用流程圖

在這時(shí)我們的方法已經(jīng)很復(fù)雜了,一個(gè)統(tǒng)籌的流程圖在這時(shí)顯得十分有必要:

技術(shù)分析:剖析HikaShop PHP對(duì)象注入漏洞

一旦黑客成功創(chuàng)建和序列化一個(gè)對(duì)象,將其傳遞給存在漏洞的Hikashop擴(kuò)展加載,就可以竊取/etc/passwd的內(nèi)容。

我們可以通過(guò)該漏洞做許多事,這里所講到的僅僅是其中一種。如果您使用的是Hikashop擴(kuò)展,我希望您已經(jīng)在我們上次發(fā)布該漏洞后及時(shí)更新了補(bǔ)丁。

水平有限,如有表達(dá)不明朗的地方請(qǐng)不吝賜教,可以點(diǎn)擊文章下方的“文章糾正”

參考來(lái)源:http://blog.sucuri.net/2014/11/deep-dive-into-the-hikashop-vulnerability.html

責(zé)任編輯:藍(lán)雨淚 來(lái)源: FreeBuf
相關(guān)推薦

2015-02-04 14:50:29

2013-12-13 10:45:26

2012-04-12 13:36:59

2012-04-12 15:06:44

2012-12-19 10:36:06

2015-02-06 15:51:11

2010-04-13 14:35:17

2015-08-25 11:17:13

OpenStack對(duì)象存儲(chǔ)Swift

2010-06-22 09:40:38

PHP方法重載

2013-07-03 11:28:47

2009-07-06 17:47:44

2021-11-07 07:46:29

源碼漏洞惡意代碼

2013-12-09 09:57:37

2023-12-08 09:00:00

漏洞攻擊

2010-09-09 17:22:14

2013-01-10 16:12:02

Ruby on Rai漏洞

2021-05-13 11:54:07

數(shù)據(jù)湖阿里云

2015-11-30 11:14:59

C++對(duì)象池自動(dòng)回收

2009-11-18 13:52:30

PHP shell腳本

2022-08-04 08:44:31

Android系統(tǒng)攻擊鏈
點(diǎn)贊
收藏

51CTO技術(shù)棧公眾號(hào)