0
点赞
收藏
分享

微信扫一扫

3-3 【实验】17-图像二次渲染绕过+代码审计

醉倾城1 2022-04-02 阅读 112
web安全

我们这篇文章,要开始讲pass-16,pass-16的绕过方式,跟前面的15个是完全不同的

所以说,我们先看一下,后台代码的实现,读懂代码之后,我们来想一下如何绕过

在这里插入图片描述

if (isset($_POST['submit']))

判断submit是否为空,如果不为空的话,运行下面代码

$filename = $_FILES['upload_file']['name'];
$filetype = $_FILES['upload_file']['type'];
$tmpname = $_FILES['upload_file']['tmp_name'];

获取我们的filename、filetype以及上传的临时文件的名字

$target_path=UPLOAD_PATH.'/'.basename($filename);

最终获取上传目标的上传路径

$fileext= substr(strrchr($filename,"."),1);

获得上传文件的扩展名,用了一个substr,strrchr找我们点之后的所有字符串,扩展名

if(($fileext == "jpg") && ($filetype=="image/jpeg"))

判断文件后缀与类型,合法才进行上传操作,如果后缀是jpg,filetype是image/jpeg

if(($fileext == "png") && ($filetype=="image/png"))

是png拼成的,那它filetype就是image/png

if(($fileext == "gif") && ($filetype=="image/gif"))

如果你的扩展名是gif,filetype如果是image/gif,就是这三个,判断了三种图片类型,分别是jpg、png、gif

我们先以jpg代码的执行过程,来举例

if(($fileext == "jpg") && ($filetype=="image/jpeg"))

如果满足这个条件,它就是jpg图片

if(move_uploaded_file($tmpname,$target_path))

将文件move到上传的目录

$im = imagecreatefromjpeg($target_path);

使用上传的图片生成新的图片,这个代码最核心的地方在imagecreatefromjpeg,就是从一个jpg的图片里面,去生成一个新的图片,生成的结果会返回一个变量,这个变量的类型是true或者是false,如果成功了,返回true,否则返回false

这个地方,就是做一个二次渲染的方式,也就是我们今天讲的一个二次渲染的绕过,我们来百度一下imagecreatefromjpeg到底是什么意思

在这里插入图片描述

这个函数,其实有非常多的类型,它在读取jpg图片的时候,在去创建的时候,会将我们图片的信息和非图片的信息分离开,如果说,我们在图片里面加入php一句话木马,它会把这一句话木马拽出来,因为它不是图片的信息,这个时候,我们就会对一句话进行过滤,所以说,这会对我们的上传造成一定的影响

if($im == false){
                $msg = "该文件不是jpg格式的图片!";
                @unlink($target_path);
            }

如果说,返回的是false,那就说明该文件不是jpg格式的图片,然后unlink是删除文件,也就是将我们刚才的文件删除掉

//给新图片指定文件名
                srand(time());
                $newfilename = strval(rand()).".jpg";
                //显示二次渲染后的图片(使用用户上传图片生成的新图片)
                $img_path = UPLOAD_PATH.'/'.$newfilename;       

那如果说,可以生成的话,那就给新图片指定文件名,后缀名是jpg,显示二次渲染后的图片

 imagejpeg($im,$img_path);
 @unlink($target_path);

然后用了imagejpeg函数,这个函数的作用,就是往我们的浏览器里面,写新的图片,然后最终要把这个旧的图片删除掉,也就是target_path

$is_upload = true;

然后最终告诉我们服务器,上传成功了,把upload标记为true

下面的代码,跟上面的没有什么区别,imagejpeg、imagepng、imagegif为了显示不同的图片,用了不同的方法,它的函数代码的结构是一样的,只要分析一个就可以了

我们这篇文章主要用来绕过imagecreatefromjpeg函数,这个函数有个特点,你上传的东西,它给你重新排列,重新把你这个数据读出来,然后在组成一个新的图片,这样子,我们往里面传一句话木马就被丢弃了

我们先上传一句话木马图片

在这里插入图片描述

上传成功,我们复制图像地址,用文件包含包含一下,http://192.168.42.138/upload/include.php?file=./upload/18518.png

在这里插入图片描述

这个显示跟我们之前的显示,没有太大的区别,确认上传成功了,我们最终要确认在蚁剑里面,能不能连接,http://192.168.42.138/upload/include.php?file=./upload/18518.png

在这里插入图片描述

我们发现响应是null的,没有成功解析成php文件,说明我们上传的文件是有问题的,我们把他保存一下,用笔记本的方式打开,这个时候,我们搜索一下php

在这里插入图片描述

发现已经没有了,所以说这跟我们刚才讲的,不谋而合,我们的php代码被吃掉了

我们准备一张gif的图片,说明都不做改变,直接上传,看看他有说明变化,前后的二进制,我们进行比对一下

在这里插入图片描述

我们将图片另存为321.gif,这个时候,我们要用到一个工具叫notepad++,这个工具可以查看文件的二进制信息,我们看一下这两个文件,他们前后不是有重组吗,我们看一下前后重组之后,二进制信息有没有变化

打开之后,我们用点Compare,做一个比较

在这里插入图片描述

比较完之后,他不同的地方,会用黑色来显示,大家看到后面是黑色,都不一样,后面的二进制信息都发生了变化,而前面发白的信息是没有变化的,所以我们要在前面加入一句话木马

在这里插入图片描述

这样子,就能够将我们的一句话木马参和进去

我们上传图片马

在这里插入图片描述

打开上传成功的图片,看一下,里面有没有一句话木马

在这里插入图片描述

发现确实是有,然后我们将路径拷贝一下,做一个文件包含测试一下

在这里插入图片描述

没有404,显示没有问题,蚁剑连接一下

在这里插入图片描述

这个时候,就能获取wenshell,这就能够绕过他这个双写的过程

原理就是利用了前后上传gif,他在重组的时候,gif不变的那个,前半部分,不变的那个,我们就在这个地方,插入我们的一句话木马,这样一句话木马,也就不会变,这样实行绕过的一个操作

png和jpeg的绕过方式的原理也是这样

举报

相关推荐

0 条评论