攻防世界fileinclude题解

2023-11-19

目录

解题思路

file_get_contents()函数

PHP伪协议

解题思路续


解题思路

  • 先看题目

 

  • 打开题目场景

 

  • 我们看到用了file_get_contents()函数

  • 这里我忘了这个函数是什么意思了,于是又去翻了翻文档

file_get_contents()函数

file_get_contents():

file_get_contents() 把整个文件读入一个字符串中。

该函数是用于把文件的内容读入到一个字符串中的首选方法。如果服务器操作系统支持,还会使用内存映射技术来增强性能。

语法:

file_get_contents(path,include_path,context,start,max_length)

参数 描述
path 必需。规定要读取的文件。
include_path 可选。如果您还想在 include_path(在 php.ini 中)中搜索文件的话,请设置该参数为 '1'。
context 可选。规定文件句柄的环境。context 是一套可以修改流的行为的选项。若使用 NULL,则忽略。
start 可选。规定在文件中开始读取的位置。该参数是 PHP 5.1 中新增的。
max_length 可选。规定读取的字节数。该参数是 PHP 5.1 中新增的。

提示:该函数是二进制安全的。(意思是二进制数据(如图像)和字符数据都可以使用此函数写入。)

  • 下面测试一下这个函数的用法

  • 我们创建两个文件

  • main.php和test.txt

  • 文件路径: test-environment/first

  • 两个文件内容如下:

#main.php:
<?php
 echo file_get_contents("test.txt");
?>
#test.txt
This is a String.
Hello World;

  • 我们访问main.php文件

 

  • 文件里面的内容被当作一个字符串返回

  • 至此我们明白了file_get_contents()函数的基本作用

  • 言归正传,我们到这里就明白了,源码中的意思:需要file2返回的值为 "hello ctf"

  • 而这个file2的值是我们可以控制的一个参数,因此我们只需要让 file2="hello ctf"即可

  • 我们看到代码开头部分有个flag.php 文件,猜测大概率flag就在这里面

  • 因此我们需要对该文件做一个读取,在这里我们需要用到 php伪协议

PHP伪协议

PHP有很多内置 URL风格的封装协议,这类协议与fopen()、 copy()、 file_exists()和filesize()的文件系统函数所提供的功能类似。

在文件包含漏洞这里,我们便可以利用这些伪协议对文件进行一些相关的操作从而达到我们的目的

常用的伪协议如下:

  • php://filter 读取文件源码

  • php://input 任意代码执行

  • data://text/plain 任意代码执行

  • zip:// 配合文件上传开启后门

1. php://filter

  • 介绍:php://filter 协议可以对打开的数据流进行筛选和过滤,常用于读取文件源码

    (allow_url_include和allow_url_fopen都不做要求)

  • 注意:使用文件包含函数包含文件时,文件中的代码会被执行,如果想要读取文件源码,可以使用base64对文件内容进行编码,编码后的文 件内容不会被执行,而是展示在页面中,我们将页面中的内容使用base64解码,就可以获取文件的源码了

  • 用法:

    ?page=php://filter/read=convert.base64-encode/resource={要读取的文件名}

  • 各个参数详解:

名称 描述
resource=<要过滤的数据流> 这个参数是必须的,它指定了你要筛选过滤的数据流
read=<读链的筛选列表> 可选。可以设定一个或多个过滤器名称,以管道符(|)分隔
write=<写链的筛选列表> 可选。可以设定一个或多个过滤器名称,以管道符(|)分隔
任何没有以read=和write=做前缀的,都会视情况应用于读写链
  • 测试:

    • 测试地址:D:\phpstudy_pro\WWW\test-environment\second

    • 我们创建一个文件:demo.php

    • 写入以下内容:

    • #此文件用来测试
      <?php
          phpinfo();
      ?>

    • 在创建一个文件:test.php

    • 写入以下内容:

    • <?php
          $file=$_GET["file"];
          include($file);
      ?>

    • 接下来我们启动phpstudy去访问test.php文件,并传入参数?file=demo.php

    • 按照正常的逻辑demo.php的内容会被解析

    •  

    • 我们发现事实却是是如此,但是如果我们不想demo.php被解析,而是想要获取它的源码怎么办,这个时候我们就需要用file://filter伪协议了

    • 我们构造以下payload:

    • ?file=php://filter/read=convert.base64-encode/resource=demo.php
    • 得到目标文件的源码的base64编码,我们拿去解码看看是不是和源码一致

    •  

    • 答案是正确,至此,我们对php://filter有了一定的了解

     

2.php://input

  • 利用php中流的概念,将原本的include的文件流重定向到了用户可控制的输入流中命令执行

  • (allow_url_include:on,allow_url_fopen不做要求)

  • 用法

    • ?page=php://input
    • 然后用post请求输入想要执行的代码

  • 测试:

    • 测试环境和前面一样,可以往上翻看看,但是这次我们只用test.php一个文件即可,不需要包含demo.php文件,因为我们输入什么就会执行什么

    •  

    • 正常情况下会返回,但是我这里不知道为什么hackbar点击execute没有反应,于是我改变方法抓包试试

    •  

    • 我直接把post请求体写在了这里,放包试试

    •  

       

    • 成功!!!

    • 后来找到hackbar为什么post请求提交不上去的原因了,因为参数必须写成键值对的形式才可以,如key=value

3.data://text/plain

  • 协议格式: data:资源类型;编码,内容

  • php版本大于等于5.2,allow_url_include和allow_url_fopen都为on的状态

  • data://协议通过执行资源类型,使后面的内容当做文件内容来执行,从而造成任意代码执行

  • 用法如下:

    • ?url=data://text/plain,<?php system('id') ?>

    • 和input有点像,但是又不太一样

4.zip://

  • ziip://协议用来读取压缩包中的文件,可以配合文件上传开启后门,获取webshell

    将shell.txt压缩成zip,再将后缀名改为jpg上传至服务器,再通过zip伪协议访问压缩包里的文件,从而链接木马

  • 用法:

    • ?url=zip://shell.jpg

解题思路续

  • 经过上面的知识补充,我们对伪协议有了进一步的认识

  • 那么我们重归此题,我们此时便可以构造下面的payload

    • ?file1=php://filter/read=convert.base64-encode/resource=flag.php&file2=php://input

     

    • burp抓包

    •  

    • 将post请求体内容改为 hello ctf,放包

    •  

    • 得到flag,base64解码即可

  • 现在提供另一种方法

  • 就是用data://协议流

  • payload:

    • ?file1=php://filter/read=convert.base64-encode/resource=flag.php&file2=data://text/plain;base64,aGVsbG8gY3Rm

     

  • data伪协议,base64编码传输,也可达成目的

  • 至此完成,flag为

    • PD9waHAKZWNobyAiV1JPTkcgV0FZISI7Ci8vICRmbGFnID0gY3liZXJwZWFjZXs0Y2Y3N2ZhYWZiYjNmZDRkMjlkMDM2YmRiYjM5NzcwN30=
      ​
      <?php
      echo "WRONG WAY!";
      // $flag = cyberpeace{4cf77faafbb3fd4d29d036bdbb397707}

    • cyberpeace{4cf77faafbb3fd4d29d036bdbb397707}

    •  

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

攻防世界fileinclude题解 的相关文章

  • 如何正确转义 CSV 中的双引号?

    我的 CSV 中有这样一行 Samsung U600 24 10000003409 1 10000003427 旁边引用24用于表示英寸 而该引号旁边的引号则关闭该字段 我正在读这行fgetcsv但解析器犯了一个错误 并将该值读取为 Sam
  • 当错误较多时,Laravel 不会显示错误。这是 Bug?

    重复的https github com laravel framework issues 31123 https github com laravel framework issues 31123 Laravel 版本 6 8 0 6 10
  • 通过 XMLHttpRequest 将数据从 JavaScript 发送到 PHP

    再会 我正在尝试将一段简单的数据从一个 php 文件 manage php 发送到另一个 view php 我无法通过表单发送数据 我想通过 JS 脚本发送数据 这是我的尝试 var read function id xmlhttp new
  • 用于分页的php示例脚本[关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 任何人都可以建议一个好的分页 php 脚本 其中人们想要分页显示数据库中的大量项目 以下链接可以帮助您
  • 在php中获取二进制数据大小的正确方法是什么?

    我已阅读文件的一部分 现在想确保该部分的大小正确 我怎样才能在 php 中做到这一点 part fread file 1024 return some function part 1024 我已经阅读了这些示例 但我怀疑是否要使用 strl
  • 如何在 标签中用 %20 替换空格

    我想替换 html 文本的图像标签中的所有空格 Example img src to img src photo 201 jpg 我没有找到 preg replace 的解决方案 但它可能是一个简单的正则表达式行 谢谢 Edit 抱歉各位
  • 如何为 Lumen 的封闭路线指定路线名称?

    您好 我有以下流明路线 router gt get end function Illuminate Http Request request use router controller router gt app gt make App H
  • PHP/MySQL:检索邻接列表模型中的单个路径

    有没有什么有效的方法可以在不限制深度的情况下根据节点的ID检索邻接列表模型中的单个路径 就像如果我有一个名为 Banana 的节点的 ID 我可以获得以下路径 Food gt Fruits gt Banana 如果不可能的话也不是什么大问题
  • 如何在 PHP 中正确分割路径

    执行以下操作的最佳方法是什么 我通过 AJAX 请求获取路径 e g dir1 dir2 dir3 dir4 我需要在我的网页上这样展示它 dir1 gt gt dir2 gt gt dir3 gt gt dir4 它们每个都是 html
  • 如何在javascript中使用自动递增id?

  • 使用 php 将 HLS Segment (ts) 视频转换并加入到 mp4

    你好我正在使用这个工具 https github com Ejz HLSDownloader https github com Ejz HLSDownloader将 HLS 视频片段从 m3u8 播放列表下载到 ts 文件中 不 我不知道如
  • CSV 从 UTF8 到 ISO-8859-1

    我正在尝试修改我的 CSV 导出 但它不会将我的 CSV 从 UTF 8 转换 保存为 ISO 8859 1 请问我做错了什么吗 实际上自从修改了这个之后 我得到了一个空的 CSV 文件 php 7 0 x function my Gene
  • cURL '格式错误的网址'

    This url 在浏览器中工作得很好 但 cURL 返回错误 3 格式错误的 url 关于解决方法有什么想法吗 EDIT 卷曲代码 function get web page url options array CURLOPT RETUR
  • 使用 DOM 获取 div 的内容(包括子标签)

    我正在使用 DOM 来获取 div 标签的内容 但内部 html 部分未显示 功能是 dom new DOMDocument libxml use internal errors true dom gt loadHTMLFile url l
  • 如何创建环境变量来保护我的网站的 Google 地图 API 密钥(或任何其他秘密值)?

    我正在学习使用 Bootstrap 编写自己的网站 并使用 Google 地图 API 密钥和 Google Developers 的脚本轻松地将地图放置在我的页面上 理想情况下 我会有类似的东西 即我已经尝试过这个 Html PHP
  • 使用 php 和 symfony 从数组创建 Excel 文件

    我正在尝试使用 PHP 和 symfony 将数组导出为 XLS 文件 如下面的代码所示 创建 XLS 文件后 我只能获取数组的最后一行 并且它显示在文件的第一行中 似乎 lignes 变量没有增加 我不明白出了什么问题 有人可以帮忙吗 f
  • 如何使用 PDO 动态构建查询

    我正在使用 PDO 并想做这样的事情 query dbh gt prepare SELECT FROM table WHERE column value query gt bindParam table tableName query gt
  • 使 div 的大小与其内部图像的大小相同

    我有一个带有以下代码的div HTML div img src img logo png div CSS div imgContainer width 250px height 250px padding 13px 问题是用户可以编辑图像大
  • 如何显示不同页眉的页面? [关闭]

    Closed 这个问题需要细节或清晰度 help closed questions 目前不接受答案 我正在为我的学校项目开发网站 但我遇到了一个问题 我在每个页面上显示一个标题 我的标题之一包含登录表单 另一标题包含用户名 搜索栏等 问题是
  • PHP - 查找和比较日期

    你好 我有 foreach 我可以在其中获取数据库中的事件数据 我使用数据库中的日期名称 例如 event date 我需要在一个 div 中比较具有相同日期和输出的操作 例如我有这个事件 活动一 9 月 13 日 活动二 9 月 1 日

随机推荐

  • 未来的智能制造,或许会往这些方向推进

    智能制造 源于人工智能的研究 一般认为智能是知识和智力的总和 前者是智能的基础 后者是指获取和运用知识求解的能力 很多人想要了解智能制造未来的推进方向 今天小编就带大家来了解一下 希望大家能对智能制造多一些认识 能给大家带来帮助 一 更高效
  • mingw qt5.14.2 编译 vtk9.1.0

    1 软件 qt版本 qt opensource windows x86 5 14 2 exe 安装mingw选项 cmake版本 cmake 3 21 2 windows x86 64 msi VTK源码版本 VTK 9 1 0 tar g
  • the type or namespace name ‘xxx‘ could not be found(vs for Mac)解决方法

    在visual studio for Mac中遇到 the type or namespace name xxx could not be found are you missing a using derective or an asse
  • Linux下 mysql8大小写敏感问题

    说明 已经在linux上安装过了mysql 通过以下步骤解决 1 先查看mysql的运行状态 service mysql status 如果为运行状态 则停止 service mysql stop 2 修改 etc my cnf文件 添加l
  • SpringBoot生成docker镜像,完成容器部署

    docker介绍 Docker 是一个开源的应用容器引擎 基于 Go语言 并遵从Apache2 0协议开源 Docker 可以让开发者打包他们的应用以及依赖包到一个轻量级 可移植的容器中 然后发布到任何流行的 Linux 机器上 也可以实现
  • Go 字符串处理

    一 字符串处理函数 我们从文件中将数据读取出来以后 很多情况下并不是直接将数据打印出来 而是要做相应的处理 例如 去掉空格等一些特殊的符号 对一些内容进行替换等 这里就涉及到对一些字符串的处理 在对字符串进行处理时 需要借助于包 strin
  • Spring boot thymeleaf 实现简单-页面国际化

    新建Spring boot项目 pom xml文件
  • python创建socket对象_python如何使用socket来传输对象

    2016 08 09 回答 现在记录https服务端的编写 import ssl socket time if name main context ssl sslcontext ssl protocol sslv23 context loa
  • ubuntu16.04 安装CUDA 8.0 和 cuDNN 5.1 /cudnn6.0,可适用于gpu版本的(tensorflow,caffe,mxnet)

    转载https zhuanlan zhihu com p 27890924文章 略有修改 感谢原作者 环境 ubuntu 16 04 GTX 960 安装步骤 安装Nvidia驱动 系统设置 gt 软件与更新 gt 附加驱动 如下图选择nv
  • Flutter-实现视频播放功能

    1 引入库 video player 0 10 0 2 import package flutter cupertino dart import package flutter material dart import package vi
  • html中如何写div中div的位置,position设置div的位置

    css怎么调整div的位置 可以使用css中的position来对div进行定位来改变div的位置 position可能的值如下 工具原料 编辑器 浏览器 通过设置一个div的position的值来调整div的位置 简单的代码示例如下 bo
  • C语言基础系列(四)——数组

    本期主题 c语言中的数组 C语言基础 数组 1 数组名 1 1 数组名的含义 2 空数组的用法 1 数组名 指针常量 特殊情框 2 指针数组 数组指针 3 空数组 1 数组名 1 1 数组名的含义 可以先看下面的这些声明 int a int
  • Java 工作2年后需要达到怎么样的技术水平

    请具体一点说要会什么技术 以及这些技术要达到什么水平 有人回答说这只能是大企业或者互联网企业的工程师才能拿到 也许是的 小公司或者非互联网企业拿两万的不太可能是码农了 应该是已经转管理后才有可能 还有区域问题 这个不在我的考虑范围内 因为除
  • qq键盘快捷键大全

    qq键盘快捷键大全 Ctrl A 全选 Ctrl B 整理收藏夹 Ctrl C 复制 Ctrl D 删除 添加收藏 在Word中是修改选定字符格式 在IE及傲游 中是保存为收藏 Ctrl E 搜索助理 在Word中是段落居中 Ctrl F
  • 哈希函数

    哈希函数 定义 Hash 一般翻译做散列 杂凑 或音译为哈希 是把任意长度的输入 又叫做预映射pre image 通过散列算法变换成固定长度的输出 该输出就是散列值 这种转换是一种压缩映射 也就是 散列值的空间通常远小于输入的空间 不同的输
  • 国产数据库梳理

    背景介绍及架构介绍 架构上划分 分库分表类 Spanner 架构 OceanBase Shared Storage 总结 当前国产数据库百花齐放 几乎每隔半年就会冒出一家数据库 各大厂商在去年也都更新了自己的数据库产品线名称 太多的数据库让
  • Winrar命令行解压带密码的压缩文件

    1 先自行安装好winrar 这个不用多说 2 我们创建一个压缩文件 这是一个文件夹 里边就2个txt文件 3 我们使用winrar对其进行加密压缩 现在我们就有一个带密码的压缩文件了 3 找到winrar的安装目录 把rar exe拷贝到
  • matlab读入从文件中读取大量的数据

    将文件导入matlab中 除了对利用菜单的操作 我们也可以使用matlab代码 这个是一个函数 这个函数我们提供所读文件的基础的名字 然后返回一个矩阵 function z readOneD basename readOneD BASENA
  • 我认为最好用的网页解析模块Parsel

    前言 众所周知 网页解析4大模块 1 正则表达式 re 2 bs4 BeautifulSoup 3 xpath lxml 4 css选择器 pyquery 大家一定都很熟悉 很多都是从这几个模块入手 本文不对这4个模块评价它们的优略 因为每
  • 攻防世界fileinclude题解

    目录 解题思路 file get contents 函数 PHP伪协议 解题思路续 解题思路 先看题目 打开题目场景 我们看到用了file get contents 函数 这里我忘了这个函数是什么意思了 于是又去翻了翻文档 file get