文件包含漏洞

目录

一、文件包含

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)绕过](#(1)空字符 (%00)绕过)

[(2) 超长字符绕过 ./././././././ //](#(2) 超长字符绕过 ./././././././ //)

[​编辑 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)
相关推荐
用户962377954483 小时前
DVWA 靶场实验报告 (High Level)
安全
数据智能老司机7 小时前
用于进攻性网络安全的智能体 AI——在 n8n 中构建你的第一个 AI 工作流
人工智能·安全·agent
数据智能老司机7 小时前
用于进攻性网络安全的智能体 AI——智能体 AI 入门
人工智能·安全·agent
用户962377954488 小时前
DVWA 靶场实验报告 (Medium Level)
安全
red1giant_star8 小时前
S2-067 漏洞复现:Struts2 S2-067 文件上传路径穿越漏洞
安全
用户9623779544812 小时前
DVWA Weak Session IDs High 的 Cookie dvwaSession 为什么刷新不出来?
安全
cipher2 天前
ERC-4626 通胀攻击:DeFi 金库的"捐款陷阱"
前端·后端·安全
一次旅行5 天前
网络安全总结
安全·web安全
red1giant_star5 天前
手把手教你用Vulhub复现ecshop collection_list-sqli漏洞(附完整POC)
安全
ZeroNews内网穿透5 天前
谷歌封杀OpenClaw背后:本地部署或是出路
运维·服务器·数据库·安全