文件包含

  • 文件包含漏洞
    原理:在进行文件包含时,应用程序未对用户控制的文件路径或文件名进行严格过滤,导致攻击者能够包含并执行任意文件。
    web应用对用户输入没有进行严格过滤就带入文件包含函数中执行,在代码引入其他文件作为PHP文件执行时,未对文件进行严格过滤,导致用户指定任意文件,都作为php文件解析执行。
    文件包含漏洞也是一种注入型漏洞,输入一段用户能够控制的脚本或代码,并让服务端执行。
    包含:PHP中,把重复使用的函数写入单个文件中,在使用该函数时,直接调用此文件,无需再次编写函数,这个过程叫包含。
    1、本地文件包含:读取和打开本地文件
    2、远程文件包含:通过HTTP、HTTPS、PHP伪协议等加载远程文件,在php.ini中开启allow_url_include、allow_url_fopen选项。 开启后可以直接执行任意代码。
  • PHP文件包含函数
    1、include():使用此函数,只有代码执行到此函数时才将文件包含进来,发成错误时之警告并继续执行。
    2、include_once():功能与前者一样,区别在于当重复调用同一文件时,程序只调用一次。
    3、require():使用此函数,只要程序执行,立即调用此函数包含文件,发生错误时,会输出错误信息并立即终止程序。
    4、require_once():功能和前者一样,区别在于当重复调用同一文件时,程序只调用一次。
  • 文件包含利用
    1、读取任意敏感文件
    2、远程包含shell
    3、图片上传并包含图片shell
    4、使用为协议
    5、包含日志文件GetShell
    6、截断包含
  • 文件包含危害
    任意文件读取导致敏感信息泄露
    任意代码执行、严重呢个可以写入getshell
  • 文件包含修复方案
    1、禁止远程文件包含allow_url_include=off 关闭高危配置。
    2、配置open_basedir=指定目录,限制访问区域,防止目录遍历。
    3、过滤../等特殊符号、对输入验证和过滤。
    4、修改Apache日志文件的存放地点
    5、开启魔术引号magic_quotes_qpc=on
    6、尽量不使用动态变量调用文件,直接写要包含的文件或动态包含文件设置白名单,只允许读取白名单文件
    7、php版本升级,防止%00截断
    8、设置白名单,只允许包含运行指定文件。
  • 本地文件包含LFI
    1、配合文件上传使用
    当找不到文件上传漏洞,无法上传webshell,可以先上传一个图片格式的webshell到服务器,再利用本地文件包含进行解析。
    2、包含apache日志文件
    对日志文件可读,知道日志文件存储目录,一般情况下日志存储目录会被修改,需要读取服务器配置文件(httpd.conf,nginx.conf)或者根据phpinfo()中的信息来得知
    日志记录的信息都可以被调整,比如记录报错的等级,或者内容格式。在用户发起请求时,服务器会将请求写入access.log,当发生错误时将错误写入error.log。
    3、包含session文件
    找到session内的可控变量,session文件可读写,并且知道存储路径

    4、包含临时文件
  • 远程文件包含RFI
    如果PHP的配置选项allow_url_include、allow_url_fopen状态为ON的话,则include/require函数是可以加载远程文件的,这种漏洞被称为远程文件包含(RFI)
  • 远程文件包含与本地文件包含区别
    本地文件包含只需要找到上传点,把图片木马上传到对方服务器,通过本地包含漏洞直接包含木马脚本就可以运行webshell。
    远程文件包含需要服务器PHP关闭魔术符号、开启远程包含功能才行。
  • 文件包含绕过
    1、%00截断:php小于5.3.4允许使用%00截断
    指定前缀绕过
    2、目录遍历:../../../
    3、编码绕过:url编码、二次编码、容器/服务器编码
    指定后缀绕过
    4、利用协议绕过
    5、数据溢出,超过目录最大长度字节后面数据被丢弃。
  • PHP伪协议

    1、file://协议
    file://[文件的绝对路径和文件名]用于访问本地文件系统,在CTF中通常用来读取本地文件且不受allow_url_include的影响。
    2、php://协议
    php://访问各个输入/输出流(I/O streams),
    php://filter/convert.base64-encode/resource=文件路径 。用于读取源码,并进行base64编码输出allow_url_fopen :off/on allow_url_include:off/on
    php://input用于执行php代码 allow_url_fopen :off/on allow_url_include:on
    3、ZIP://协议
    zip://绝对路径。zlib://、bzip://
    可以访问压缩包里面的文件,当它与包含函数结合时,zip://流会被当作php文件执行。
    要用#分割压缩包和压缩包里面的内容,并且#要用url编码成%23。只需要时zip压缩包即可,后缀名可以任意更改。

    4、data://协议

    5、伪协议利用
posted @ 2025-02-17 14:21  予遂计划  阅读(135)  评论(0)    收藏  举报