# 第 14 关 - 图片马

第 14 关的要求是上传图片马,也就是用图片加一段 php 代码,在网站有这个包含漏洞的情况下才可以解析这个木马

首先要制作一个图片马,可以直接用文本文档格式编辑,在图片后面加一段 php 代码,但是需要 16 进制编写。还可以用 cmd 生成,语句如下

1
copy a.png /b + a.php /a webshell.png

在这个生成文件上传成功之后检测一下是否能成功运行,题目已经给了文件包含漏洞访问

找到文件上传之后的所在路径和文件名,用 bp 抓包看一下

然后在文件包含漏洞页面访问

# 第 15 关 - getimagesize ()

这关和上一关只有一个区别,是一个 getimagesize 函数,这个函数会读取文件的 16 进制头,看是不是符合正常的图片的文件头,看看源码

1
2
3
4
5
6
7
8
9
10
11
12
13
14
function isImage($filename){
$types = '.jpeg|.png|.gif';
if(file_exists($filename)){
$info = getimagesize($filename);
$ext = image_type_to_extension($info[2]);
if(stripos($types,$ext)>=0){
return $ext;
}else{
return false;
}
}else{
return false;
}
}

所以只要文件头符合上述三个文件类型即可,其他步骤和 14 关一致

# 第 16 关 - exif_imagetype ()

16 关和 14、15 关的思路依旧是一样的,但是这里的区别是 exif_imagetype,其功能是检测 16 进制文件头并检测其后缀名,功能和 getimagesize 一样,但是速度比其要快得多,在 php 扩展中可以打开这个功能

# 第 17 关 - 二次渲染

现在很多网站都会对用户上传的图片进行再次压缩、裁剪等渲染操作,比如 php 中的 imagecreatefromjpeg (),所以普通的图片马基本上都会被渲染掉

# 绕过

GIF:在渲染前后的两张 GIF 不一样的数据块部分插入 webshell

PNG:要将数据写入到 PLTE 数据块或者 IDAT 数据块

JPG:需要用脚本将数据插入到特定的数据块,而且可能不会成功,要多次尝试