PHP的$_FILES数组

如果网页有文件上传的表单,那么在客户端提交之后,就有一个$_FILES数组可以直接利用

1
2
3
4
5
6
1 $_FILES['File']['name'] 客户端文件的原名称。
2 $_FILES['File']['type'] 文件的 MIME 类型,需要浏览器提供该信息的支持,例如"im
age/gif"。
3 $_FILES['File']['size'] 已上传文件的大小,单位为字节。
4 $_FILES['File']['tmp_name'] 文件被上传后在服务端储存的临时文件名,一般是系统默
认。可以在php.ini的upload_tmp_dir 指定,但 用 putenv() 函数设置是不起作用的。

什么是MIME类型?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
MIME type的全称为Multipurpose Internet Mail Extensions(多用途互联网邮件扩展类型)
是设定某种扩展名的文件用一种应用程序来打开的方式类型,当该扩展名文件被访问的时候,浏览
器会自动使用指定应用程序来打开。Response对象通过设置ContentType使客户端浏览器,区分
不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据。
MIME type类型格式
类别/子类别;参数 Content-Type: [type]/[subtype]; parameter
MIME type主类别
text:用于标准化地表示的文本信息,人类可读的,可以是多种字符集和或者多种格式;
Multipart:用于连接消息体的多个部分构成一个消息,这些部分可以是不同类型的数据;
Application:用于传输应用程序数据或者二进制数据;
Message:用于包装一个E-mail消息;
Image:用于传输静态图片数据;
Audio:用于传输音频或者音声数据;
Video:用于传输动态影像数据,可以是与音频编辑在一起的视频数据格式。
1
2
对于text文件类型若没有特定的subtype,就使用 text/plain。类似的,二进制文件没有特定或已
知的 subtype,即使用 application/octet-stream。

文件上传校验方式概述

用HTTP协议传输文件到服务器时,将以POST请求的形式发送到服务器,一般来说会有如下几个步骤

img

一个特别的攻击方法——PUT方法

1
2
3
WebDAV是一种基于HTTP1.1的通信协议,他在GET,POST,HEAD等HTTP常用方法的基础上扩展
了一些新的方法,使得应用程序可以直接对服务器进行读写操作,当WebDAV开启
PUT,MOVE,DELETE攻击者就可以向服务器上传危险脚本。

服务器解析漏洞

一、apache解析漏洞

1
apache的文件解析的基本流程
  1. 客户端请求文件
  2. 查找mime.type里是否有这种mime类型
  3. 如果有,返回相应的content-type给浏览器,并将文件交给相应的处理器处理
    如果没有,就不返回content-type给浏览器,直接返回文件内容。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
解析缺陷漏洞
apache解析文件是从右往左开始判断解析的,直到找到一个可以解析的后缀名(apache可以解析的文件后缀名都记录在 Apache/conf/mine.type 这个文件里面了),
比如说,demo.php.owf.rar,在这个文件名中owf、rar都是apache无法识别的后缀名, apache就会把这个文件解析成PHP文件

一个有趣的问题

我在调试这个漏洞的时候,发现总是返回500错误,既不正常执行文件,也不返回文件内容,后来才知道了这PHP与apache的交互方式,以及php识别文件的设置有关相关
PHP识别文件
当apache把解析成php文件之后,会把文件交给php处理,但是php会再一次检验文件,这是检验
的正则:".+\.ph(p[ 345 ]?|t|tml)$" 可以看出PHP只认最后一个后缀名。
apache和PHP交互的方式主要有两种
CGI方式:使用此模式时,当动态请求到达时,httpd会临时启动一个CGI解释器,并用CGI协议转
发要执行的内容,CGI程序运行结束之后会将结果返回给httpd,然后自毁。当面对多个动态请求
时,就要先后启动多个CGI解释器,因此效率极低。不过可以使用FASTCGI让CGI解释器更快的实
现,提升效率
模块方式:将php的模块编译到apache之中,在这种交互模式下,httpd在启动时就会激活、加载
php模块,这就意味着,php会一直在httpd的底层挂载,只要请求到达,就把请求直接转发给内
部的php模块。
没有修改php识别文件的正则匹配时上传demo.php.xxx这种文件,处于CGI(FASTCGI)模式
时PHP解释器就会返回500错误,处于模块模式就会直接返回文件内容

配和hatccess文件上传(要求使用模块方式)

1
2
3
4
.htaccess文件是Apache服务器中的一个配置文件,它负责相关目录下的网页配置。通过htaccess
文件,可以实现:网页301重定向、自定义404错误页面、改变文件扩展名、允许/阻止特定的用户
或者目录的访问、禁止目录列表、配置默认文档等功能IIS平台上不存在该文件,该文件默认开启,
启用和关闭在httpd.conf文件中配置,在文件解析漏洞中只关心他的一个功能——修改MIME类型

有些上传没有过滤掉htaccess文件,那么就可以上传一个htaccess文件来使服务器把上传的文件当作php解析。在.htaccess文件中写入

1
1 AddType application/x‐httpd‐php xxx

就可以使.htaccess文件所在目录及其子目录中的后缀为.xxx的文件被Apache当做php文件解析。

二、IIS6.x解析漏洞(使用这个版本的网站大多比较老,开发语句一般为asp)

路径解析漏洞

原理:服务器默认会把.asp,.asa目录下的文件都解析成asp文件例如:demo.asp/shell.jpg 其中的shell.jpg就会被当作asp文件解析

文件解析漏洞

原理:服务器默认不解析;号后面的内容,因此xx.asp;.jpg便被解析成asp文件了例如:demo.asp;.jpg , 会被解析成asp文件

.user.ini文件

1
2
3
那么什么是.user.ini?
php.ini是php默认的配置文件,其中包括了很多php的配置,这些配置中,又分为几种:
PHP_INI_SYSTEM、PHP_INI_PERDIR、PHP_INI_ALL、PHP_INI_USER。
1
2
3
4
5
6
自 PHP 5.3.0 起,PHP 支持基于每个目录的 .htaccess 风格的 INI 文件。此类文件仅被 CGI/
FastCGI SAPI 处理。此功能使得 PECL 的 htscanner 扩展作废。如果使用 Apache,则用
.htaccess 文件有同样效果, .user.ini 风格的 INI 文件中只有具有 PHP_INI_PERDIR 和
PHP_INI_USER 模式的 INI 设置可被识别。
总之,user.ini实际上就是一个可以由用户“自定义”的php.ini,我们能够自定义的设置是模式
为“PHP_INI_PERDIR 、 PHP_INI_USER”的设置

在php的配置有两项配置可以利用

1
2
1 auto_append_file PHP_INI_PERDIR
2 auto_prepend_file PHP_INI_PERDIR

这两个配置可以使.user.ini文件影响的范围内每个php文件自动包含一个文件,那么就可以

通过这个配置直接包含一个后门

构造.user.ini文件

1
1 auto_prepend_file=shell.gif