个大服务器文件上传漏洞
%00截断
文件名后缀就一个%00字节,可以截断某些函数对文件名的判断。在许多语言函数中,处理字符串的函数中0x00被认为是终止符。
例如:
网站上传函数处理xxx.php%00.jpg时,首先后缀名是合法的jpg格式,可以上传,在保存文件时,遇到%00字符丢弃后面的jpg,文件后缀最终保存的后缀名为xxx.php
00截断上传的原理
php解释器是C语言编写的
C语言中学过字符串的结尾会有00作为字符串结束的标志
在url中%00表示ascll码中的0 ,而ascii中0作为特殊字符保留,表示字符串结束,所以当url中出现%00时就会认为读取已结束
0x00,%00,/00之类的截断,都是一样的
条件
%00截断有两个条件php版本小于5.3.4和magic_quotes_gpc为off状态。 如果这时我们将magic_quotes_gpc改为on那么就不能截断了,因为开启magic_quotes_gpc后%00会被加上一个反斜杠转义掉
漏洞复现
$_FILES数组内容
$_FILES[‘myFile’][‘name’] 客户端文件的原名称
$_FILES[‘myFile’][‘type’] 文件的 MIME类型,需要浏览器提供该信息的支持,例如"image/gif"
$_FILES[‘myFile’][‘size’] 已上传文件的大小,单位为字节
$_FILES[‘myFile’][‘tmp_name’] 文件被上传后在服务端储存的临时文件名,一般是系统默认,可以在php.ini的upload_tmp_dir指定,但用 putenv() 函数设置是不起作用的
$_FILES[‘myFile’][‘error’] 和该文件上传相关的错误代码,[‘error’] 是在 PHP 4.2.0版本中增加的,下面是它的说明:(它们在PHP3.0以后成了常量)
注: