博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
PHP漏洞全解(九)-文件上传漏洞
阅读量:6414 次
发布时间:2019-06-23

本文共 1932 字,大约阅读时间需要 6 分钟。

本文主要介绍针对PHP网站文件上传漏洞。由于文件上传功能实现代码没有严格限制用户上传的文件后缀以及文件类型,导致允许攻击者向某个可通过 Web 访问的目录上传任意PHP文件,并能够将这些文件传递给 PHP解释器,就可以在远程服务器上执行任意PHP脚本,即文件上传漏洞。

一套web应用程序,一般都会提供文件上传的功能,方便来访者上传一些文件。

下面是一个简单的文件上传表单

  1. <form action="upload.php" method="post" enctype="multipart/form-data" name="form1"
  2. <input type="file" name="file1" /><br /> 
  3. <input type="submit" value="上传文件" /> 
  4. <input type="hidden" name="MAX_FILE_SIZE" value="1024" /> 
  5. form

php的配置文件php.ini,其中选项upload_max_filesize指定允许上传的文件大小,默认是2M

$_FILES数组变量

PHP使用变量$_FILES来上传文件,$_FILES是一个数组。如果上传test.txt,那么$_FILES数组的内容为:

  1. $FILES 
  2. Array 
  3. [file] => Array 
  4. [name] => test.txt //文件名称 
  5. [type] => text/plain //MIME类型 
  6. [tmp_name] => /tmp/php5D.tmp //临时文件 
  7. [error] => 0 //错误信息 
  8. [size] => 536 //文件大小,单位字节 

如果上传文件按钮的name属性值为file

  1. <input type="file" name="file" /> 

那么使用$_FILES['file']['name']来获得客户端上传文件名称,不包含路径。使用$_FILES['file']['tmp_name']来获得服务端保存上传文件的临时文件路径

存放上传文件的文件夹

PHP不会直接将上传文件放到网站根目录中,而是保存为一个临时文件,名称就是$_FILES['file']['tmp_name']的值,开发者必须把这个临时文件复制到存放的网站文件夹中。

$_FILES['file']['tmp_name']的值是由PHP设置的,与文件原始名称不一样,开发者必须使用$_FILES['file']['name']来取得上传文件的原始名称。

上传文件时的错误信息

$_FILES['file']['error']变量用来保存上传文件时的错误信息,它的值如下:

错误信息 数值 说 明
UPLOAD_ERR_OK 0 没有错误
UPLOAD_ERR_INI_SIZE 1 上传文件的大小超过php.ini的设置
UPLOAD_ERR_FROM_SIZE 2 上传文件的大小超过HTML表单中MAX_FILE_SIZE的值
UPLOAD_ERR_PARTIAL 3 只上传部分的文件
UPLOAD_ERR_NO_FILE 4 没有文件上传

文件上传漏洞

如果提供给网站访问者上传图片的功能,那必须小心访问者上传的实际可能不是图片,而是可以指定的PHP程序。如果存放图片的目录是一个开放的文件夹,则入侵者就可以远程执行上传的PHP文件来进行攻击。

下面是一个简单的文件上传例子:

  1. php 
  2. // 设置上传文件的目录 
  3. $uploaddir = "D:/www/images/"; 
  4. // 检查file是否存在 
  5. if (isset($_FILES['file1'])) 
  6. // 要放在网站目录中的完整路径,包含文件名 
  7. $uploadfile = $uploaddir . $_FILES['file1']['name']; 
  8. // 将服务器存放的路径,移动到真实文件名 
  9. move_uploaded_file($_FILES['file1']['tmp_name'], $uploadfile); 
  10. ?> 
  11. …… 
  12. <form method="post" enctype="multipart/form-data" name="form1"
  13. <input type="file" name="file1" /><br /> 
  14. <input type="submit" value="上传文件" /> 
  15. <input type="hidden" name="MAX_FILE_SIZE" value="1024" /> 
  16. form

这个例子没有检验文件后缀,可以上传任意文件,很明显的上传漏洞

转载地址:http://egbra.baihongyu.com/

你可能感兴趣的文章
Dubbo/HSF在Service Mesh下的思考和方案
查看>>
Django form表单
查看>>
CTYL-9.14(tomcat端口与阿里云安全组,域名与tomcat配置,域名与反向代理)
查看>>
Java 多线程相关问题记录
查看>>
LNMP架构介绍、MySQL安装、PHP安装、 Nginx介绍
查看>>
简单的Spark+Mysql整合开发
查看>>
阿里java面试经验大汇总(附阿里职位需求)
查看>>
Python全套零基础视频教程+软件2018最新编程视频!
查看>>
内存管理之1:x86段式内存管理与保护模式
查看>>
20180925上课截图
查看>>
IO输入/输出流的简单总结
查看>>
JavaScript之DOM-9 HTML DOM(HTML DOM概述、常用HTML DOM对象、HTML表单)
查看>>
技术成长之路(一)
查看>>
中国北方国际五金城硬件选型
查看>>
php.exe启动时提示缺少MVCR110.dall 64位 window系统 解决
查看>>
判断是否为数字方法
查看>>
[翻译] EF Core in Action 关于这本书
查看>>
js Uncaught TypeError: undefined is not a function
查看>>
数据库存储引擎
查看>>
[2019.2.13]BZOJ4318 OSU!
查看>>