March 2, 2023

不要捉弄我新人同学: B

finfio_open

实验代码:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
<?php
$finfo = finfo_open(FILEINFO_MIME_TYPE);
$type = finfo_file($finfo, $_FILES['upload_file']['tmp_name']);
var_dump($type);
finfo_close($finfo);
if (in_array($type, ['image/png'])) {
echo('alright!!!');
}
?>
<div id="upload_panel">
<ol>
<li>
<h3>上传一个文件!</h3>
<form enctype="multipart/form-data" method="post">
<p>请选择要上传的图片:<p>
<input class="input_file" type="file" name="upload_file"/>
<input class="button" type="submit" name="submit" value="上传"/>
</form>
</li>
</ol>
</div>

接下来我们去搜集一下有关函数的所有信息:

1
2
3
4
5
6
7
8
9
10
#使用格式
finfo_open(int $options = FILEINFO_NONE, string $magic_file = null): resource
/*options
一个 Fileinfo 常量 或多个 Fileinfo 常量 进行逻辑或运算。

magic_file
魔数数据库文件名称, 通常是 /path/to/magic.mime。 如果未指定,则使用 MAGIC 环境变量。 如果未指定此环境变量, 则使用 PHP 绑定的魔数数据库。

传入 null 或者空字符串,等同于使用默认值。
*/

对于option中的finfo常量有以下几种:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
FILEINFO_NONE (integer)
无特殊处理。
FILEINFO_SYMLINK (integer)
跟随符号链接。
FILEINFO_MIME_TYPE (integer)
返回 mime 类型。 自 PHP 5.3.0 可用。
FILEINFO_MIME_ENCODING (integer)
返回文件的 mime 编码。 自 PHP 5.3.0 可用。
FILEINFO_MIME (integer)
按照 RFC 2045 定义的格式返回文件 mime 类型和编码。
FILEINFO_COMPRESS (integer)
解压缩压缩文件。 由于线程安全问题,自 PHP 5.3.0 禁用。
FILEINFO_DEVICES (integer)
查看设备的块内容或字符。
FILEINFO_CONTINUE (integer)
返回全部匹配的类型。
FILEINFO_PRESERVE_ATIME (integer)
如果可以的话,尽可能保持原始的访问时间。
FILEINFO_RAW (integer)
对于不可打印字符不转换成 \ooo 八进制表示格式。
FILEINFO_EXTENSION (integer)
根据 MIME 类型返回适当的文件扩展名。 有的文件类型具有多种扩展名,例如 JPEG 将会返回多个扩展名, 以斜杠分隔,比如 "jpeg/jpg/jpe/jfif"。 如果在 magic.mime 数据库里类型未知,则返回的是 "???"。 PHP 7.2.0 起有效。

这边我们上传一个改了后缀名的php文件:
image.png
结果被狠狠的识别了
image.png
因为改了后缀名对我们的十六进制文件一点影响都没有,我们上传一个带有PNG文件头的文件:
image.png
image.png
结果被识别为了png格式,可以看到finfo_open函数也是对我们上传的文件进行一个文件头检测!

Getimagesize

同样也是对文件头进行检测的一个函数,不过又跟finfo_open有些不同捏,先看一看函数的介绍
image.png
image.png
可以看到返回了一系列有关图片的属性
但是假如我们上传一个只有上面构造的只有第一行文件头的一个图片,会识别成什么样子呢?
image.png
可以看到finfo_open识别为了png图片,但是getimagesize函数并没有识别成功,这就是一个小区别,我们往那个PNG图片第二行随便加点东西看看:
image.png
image.png
2个都成功识别了

exif_imagetype

image.png
image.png
他的返回值为以下数据:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
1	IMAGETYPE_GIF
2 IMAGETYPE_JPEG
3 IMAGETYPE_PNG
4 IMAGETYPE_SWF
5 IMAGETYPE_PSD
6 IMAGETYPE_BMP
7 IMAGETYPE_TIFF_II(Intel 字节顺序)
8 IMAGETYPE_TIFF_MM(Motorola 字节顺序)
9 IMAGETYPE_JPC
10 IMAGETYPE_JP2
11 IMAGETYPE_JPX
12 IMAGETYPE_JB2
13 IMAGETYPE_SWC
14 IMAGETYPE_IFF
15 IMAGETYPE_WBMP
16 IMAGETYPE_XBM

我本地没能复现啊,我那个拓展就是加载不出来,不过也是文件头检测就对了

About this Post

This post is written by Boogipop, licensed under CC BY-NC 4.0.

#CTF#入门#新人同学