简单一句话就是
在allow_url_include=Off时
file_get_contents在处理data:,xxxxxx时会直接取xxxxxx(昨天做的那个题用到了)
而include会包含文件名为data:,xxxxxx的文件
玄学操作 确实有点骚
刚才看到的题目就是这样的

 <?php
    stream_wrapper_unregister('php');
    if(isset($_GET['hl'])) highlight_file(__FILE__);

    $mkdir = function($dir) {
        system('mkdir -- '.escapeshellarg($dir));
    };
    $randFolder = bin2hex(random_bytes(16));
    $mkdir('users/'.$randFolder);
    chdir('users/'.$randFolder);

    $userFolder = (isset($_SERVER['HTTP_X_FORWARDED_FOR']) ? $_SERVER['HTTP_X_FORWARDED_FOR'] : $_SERVER['REMOTE_ADDR']);
    $userFolder = basename(str_replace(['.','-'],['',''],$userFolder));

    $mkdir($userFolder);
    chdir($userFolder);
    file_put_contents('profile',print_r($_SERVER,true));
    chdir('..');
    $_GET['page']=str_replace('.','',$_GET['page']);
    if(!stripos(file_get_contents($_GET['page']),'<?') && !stripos(file_get_contents($_GET['page']),'php')) {
        include($_GET['page']);
    }

    chdir(__DIR__);
    system('rm -rf users/'.$randFolder);

?> 

我们有一个可控的文件夹名
(注意,这里新建文件夹是自己写了一个调用系统命令的函数,因为php原生的mkdir是不允许接收data协议的,这也是我说偏门的原因,这苛刻的利用条件显然是会被厂商标成无危害的)
根据上面的思路,我们可以新建一个名为data:,xx的文件夹,这样在file_get_contents处理data:,xx/profile时会把这个当作伪协议,而include会把它当成单纯的路径,从而包含数据getshell
脑筋急转弯一样的题目,不过也涉及了一些不容易注意到的知识点

分类: 技术

0 条评论

发表评论

邮箱地址不会被公开。 必填项已用*标注