简单一句话就是
在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
脑筋急转弯一样的题目,不过也涉及了一些不容易注意到的知识点

Categories: 技术

0 Comments

发表评论

Avatar placeholder

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