文件包含漏洞

目录

 一、文件包含

1.什么是文件包含

2.文件包含常见PHP函数

二、文件包含漏洞

1.文件包含漏洞产生原因

2.文件包含漏洞分类

(1)本地文件包含漏洞

(2)远程文件包含漏洞

3.文件包含漏洞特点

(1)无视文件扩展名

(2)无条件解析PHP代码

三、PHP伪协议

1.file://协议

2.php://协议

(1)php://filter       

(2)php://input

3.zip://协议

4.data://协议

四、文件包含漏洞绕过方式

1.本地文件包含绕过

(1)空字符 (%00)绕过

(2) 超长字符绕过    ./././././././ //

​编辑 2.远程文件包含绕过

空字符绕过、超长字符绕过(././././././)、?绕过、#绕过(需使用编码%23)、空格绕过(需使用编码%20)


学习参考:

文件包含漏洞详解-CSDN博客

攻防_漏洞_文件包含_文件包含漏洞详解_ctf 文件包含-CSDN博客

【web安全】——文件包含漏洞-CSDN博客

https://blog.csdn.net/m0_46467017/article/details/126380415

 一、文件包含

1.什么是文件包含

程序开发人员会把重复使用的函数、变量、类等数据写到单个文件中,需要使用到里面的数据时直接调用此文件,而无需再次编写,这种文件调用的过程称为文件包含。

2.文件包含常见PHP函数

include()         //代码执行到include()函数时将文件包含进来并运行
                  //包含文件发生错误时,程序警告,但会继续执行。

include_once()    //与include()类似,唯一区别是文件已经被包含则不再包含。
require()       //与include()的区别:执行如果发生错误,函数会输出错误信息,并终止脚本的运行。
require_once()  //与require()类似,唯一区别是文件已经被包含则不再包含
highlight_file()、show_source()    //函数对文件进行语法高亮显示,通常能看到源代码
readfile()、file_get_contents()    //函数读取一个文件,并写入到输出缓冲
fopen()    //打开一个文件或者url

二、文件包含漏洞

1.文件包含漏洞产生原因

程序开发人员希望代码更灵活,所以将被包含文件设置成变量,来进行动态调用。

但正是由于这种灵活性,从而导致客户端可以调用一个恶意文件,造成文件包含漏洞。

2.文件包含漏洞分类

(1)本地文件包含漏洞

本地文件包含LFI (Local File lnclude):被包含的文件在服务器本地

e.g 在本地创建这两个文件

phpinfo.php代码:

<?php
	phpinfo();
?>

测试网页include1.php代码:

<?php
	$file=$_GET['filename'];
	include($file);
?>
//从URL参数$_GET['filename']获取文件名,然后使用include()函数包含这个文件。
//如果攻击者能够控制filename参数,就可以让服务器执行任意的PHP代码或包含任意文件。

网站利用文件包含功能 可以读取一些php文件,从而得到一些系统本地的敏感信息。

如通过include()函数来执行读取phpinfo.php页面:

(也可以使用绝对路径、相对路径读取)

绝对路径读取敏感文件

//windows敏感文件绝对路径

C:\boot.ini                       #查看系统版本
C:\windows\system32\inetsrv\MetaBase.xml      #IIS配置文件
C:\windows\repair\sam          #存储Windows的密码
C:\programFiles\mysql\my.ini     #mysql配置文件,里面可能有密码
C:\programFiles\mysql\data\mysql\user.MYD      #mysql root密码
C:\windows\php.ini             #php配置文件
//linux敏感文件绝对路径

/etc/passwd                      #用户密码
/usr/local/app/apache2/conf/httpd.conf         #apache2默认配置文件
/usr/local/app/apache2/conf/extra/httpd-vhosts.conf   #虚拟网站设置
/usr/local/app/php5/lib/php.ini       #php相关设置        
/etc/httpd/conf/httpd.conf           #apache配置文件        
/etc/my.cnf                       #mysql配置文件
/etc/sysconfig/iptables              #查看防火墙策略
(2)远程文件包含漏洞

远程文件包含RFL (Remote File Include):利用外部服务器中的文件进行执行

PHP 行事准则:allow_url_fopen 与 allow_url_include_allow_url_fopen为on-CSDN博客

前提:需要在php.ini中的配置选项中allow_url_fopenallow_url_includeON。此时include()、require()函数可以加载远程文件。

allow_url_fopen:on   

allow_url_include:on

3.文件包含漏洞特点

(1)无视文件扩展名

当使用PHP中的一些函数的时,无论文件后缀是什么,这个文件都会被当作PHP代码进行执行。

e.g 此处后缀.jpg也可执行成功

(2)无条件解析PHP代码

文件包含漏洞在读取源码的时候,若遇到符合PHP语法规范的代码,将会无条件执行。

三、PHP伪协议

(PHP支持的协议与封装协议)

1.file://协议

用于访问本地文件系统,在CTF中通常用来读取本地文件且不受allow_url_fopen与allow_url_include的影响

file:// [文件的绝对路径和文件名]

2.php://协议

访问各个输入/输出流(I/O streams),在CTF中经常使用的是php://filter和php://input

php://filter        用于读取源码。
php://input       用于执行php代码。

(1)php://filter       

读取源代码并进行base64编码输出。

有一些敏感信息会保存在php文件中,如果直接利用文件包含去打开一个php文件,php代码不会显示在页面上

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

//使⽤ convert.base64-encode 或 convert.base64-decode 来进⾏base64编码或解码
//convert.* 过滤器

条件:allow_url_fopen :off/on

           allow_url_include:off/on

(2)php://input

访问请求的原始数据的只读流,将post请求中的数据作为PHP代码执行。

当传入的参数作为文件名打开时,可以将参数设为php://input,同时post想设置的文件内容,php执行时会将post内容当作文件内容。从而导致任意代码执行。

file=php://input

条件:allow_url_fopen :off/on

           allow_url_include:on

利用该方法,可以直接写入php文件,输入file=php://input,然后使用burp抓包,写入php代码

3.zip://协议

访问压缩包里面的文件。

当它与包含函数结合时,zip://流  会被当作php文件执行。从而实现任意代码执行。

  • zip://绝对路径
  • 要用#分割压缩包和压缩包里的内容,并且#要用url编码成%23
  • 只需要是zip的压缩包即可,后缀名可以任意更改。
  • 相同的类型还有  zlib:// 、 bzip2://  、phar://
zip://[压缩包绝对路径]#[压缩包内文件]
e.g
?file=zip://D:/1.zip%23phpinfo.php

条件:allow_url_fopen :off/on

           allow_url_include:off/on

4.data://协议

与php://input类似,可以让用户来控制输入流。

当它与包含函数结合时,用户输入的data://流  会被当作php文件执行。从而导致任意代码执行。

利用data:// 伪协议可以直接达到执行php代码的效果,例如执行phpinfo()函数:

data://text/plain,<?php phpinfo();?>

//如果对特殊字符进行了过滤,可以通过base64编码后再输入:
data://text/plain;base64,PD9waHAgcGhwaW5mbygpPz4=

条件:allow_url_fopen :on

           allow_url_include:on

四、文件包含漏洞绕过方式

//新建include2.php:

<?php
$name=$_GET['name'];
include($name.".lllllllll");
?>

正常访问界面,发现访问的文件后面被添加了.lllllllll(使用以下方法绕过.lllllllll)

1.本地文件包含绕过

(1)空字符 (%00)绕过

要求PHP版本小于5.3.4,设置一下(这里用的小皮)

(2) 超长字符绕过    ./././././././ //

 2.远程文件包含绕过

空字符绕过、超长字符绕过(././././././)、?绕过、#绕过(需使用编码%23)、空格绕过(需使用编码%20)

相关推荐

  1. 文件包含漏洞讲解

    2024-04-30 00:04:02       69 阅读
  2. 文件包含漏洞

    2024-04-30 00:04:02       53 阅读
  3. 初探文件包含漏洞

    2024-04-30 00:04:02       45 阅读
  4. Xss文件包含漏洞

    2024-04-30 00:04:02       36 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-04-30 00:04:02       98 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-04-30 00:04:02       106 阅读
  3. 在Django里面运行非项目文件

    2024-04-30 00:04:02       87 阅读
  4. Python语言-面向对象

    2024-04-30 00:04:02       96 阅读

热门阅读

  1. 6-动态路由

    2024-04-30 00:04:02       31 阅读
  2. ns模拟器+资源

    2024-04-30 00:04:02       33 阅读
  3. 【Spring AI】03. 开始

    2024-04-30 00:04:02       31 阅读
  4. Dubbo 面试题(十一)

    2024-04-30 00:04:02       29 阅读
  5. 「PHP系列」PHP Exception(异常处理)

    2024-04-30 00:04:02       38 阅读
  6. LeetCode 239. 滑动窗口最大值

    2024-04-30 00:04:02       36 阅读
  7. 2024.4.29力扣刷题记录-数组篇记录4

    2024-04-30 00:04:02       38 阅读
  8. 三层交换机原理

    2024-04-30 00:04:02       29 阅读