PHP 文件上传可能导致系统文件泄漏
发布日期:2000-09-05
更新日期:2000-09-05
受影响系统:
所有使用PHP文件上传的操作系统
描述:
PHP 是一个应用日益广泛的web脚本编程语言。它有一个特点就是可以方便的通过浏览器
上传文件。特别是在一些提供照片夹或者webmail方式的应用程序中,常常使用这个功能。
然而由于存在一个安全漏洞,攻击者可以利用文件上传功能读取系统中任何以web
server运行身份(通常是nobody)有权读取的文件。包括PHP源代码(可能包括一些数据库
认证信息),口令文件以及其他敏感文件。
当一个文件通过PHP脚本上传时,PHP接收文件,然后使用随机文件名并将其放到一个临时
目录下。假设表单中设定的文件变量名为:'file',那么PHP内置使用4个变量来保存相关
信息:
'file' = 临时文件名(例如:'/tmp/ASFSsefga')
'file_name' = 远程主机上的文件名 (例如:"C:\test.txt")
'file_type' = 文件类型 (例如: 'text/plain')
'file_size' = 上传文件大小
临时文件在上传结束后会自动被删除,因此通常PHP脚本会将此文件拷贝到其他地方。
通常使用copy($file,somepath)之类的命令,但是如果用户通过提交的表单指定$file
的内容,那么PHP脚本就会接受这个内容作为临时文件名。因此会拷贝用户指定的文件
到某个目录下,如果这个目录可以通过WWW访问,就会泄漏系统文件。
<*来源:
create@SECUREREALITY.COM.AU *>
测试方法:
警 告
以下程序(方法)可能带有攻击性,仅供安全研究与教学之用。使用者风险自负!
提交下列表单,就可能看到/etc/passwd文件:
...
<INPUT TYPE="hidden" NAME="hello" VALUE="/etc/passwd">
<INPUT TYPE="hidden" NAME="hello_name" VALUE="c:\scary.txt">
<INPUT TYPE="hidden" NAME="hello_type" VALUE="text/plain">
<INPUT TYPE="hidden" NAME="hello_size" VALUE="2000">
....
建议:
下载并替换原有的rfc1867.c,并重新编译PHP 4.
http://cvsweb.php.net/viewcvs.cgi/~checkout~/php4/main/rfc1867.c?rev=1.45&content-type=text/plain
临时解决办法:
在PHP脚本中检查上传文件大小和实际的临时文件大小是否一致,这可以抵挡大部分的攻击,
除非攻击者知道确切的文件大小。例子代码如下:
<?php
if($userfile_size != filesize($userfile)){
echo "File upload variables have been tampered with.\n";
}
?>
浏览次数:6679
严重程度:0(网友投票)