549 字
3 分钟
文件包含

文件包含#

通常搭配文件上传来使用,因为文件包含你需要知道文件名,搭配伪协议等

文件包含又分为:LFI local file include 本地文件包含 和 RFI remote file include 远程文件包含

思路#

local file include

  1. 通过文件上传,上传文件在服务器上
  2. 没有文件上传,借助日志文件(UA),session文件写入
  3. 伪协议没有上传文件也能进行PHP代码执行,读文件,写文件(编码算法转换)

image.png

伪协议#

条件#

  • allow_url_fopen/on
  • allow_url_include /on

使用方法#

segmentfault.com

  1. file:// 用于访问本地文件系统

    file://E:\phpStudy\PHPTutorial\WWW\phpinfo.txt
  2. php://php://inputphp://outputphp://fdphp://memoryphp://tempphp://filter 比较常用的是inputfilter

    其中php://filter 有字符串过滤器,转换过滤器,压缩过滤器,加密过滤器

    php://filter/read=convert.base64-encode/resource=[文件名]
    php://filter/resource=[文件名] 直接读取
    php://input + [POST DATA]
  3. zip:// & bzip2:// & zlib:// 尚未了解

    zip://[压缩文件绝对路径]%23[压缩文件内的子文件名]
  4. data://

    data://text/plain,<?php%20phpinfo();?>
    data://text/plain;base64,<-base64编码->
  5. http:// & https://

  6. phar://

session条件竞争#

默认保存路径:/tmp/var/lib/php/session

# 必备条件

session.upload_progress.enabled = on:该参数设置为On时,才会进行文件上传进度的记录。

session.upload_progress.cleanup = on:该参数开启时,会在文件上传结束时对用户session内容进行自动清除。

session.upload_progress.name = "PHP_SESSION_UPLOAD_PROGRESS":	该参数与prefix作为我们的键名。方便我们的shell编写,可控。

session.upload_progress.prefix = "upload_progress_":该参数表示与name一起构成我们的键名。

【文件包含&条件竞争】详解如何利用session.upload_progress文件包含进行… - FreeBuf网络安全行业门户

php.ini中session.use_strict_mode选项默认是0,在这个情况下,用户可以自己定义自己的sessionid,例如当用户在cookie中设置sessionid=Lxxx时,PHP就会生成一个文件/tmp/sess_Lxxx,此时也就初始化了session,并且会将上传的文件信息写入到文件/tmp/sess_Lxxx中去

利用Python的多线程,进行条件竞争

filter使用iconv来绕过#

convery.iconv.*的使用有两种方法:
convert.iconv.<input-encoding>.<output-encoding> 
 
convert.iconv.<input-encoding>/<output-encoding>

常用 ucs-2beucs-2le

思路:先用linuxpayload进行编码,之后使用filter对传入payload进行解码,例如ctfshow - web117

windows下文件包含#

  1. 尝试读取 c:\WINDOW\system.ini
  2. 成功读取剩下的常规操作
文件包含
https://sunset-blog.top/posts/文件包含/
作者
Sunset
发布于
2025-03-09
许可协议
CC BY-NC-SA 4.0