【PHP代码审计】文件上传

o-O-oO / 2024-10-08 / 原文

一、认识上传漏洞

文件上传漏洞是指用户上传了一个可执行的脚本文件,并通过此脚本文件获得了执行服务器端命令的能力,这种攻击方式是最直接和有效的文件上传本身是没问题的,有问题的是文件上传后,服务器怎么处理,解析文件。通过服务器的处理逻辑做的不够安全,则会导致上传漏洞。

二、上传漏洞的条件

1.文件可上传
2.知道上传文件的路径
3.上传的文件可被解析

三、上传漏洞的相关知识

$ FILES  //全局数组
$_FILES['myFile"]['name'] //显示客户端文件的原名称
$_FILES['myFile’]['type'] //文件的 MIME 类型,例如"image/gif"
$_FILES['myFile]['size"] //已上传文件的大小,单位为字节
$_FILES['myFile"][tmp_name"] //储存的临时文件名,一般是系统默认
$_FILES['myFile]['error'] //该文件上传相关的错误代码

四、相关函数

move_uploaded_file(file,newloc) //函数将上传的文件移动到新位置
strtolower() //函数把字符串转换为小写。
trim() //函数移除字符串两侧的空白字符或其他预定义字符。
strrchr() //函数查找字符串在另一个字符串中最后一次出现的位置,并返回从该位置到字符串结尾的所有字符。
strireplace() //函数替换字符串中的一些字符(不区分大小写)。
getimagesize() //函数用于获取图像大小及相关信息,成功返回一个数组,失败则返回FALSE 并产生一条E WARNING 级的错误信息。
exif_imagetype() //读取一个图像的第一个字节并检查其签名substr0 函数返回字符串的一部分。
fopen() //函数打开文件或者 URL。
fread() //函数读取文件(可安全用于二进制文件)
fwrite()) //函数写入文件(可安全用于二进制文件)0

五、判断上传漏洞的类型

六、上传漏洞的检测方式

客户端校验:

使用JS来判断后缀名

服务端校验:

1.对数据包的MIME进行检查

2.后缀名黑名单校验

3.后缀名白名单校验

4.文件头检查

5.二次渲染

6.条件竞争

七、代码分析

具体代码可以去看upload-libs