首页 -> 安全研究

安全研究

绿盟月刊
绿盟安全月刊->第13期->最新漏洞
期刊号: 类型: 关键词:
PHP 文件上传可能导致系统文件泄漏

日期:2000-09-12

受影响的系统:  
所有使用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";
}

?>


版权所有,未经许可,不得转载