当前位置:Linux教程 - Php - php文件上载暴露任意文件

php文件上载暴露任意文件

PHP文件上载暴露任意文件

---摘自互联网

这是一个值得重视的问题,但并不如文章中说的那么严重,只是希望各位使用php上传文件是留心这个问题。  

【来源】  
Secure  Reality  Pty  Ltd.  Security  Advisory  #1  (SRADV00001)  
http://www.securereality.com.au,2000-09-04  

【影响系统】  
几乎任何提供文件上载能力的PHP程序都受影响。  

【简介】  
PHP是一个功能很强的web脚注语言,已经广泛流行。它有一个特性就是易于处理从远程浏览器上载来的文件。这个功能运用得非常普遍,特别是在图片画廊、拍卖和web邮件风格的应用中。  

PHP处理文件上载的方法容易使PHP应用程序工作于服务器上的任意文件,而不是用户上载来的文件。这通常会引导远程攻击者读取服务器上的任何文件,而它们通常只能被运行web服务器(一般是’nobody’)的用户访问。  

【影响】  
1.暴露文件  
2.经常会泄漏PHP代码  
3.经常会泄漏数据库认证数据  
4.可能使机器崩溃  

【细节】  
当文件上载给一个PHP脚本时,PHP接收文件,赋予它一个随机名称,然后把它放在一个配置好的临时目录中。上载文件的信息将传递给PHP脚本,内容是4个全局变量。假设信息的文件域叫做’hello’,那么4个变量将会是:  
$hello  =  临时文件名  (例如  ’/tmp/ASHDjkjbs’)  
$hello_name  =  当文件位于远程计算机时的名称  (例  ’c:\hello.tmp)  
$hello_type  =  文件的Mime类型  (例如  ’text/plain’)  
$hello_size  =  上载文件的大小  (例如  2000  字节)  

临时文件会在脚本执行结束时自动删除,因此PHP脚本通常需要把它移到其它地方。例如,它可能会把文件拷贝到一个MySQL数据库之中。  

问题实际上存在于PHP缺省的行为。除非特意进行另外的配置(通过php.ini文件里的register_globals  =  Off),否则,提交时表格域指定的值在PHP脚本中会自动定义为全局变量。  

如果有一个表,它的输入域是:  
<input  name="test">  
那么当PHP脚本被调用来处理表格输入时,就会设置全局变量$test。这是一个严重的安全弱点。问题非常简单,通过用户定义的输入搅乱全局名字空间,就会使环境不稳定。  

回到前面提到的示例,我们可以使用如下的表格输入创建四个变量$hello,  
$hello_name,  $hello_type,  $hello_size:  

这就会引导PHP脚本工作于口令文件,结果通常是将它暴露给攻击者。  

【补丁】  
目前没有。  
建议改变php.ini,设置register_globals为off,  track_vars  为  on。