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
和/tmp
call_user_func($func,$_GET);
回调函数名和参数都可控,$_SESSION['name']
可控
通过回调extract($file)
,覆盖掉$file = 'function.php'
,即可控制$file
,进行文件包含
/index.php?function=extract&file=php://filter/convert.base64-encode/resource=function.php
function.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