【Pikachu 靶场精讲】本地文件包含(file include local)

admin 2023年12月21日09:40:23评论12 views字数 2098阅读6分59秒阅读模式

源码分析

后端源码路径:pikachu-mastervulfileincludefi_local.php

if(isset($_GET['submit']) && $_GET['filename']!=null){
    $filename=$_GET['filename'];
    include "include/$filename";
    }

if(isset($_GET['submit']) && $_GET['filename']!=null)第一段用了 if 语句,判断这一句的两个部分是否都为真:

  • isset($_GET['submit']):检查 GET 请求中是否存在名为 ’submit’ 的参数,isset()函数在 PHP 中用于检查变量是否已设置并且非 NULL
  • $_GET['filename']!=null:检查 GET 请求中名为 ’filename’ 的参数是否非 NULL
  • &&:逻辑运算符,校验前半段和后半段结果是否一致,一致才会返回 Ture

$filename=$_GET['filename'];:如果上述 if 语句的条件为真,这行代码才会执行。它将 GET 请求中名为 ’filename’ 的参数的值赋给变量$filename

include "include/$filename";:也就是我们在前置知识中介绍的include()函数,并指定了一个文件路径(include/$filename)

因为$_GET['filename']参数开发者没有经过严格的过滤,直接带入了include的函数,攻击者可以修改filename的值,执行危险操作

同时,也可以使用严格指定包含的文件名的写法,使得逻辑更为安全

if($filename=='file1.php' || $filename=='file2.php' || $filename=='file3.php' || $filename=='file4.php' || $filename=='file5.php'){

include "include/$filename";
}

Pikachu 靶场实践

打开靶场,随机选择一个文件并提交查询,这里我们查询的是 Kobe bryant,可以观察到 URL 变为

http://127.0.0.21/vul/fileinclude/fi_local.php?filename=file1.php&submit=%E6%8F%90%E4%BA%A4%E6%9F%A5%E8%AF%A2
【Pikachu 靶场精讲】本地文件包含(file include local)
Snipaste_2023-12-09_10-24-13.png

此时我们可以自主操控filename的内容,下面我们演示一些在前置知识中提到的常规方法

配合本地敏感文件

这里我们假设同一目录下有一个info.php,它包含了phpinfo()函数

phpinfo()函数:显示出 PHP 所有相关信息,包含了 PHP 编译选项、启用的扩展、PHP 版本等等

【Pikachu 靶场精讲】本地文件包含(file include local)

这里因为文件就在本目录下,我们直接修改文件名即可,可以看到 PHP 的相关信息已经被展示在前端【Pikachu 靶场精讲】本地文件包含(file include local)

我们还可以使用../的方式进行目录穿梭,../在我们的视角中就是返回上一级文件,这里我们先调整一下info.php的位置,调整到D:phpstudy_proWWWpikachu-mastervul,因为调整前和调整后相差两级目录

D:phpstudy_proWWWpikachu-mastervulfileincludeinclude //调整前
D:phpstudy_proWWWpikachu-mastervul                     //调整后

所以我们使用两次../,其含义就是上上一级文件夹【Pikachu 靶场精讲】本地文件包含(file include local)

常见问题

  1. 为什么本地文件包含不能使用 PHP 伪协议 这里是因为两者后端传参方式不同,和本地还是远程关系不大,这里先贴一下后端的代码再做详细解释
if(isset($_GET['submit']) && $_GET['filename']!=null){
    $filename=$_GET['filename'];
    include "include/$filename"//本地文件上传(fi_local.php)

if(isset($_GET['submit']) && $_GET['filename']!=null){
    $filename=$_GET['filename'];
    include "$filename"//远程文件上传(fi_remote.php)

当使用include "include/$filename";时,PHP 会在 "include" 目录下搜索$filename,这种情况下,如果使用PHP伪协议,它将被解析为一个文件路径的一部分,而不是一个伪协议

相反,当使用include "$filename";时,PHP会在当前目录下搜索$filename,这种情况下,如果$filename是一个 PHP 伪协议,那么 PHP 将正确地解析这个伪协议,并执行相应的操作

原文始发于微信公众号(天禧信安):【Pikachu 靶场精讲】本地文件包含(file include local)

  • 左青龙
  • 微信扫一扫
  • weinxin
  • 右白虎
  • 微信扫一扫
  • weinxin
admin
  • 本文由 发表于 2023年12月21日09:40:23
  • 转载请保留本文链接(CN-SEC中文网:感谢原作者辛苦付出):
                   【Pikachu 靶场精讲】本地文件包含(file include local)https://cn-sec.com/archives/2316683.html

发表评论

匿名网友 填写信息