文件上传漏洞之图片缩略图

现在背景如下: 

1. 有上传点, 服务器支持PHP
2. 扩展名可自定义
3. 文件的文件会经过GD库处理生成缩略图,原图不会被保存. 如果GA加载不了上图的文件,上传会失败.

尝试了几种失败的办法. 

1. 直接上传PHP

失败. 因为GD无法加载这个文件。 所以要想过GD一定要上传图片文件。

2. JPG/PNG 尾部添加PHP代码

失败. 原图被丢弃, GD只会读取有效数据. 

3. JPG/PNG 图片, 将中间的一段二进制数据改为PHP代码

失败. 有校验和,图片加载失败.  

对于JPG/PNG图片,第一个能想到能写入PHP代码的是一些可选头部. 可写入一些自定义的信息. 但这个案例不行。 经过GD库后,所有可选头部都被丢弃. 必选的头部没有可用字段。数据段有压缩算法的存在, 写入数据也有很大的难度。 因为即便是构造出压缩后的数据,被GD还原后再压缩就不一定是有效的代码了. 

所以自然就想到不需要压缩算法的BMP图片。 具体步骤如下:

1. 先随便上传一张图片,测试缩略图容器的长宽. 比如是1000x1000
2. PS生成一张1000x1000的BMP图片以确保图片不会被压缩
3. 中间以覆盖的方式写入PHP代码
4. 上传结果:成功

到此上传漏洞利用完毕. 

防范: 

1. 尽量不存储BMP图片, JPG/PNG 压缩后存储
2. 不能让用户自定义后缀
3. 用户上传的文件存储与代码分离. (哪怕是不能自定义后缀,也难免会有本地文件包含漏洞)



文章来自: 本站原创
Tags:
评论: 0 | 查看次数: 5849