这是一个值得重视的问题,但并不如文章中说的那么严重,只是希望各位使用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。