源码分析
后端源码路径: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
此时我们可以自主操控filename
的内容,下面我们演示一些在前置知识中提到的常规方法
配合本地敏感文件
这里我们假设同一目录下有一个info.php
,它包含了phpinfo()
函数
phpinfo()函数:显示出 PHP 所有相关信息,包含了 PHP 编译选项、启用的扩展、PHP 版本等等
这里因为文件就在本目录下,我们直接修改文件名即可,可以看到 PHP 的相关信息已经被展示在前端
我们还可以使用../
的方式进行目录穿梭,../
在我们的视角中就是返回上一级文件,这里我们先调整一下info.php
的位置,调整到D:phpstudy_proWWWpikachu-mastervul
,因为调整前和调整后相差两级目录
D:phpstudy_proWWWpikachu-mastervulfileincludeinclude //调整前
D:phpstudy_proWWWpikachu-mastervul //调整后
所以我们使用两次../
,其含义就是上上一级文件夹
常见问题
-
为什么本地文件包含不能使用 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)
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论