Рубрики
Uncategorized

Загрузка-файл лаборатории загрузка целевой машины запись прорыва

Автор оригинала: David Wong.

Рекомендуемое использование Windows Построение системы, я использую его первым докер тянет c0ny1/ загрузка -лаборатории Зеркальное изображение в Pacs-03 В случае возникновения проблемы предварительное решение находится в зеркале. php .conf Вызвана ошибка конфигурации файла.

  1. Адрес для загрузки (https://github.com/c0ny1/uplo…)
  2. Windows При сжатии в системе при первом запуске или при каждом изменении каталога целевой среды запустите его modify_path.bat После файла запустите его снова phpStudy.exe Начальная среда.

Пропуск-01

Советы и просмотр исходного кода

Этот пропуск использует JS для проверки незаконных изображений на стороне клиента!

function checkFile() {
    var file = document.getElementsByName('upload_file')[0].value;
    if (file == null || file == "") {
        Alert ("Please select the file to upload!");
        return false;
    }
    // Define file types that allow uploads
    var allow_ext = ".jpg|.png|.gif";
    // Extract the type of uploaded file
    var ext_name = file.substring(file.lastIndexOf("."));
    // Determine whether upload file type is allowed
    if (allow_ext.indexOf(ext_name + "|") == -1) {
        Var errMsg = "This file is not allowed to upload, please upload" + allow_ext + "type of file, the current file type is:" + ext_name;
        alert(errMsg);
        return false;
    }
}

Решение проблем

Интерфейс проверяет, является ли имя суффикса загруженного файла .jpg/.png/.gif Используйте Burp Suite Захват пакетов и изменение имени суффикса загруженных файлов может обойти ограничение имени суффикса на интерфейсе.

Шаги по решению проблем

  • Подготовьтесь к загрузке файла. Содержимое файла является

Назовите файл info.jpg

  • Настройки браузера прокси делает Burp Suite Ты можешь взять сумку. Burp Suite Среда Прокси-сервер--перехват--перехват включен Захватите пакет данных следующим образом:

Измените пакет данных на info.jpg по info.php После выпуска;

  • После доступа к URL-адресу загруженного файла он показывает:

Пропуск-02

Советы и просмотр исходного кода

Этот проход проверяет MIME пакета данных на стороне сервера!

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        if (($_FILES['upload_file']['type'] == 'image/jpeg') || ($_FILES['upload_file']['type'] == 'image/png') || ($_FILES['upload_file']['type'] == 'image/gif')) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' . $_FILES['upload_file']['name']            
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                MSG = upload error! ';
            }
        } else {
            MSG = incorrect file type, please re-upload! ';
        }
    } else {
        The $msg = UPLOAD_PATH.'folder does not exist, please create it manually! ';
    }
}

Решение проблем

Тип MIME файла проверяется и оценивается, то есть тип MIME в данных запроса. Тип содержимого по изображению/jpeg|изображению/png|изображению/gif При перехвате пакета запроса изменение содержимого может обойти ограничение на загрузку. Поскольку суффикс файла после загрузки по-прежнему php Сервер все равно будет загружать файлы в php Синтаксический анализ.

Шаги по решению проблем

  • Загрузить имя файла info2.php
  • Набор для отрыжки Содержимое упаковки выглядит следующим образом:
  • После доступа к URL-адресу загруженного файла он показывает:

Пропуск-03

Советы и просмотр исходного кода

Этот пропуск запрещает загрузку. ASP |. aspx |. PHP |. Файлы суффиксов JSP!

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array('.asp','.aspx','.php','.jsp');
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot ($file_name); // Delete the point at the end of the file name
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower ($file_ext); // Converted to lowercase
        File_ext = str_ireplace (': $DATA',', $file_ext);//String removal: $DATA','', $file_ext)
        $file_ext = trim ($file_ext); // End empty

        if(!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;            
            if (move_uploaded_file($temp_file,$img_path)) {
                 $is_upload = true;
            } else {
                MSG = upload error! ';
            }
        } else {
            MSG ='No uploading of. asp,. aspx,. php,. JSP suffix files is allowed! ';
        }
    } else {
        MSG = UPLOAD_PATH.'The folder does not exist, please create it manually! ';
    }
}

Решение проблем

Решение о занесении в черный список, запрет на загрузку на стороне сервера '.asp','.aspx','.php','.jsp' Могут быть загружены файлы сценариев с суффиксами, например php3, phtml Файл суффикса обходится при условии, что файл конфигурации (C: UsersxxxxxxDesktopupload-labs-envApacheconfhttpd.conf) имеет следующую конфигурацию:

AddType application/x-httpd-php .php .php3 .phtml

Сервер будет php3, phtml Файлы с суффиксами обрабатываться как php Синтаксический анализ.

Шаги по решению проблем

  • Измените имя файла загруженного файла информация 3.php3
  • Посетите сайт после загрузки phpinfo()

Пропуск-04

Советы и просмотр исходного кода

本pass禁止上.. php/|php5/|php4/|php3/|php2/php1/|html/. htm/|phtml/|pHp/|pHp5/|pHp4/|pHp3/|pHp2/pHp1/.Html/.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.файл с суффиксом s WF!

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2","php1",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2","pHp1",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot ($file_name); // Delete the point at the end of the file name
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower ($file_ext); // Converted to lowercase
        File_ext = str_ireplace (': $DATA',', $file_ext);//String removal: $DATA','', $file_ext)
        $file_ext = trim ($file_ext); // End empty

        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                MSG = upload error! ';
            }
        } else {
            MSG ='This file is not allowed to upload!';
        }
    } else {
        MSG = UPLOAD_PATH.'The folder does not exist, please create it manually! ';
    }
}

Решение проблем

Это все еще решение о занесении в черный список, но на этот раз оно более строгое, но оно не включено. .htaccess Уязвимость при анализе загрузки файла. htaccess с помощью Apache может быть использована.

  • .htaccess

.htaccess Файл представляет собой файл конфигурации на сервере Apache, который отвечает за конфигурацию веб-страницы в соответствующих каталогах. принять .htaccess Файлы, может быть достигнуто: перенаправление веб-301, пользовательские страницы ошибок 404, изменение расширения файла, разрешить/заблокировать доступ к определенным пользователям или каталогам, запретить списки каталогов, настроить документы по умолчанию и другие функции Платформа IIS не существует этот файл, файл открыт по умолчанию, включен и закрыт по умолчанию. httpd.conf Конфигурация в файле.

Целевой беспилотник httpd.conf Соответствующая конфигурация:

# AllowOverride controls what directives may be placed in .htaccess files.
# It can be "All", "None", or any combination of the keywords:
#   Options FileInfo AuthConfig Limit
#
AllowOverride All

Потому что мы можем загрузить .htaccess Уязвимости для анализа файлов, чтобы обойти проверку для загрузки веб-оболочки.

Шаги по решению проблем

  • Приготовьтесь 1.htaccess :
AddType application/x-httpd-php .jpg

Заставьте сервер принимать все .jpg Файлы с суффиксами обрабатываются как php Синтаксический анализ файлов

  • загрузить .htaccess :

Набор для отрыжки Содержимое упаковки выглядит следующим образом:

Измените имя файла .htaccess И освободите пакет данных

  • Загрузка файлов info4.jpg :
  • Просмотр файлов:

Пропуск-05

Советы и просмотр исходного кода

本pass禁止上.. php/|php5/|php4/|php3/|php2/php1/|html/. htm/|phtml/|pHp/|pHp5/|pHp4/|pHp3/|pHp2/pHp1/.Html/.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.файл с суффиксом s WF |. htaccess!

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot ($file_name); // Delete the point at the end of the file name
        $file_ext = strrchr($file_name, '.');
        File_ext = str_ireplace (': $DATA',', $file_ext);//String removal: $DATA','', $file_ext)
        $file_ext = trim ($file_ext); // Head and tail empty

        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                MSG = upload error! ';
            }
        } else {
            MSG ='This file type is not allowed to upload! ';
        }
    } else {
        MSG = UPLOAD_PATH.'The folder does not exist, please create it manually! ';
    }
}

Решение проблем

Решение по черному списку .htaccess Но не в исходном коде $file_ext ($file_ext);//Преобразовано в нижний регистр Эту строку кода можно обойти по регистру.

Шаги по решению проблем

Загрузить Имя файла info5.PhP

Пропуск-06

Советы и просмотр исходного кода

本pass禁止上.. php/|php5/|php4/|php3/|php2/php1/|html/. htm/|phtml/|pHp/|pHp5/|pHp4/|pHp3/|pHp2/pHp1/.Html/.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.файл с суффиксом s WF!

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = $_FILES['upload_file']['name'];
        $file_name = deldot ($file_name); // Delete the point at the end of the file name
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower ($file_ext); // Converted to lowercase
        File_ext = str_ireplace (': $DATA',', $file_ext);//String removal: $DATA','', $file_ext)
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file,$img_path)) {
                $is_upload = true;
            } else {
                MSG = upload error! ';
            }
        } else {
            MSG ='This file is not allowed to upload';
        }
    } else {
        MSG = UPLOAD_PATH.'The folder does not exist, please create it manually! ';
    }
}

Решение проблем

Отсутствие исходного кода $file_ext ($file_ext);//И пустой Суффикс имени файла можно обойти, добавив пробелы

Шаги по решению проблем

Загрузить Имя файла info6.php

Пропуск-07

Советы и просмотр исходного кода

Этот пропуск запрещает загрузку всех анализируемых суффиксов!

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower ($file_ext); // Converted to lowercase
        File_ext = str_ireplace (': $DATA',', $file_ext);//String removal: $DATA','', $file_ext)
        $file_ext = trim ($file_ext); // Head and tail empty
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                MSG = upload error! ';
            }
        } else {
            MSG ='This file type is not allowed to upload! ';
        }
    } else {
        MSG = UPLOAD_PATH.'The folder does not exist, please create it manually! ';
    }
}

Решение проблем

Отсутствие исходного кода $имя_файла ($имя_файла);//Удалите точку в конце имени файла Ограничение, суффикс имени файла может быть увеличен . Обход, последнее имя суффикса будет автоматически удалено в системе Windows .

Шаги по решению проблем

Загрузить Имя файла info7.php.

Пропуск-08

Советы и просмотр исходного кода

本pass禁止上.. php/|php5/|php4/|php3/|php2/php1/|html/. htm/|phtml/|pHp/|pHp5/|pHp4/|pHp3/|pHp2/pHp1/.Html/.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx|.cEr|.sWf|.файл с суффиксом s WF |. htaccess!

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot ($file_name); // Delete the point at the end of the file name
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower ($file_ext); // Converted to lowercase
        $file_ext = trim ($file_ext); // Head and tail empty
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.date("YmdHis").rand(1000,9999).$file_ext;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                MSG = upload error! ';
            }
        } else {
            MSG ='This file type is not allowed to upload! ';
        }
    } else {
        MSG = UPLOAD_PATH.'The folder does not exist, please create it manually! ';
    }
}

Решение проблем

Отсутствие исходного кода File_ext (': $DATA',', $file_text);//Удаление строки: $DATA',", $file_ext) Ограничение, суффикс имени файла может быть увеличен ::$DATA обход

  • Особенность файловой системы NTFS под Windows, то есть, когда ДАННЫЕ являются атрибутом потока хранимых данных файловой системы NTFS, это запрос. a.asp Свои собственные данные, если A. ASP также содержит другие потоки данных, такие как a.asp:lake2.asp Запрос a.asp:lake2.asp::$DATA Это просьба. a.asp Данные потока в lake2.asp Содержимое данных потока.

Применение потока файлов NTFS

  • Файловые системы NTFS включают поддержку резервных потоков данных. Это не очень известная функция, в основном включающая обеспечение совместимости файлов с файловой системой Macintosh. Резервные потоки данных позволяют файлам содержать несколько потоков данных. Каждый файл содержит по крайней мере один поток данных. В Windows этот поток данных по умолчанию называется: $DATA

Шаги по решению проблем

Загрузить Имя файла info8.php::$ДАННЫЕ Удалить суффиксы при доступе

Пропуск-09

Советы и просмотр исходного кода

Этот пропуск позволяет загружать файлы только с помощью. суффикс jpg |. png |. gif!

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array(".php",".php5",".php4",".php3",".php2",".html",".htm",".phtml",".pht",".pHp",".pHp5",".pHp4",".pHp3",".pHp2",".Html",".Htm",".pHtml",".jsp",".jspa",".jspx",".jsw",".jsv",".jspf",".jtml",".jSp",".jSpx",".jSpa",".jSw",".jSv",".jSpf",".jHtml",".asp",".aspx",".asa",".asax",".ascx",".ashx",".asmx",".cer",".aSp",".aSpx",".aSa",".aSax",".aScx",".aShx",".aSmx",".cEr",".sWf",".swf",".htaccess");
        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = deldot ($file_name); // Delete the point at the end of the file name
        $file_ext = strrchr($file_name, '.');
        $file_ext = strtolower ($file_ext); // Converted to lowercase
        File_ext = str_ireplace (': $DATA',', $file_ext);//String removal: $DATA','', $file_ext)
        $file_ext = trim ($file_ext); // Head and tail empty
        
        if (!in_array($file_ext, $deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH.'/'.$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                $is_upload = true;
            } else {
                MSG = upload error! ';
            }
        } else {
            MSG ='This file type is not allowed to upload! ';
        }
    } else {
        MSG = UPLOAD_PATH.'The folder does not exist, please create it manually! ';
    }
}

Решение проблем

из $img_path.'/'.$имя_файла; Правила именования URL-адресов для загруженных файлов $имя_файла Прямое сшивание

Шаги по решению проблем

Загрузить Имя файла info9.php.

Пропуск-10

Советы и просмотр исходного кода

本p会文文 本 本 本 本 本 本. php/|php5/|php4/|php3/|php2/php1/|html/. htm/|phtml/|pHp/|pHp5/|pHp4/|pHp3/|pHp2/pHp1/.Html/.Htm|.pHtml|.jsp|.jspa|.jspx|.jsw|.jsv|.jspf|.jtml|.jSp|.jSpx|.jSpa|.jSw|.jSv|.jSpf|.jHtml|.asp|.aspx|.asa|.asax|.ascx|.ashx|.asmx|.cer|.aSp|.aSpx|.aSa|.aSax|.aScx|.aShx|.aSmx| CEr |. sWf |. Символ SWF |. htaccess!

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");

        $file_name = trim($_FILES['upload_file']['name']);
        $file_name = str_ireplace($deny_ext,"", $file_name);
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = UPLOAD_PATH.'/'.$file_name;        
        if (move_uploaded_file($temp_file, $img_path)) {
            $is_upload = true;
        } else {
            MSG = upload error! ';
        }
    } else {
        MSG = UPLOAD_PATH.'The folder does not exist, please create it manually! ';
    }
}

Решение проблем

  • $имя_файла($deny_ext,"", $имя_файла); Имена суффиксов файлов фильтруются только один раз, а имена файлов, записанные дважды, обходятся.

Шаги по решению проблем

Имя загружаемого файла изменено на info 10.pphhpp

Пропуск-11

Советы и просмотр исходного кода

Этот путь загрузки прохода можно контролировать!

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_GET['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            MSG = upload error! ';
        }
    } else{
        MSG = upload only. jpg |. png |. gif file! ";
    }
}

Решение проблем

  • Суффикс для загрузки имен файлов на стороне сервера ограничен
  • $$img_path = $_SET['путь сохранения']."/".rand(10, 99).дата("YmdHis").".".$file_ext; Известно, что правила именования путей загрузки используют пользователей получить Запрошенный путь сохранения Сшивание значений.
  • Рассмотрите возможность использования пути загрузки %00 Обход усечения, но для этого требуются достаточные разрешения для файлов, такие как создание папок и запись имени загруженного файла 1.jpg , путь сохранения Изменить на ../загрузить/1.php%00 И последним сохраняемым файлом будет 1.php

Шаги по решению проблем

  • изменить путь сохранения Значение равно ../загрузка/информация 11.php%00 Загрузка файлов изображений:
  • Посещение http://192.168.30.212//upload/info11.php :

Пропуск-12

Советы и просмотр исходного кода

Этот путь загрузки прохода можно контролировать!

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_ext = substr($_FILES['upload_file']['name'],strrpos($_FILES['upload_file']['name'],".")+1);
    if(in_array($file_ext,$ext_arr)){
        $temp_file = $_FILES['upload_file']['tmp_name'];
        $img_path = $_POST['save_path']."/".rand(10, 99).date("YmdHis").".".$file_ext;

        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            MSG = upload failure;
        }
    } else {
        MSG = upload only. jpg |. png |. gif file! ";
    }
}

Решение проблем

  • $img_path = $_POST['путь сохранения']."/". rand(10, 99).дата("YmdHis").".".$file_ext; и Pass-11 По сравнению с GET В обмен на ПОСТ Ту же идею
  • На этот раз путь сохранения Это через сообщение Входит, продолжается. 00 Необходимо выполнить усечение hex Пересмотр в Китае

Шаги по решению проблем

  • изменить опубликовать В значение параметра добавляется пробел и буква а после php. На самом деле, можно написать все, что угодно. Просто шестнадцатеричная система общего пространства равна 0x20. Лучше помнить, что добавление a позволяет найти положение пространства. Если вы пишете произвольный символ, вы также можете проверить его шестнадцатеричное представление:
  • Откройте шестнадцатеричное и измените шестнадцатеричное содержимое:

До модификации После модификации

  • Доступ к загруженным файлам:

Маршрут:

Посещение http://192.168.30.212/upload/info12.php :

00 Принцип усечения

принцип

Когда система считывает файл (или двоичный файл) по шестнадцатеричному номеру имени файла, если она обнаруживает 0x00 ( ascii Если код равен нулю, вы будете думать, что чтение закончено. Итак, он был загружен. info12.jpg Имена файлов заменяются на info12.php

%00и0х00трансформация

Принцип тот же, но только в Pass-11 Среде для GET Таким образом, сервер декодирует URL-адрес, когда он декодирует его 0x00 , Pass-12 Среда для POST Кстати, шага декодирования URL-адреса нет, поэтому нам нужно изменить шестнадцатеричное значение, чтобы сформировать 0x00 Усечение.

Пропуск-13

Советы и просмотр исходного кода

Этот проход проверяет первые 2 байта содержимого значка!

function getReailFileType($filename){
    $file = fopen($filename, "rb");
    $bin = FREAD ($file, 2); // read-only 2 bytes
    fclose($file);
    $strInfo = @unpack("C2chars", $bin);    
    $typeCode = intval($strInfo['chars1'].$strInfo['chars2']);    
    $fileType = '';    
    switch($typeCode){      
        case 255216:            
            $fileType = 'jpg';
            break;
        case 13780:            
            $fileType = 'png';
            break;        
        case 7173:            
            $fileType = 'gif';
            break;
        default:            
            $fileType = 'unknown';
        }    
        return $fileType;
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_type = getReailFileType($temp_file);

    if($file_type == 'unknown'){
        MSG = file unknown, upload failed! ";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$file_type;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            MSG = upload error! ";
        }
    }
}

Решение проблем

  • Сервер определяет заголовок файла и переименовывает суффикс загруженного файла в обнаруженный тип файла
  • Что касается обнаружения заголовков файлов на стороне сервера, мы можем добавить в начале файла jpg|png|gif Заголовок документа для обхода

От десятичной до шестнадцатеричной: gif Для 4749, png Для 8950, jpg Для FF D8

  • О файле, загруженном и переименованном в файл изображения, не может рассматриваться как php Путем синтаксического анализа мы можем использовать уязвимости включения файлов

Шаги по решению проблем

gif

  • gif Заголовок файла для GIF89a Загрузка файлов info13.php :
GIF89a
  • Доступ к загруженным файлам путем использования уязвимостей включения файлов, http://10.0.0.108/include.php?file=./upload/8820190612142038.gif

png

  • Идентификация заголовка файла (8 байт) 89 504e 470d 0A 1A 0A
  • Доступ К Загруженным Файлам С Использованием Уязвимостей Включения Файлов

JPG

  • Идентификатор заголовка файла (2 байта): ff, D8
  • Доступ К Загруженным Файлам С Использованием Уязвимостей Включения Файлов

Пропуск-14

Советы и просмотр исходного кода

Этот проход использует getimagesize (), чтобы проверить, является ли это файлом изображения!

function isImage($filename){
    $types = '.jpeg|.png|.gif';
    if(file_exists($filename)){
        $info = getimagesize($filename);
        $ext = image_type_to_extension($info[2]);
        if(stripos($types,$ext)>=0){
            return $ext;
        }else{
            return false;
        }
    }else{
        return false;
    }
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $res = isImage($temp_file);
    if(!$res){
        MSG = file unknown, upload failed! ";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").$res;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            MSG = upload error! ";
        }
    }
}

Решение проблем

  • Используйте здесь getimagesize() Проверьте, является ли это файлом изображения:

Функция getimagesize() используется для получения размера изображения и соответствующей информации, успешного возврата массива, возврата ошибки FALSE И получения одного E_WARNING Сообщения об ошибке на уровне 1. Пример:


Возвращает результат:

Array
(
    [0] => 350
    [1] => 318
    [2] => 2
    [3] => width="350" height="318"
    [bits] => 8
    [channels] => 3
    [mime] => image/jpeg
)

Мы использовали индекс [2], учитывая тип изображения, и вернули число, где,,,,,, (порядок байтов intel), (порядок байтов motorola),,,,,,,,.

  • В соответствии с идеей решения предыдущей проблемы измените заголовок для обхода, но проверка этой проблемы выполняется не только в первых двух заголовках.

Шаги по решению проблем

gif

Заголовок файла: GIF89a

png

Шестнадцатеричный заголовок файла: 89 504e 470d 0A 1A 0A

JPG

  • Загружайте обычные изображения в формате jpg, захватывайте пакеты для изменения содержимого пакета, добавляйте в конце файла phpinfo(); ?> phpinfo(); ?>
  • Доступ к загруженным файлам с использованием уязвимостей включения файлов:
  • С первой попытки произошла ошибка:

Предполагается, что содержимое файла может помешать появлению данных PHP-анализа после успешного удаления части загруженного содержимого.

Пропуск-16

Советы и просмотр исходного кода

Этот проход использует exif_imagetype (), чтобы проверить, является ли это файлом изображения!

function isImage($filename){
    // The php_exif module needs to be turned on
    $image_type = exif_imagetype($filename);
    switch ($image_type) {
        case IMAGETYPE_GIF:
            return "gif";
            break;
        case IMAGETYPE_JPEG:
            return "jpg";
            break;
        case IMAGETYPE_PNG:
            return "png";
            break;    
        default:
            return false;
            break;
    }
}

$is_upload = false;
$msg = null;
if(isset($_POST['submit'])){
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $res = isImage($temp_file);
    if(!$res){
        MSG = file unknown, upload failed! ";
    }else{
        $img_path = UPLOAD_PATH."/".rand(10, 99).date("YmdHis").".".$res;
        if(move_uploaded_file($temp_file,$img_path)){
            $is_upload = true;
        } else {
            MSG = upload error! ";
        }
    }
}

Решение проблем

  • exif_imagetype'() Функция-это встроенная функция PHP, используемая для получения типа изображения, той же идеи, обхода заголовка файла

Шаги по решению проблем

с Пропуском-16

Пропуск-16

Советы и просмотр исходного кода

Этот пропуск перерисовывает картинку!

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])){
    // Get basic information about uploaded files, file name, type, size, temporary file path
    $filename = $_FILES['upload_file']['name'];
    $filetype = $_FILES['upload_file']['type'];
    $tmpname = $_FILES['upload_file']['tmp_name'];

    $target_path=UPLOAD_PATH.'/'.basename($filename);

    // Get the extension of the uploaded file
    $fileext= substr(strrchr($filename,"."),1);

    // Judging file suffix and type, uploading operation is legal
    if(($fileext == "jpg") && ($filetype=="image/jpeg")){
        if(move_uploaded_file($tmpname,$target_path)){
            // Use uploaded images to generate new images
            $im = imagecreatefromjpeg($target_path);

            if($im == false){
                MSG = This file is not a JPG format picture! ";
                @unlink($target_path);
            }else{
                // Specify a filename for a new image
                srand(time());
                $newfilename = strval(rand()).".jpg";
                // Display the second rendered image (the new image generated by the user uploading the image)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagejpeg($im,$img_path);
                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            MSG = upload error! ";
        }

    }else if(($fileext == "png") && ($filetype=="image/png")){
        if(move_uploaded_file($tmpname,$target_path)){
            // Use uploaded images to generate new images
            $im = imagecreatefrompng($target_path);

            if($im == false){
                MSG = This file is not a PNG image! ";
                @unlink($target_path);
            }else{
                 // Specify a filename for a new image
                srand(time());
                $newfilename = strval(rand()).".png";
                // Display the second rendered image (the new image generated by the user uploading the image)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagepng($im,$img_path);

                @unlink($target_path);
                $is_upload = true;               
            }
        } else {
            MSG = upload error! ";
        }

    }else if(($fileext == "gif") && ($filetype=="image/gif")){
        if(move_uploaded_file($tmpname,$target_path)){
            // Use uploaded images to generate new images
            $im = imagecreatefromgif($target_path);
            if($im == false){
                MSG = "This file is not a picture in gif format! ";
                @unlink($target_path);
            }else{
                // Specify a filename for a new image
                srand(time());
                $newfilename = strval(rand()).".gif";
                // Display the second rendered image (the new image generated by the user uploading the image)
                $img_path = UPLOAD_PATH.'/'.$newfilename;
                imagegif($im,$img_path);

                @unlink($target_path);
                $is_upload = true;
            }
        } else {
            MSG = upload error! ";
        }
    }else{
        MSG = "Only picture files with the suffix. jpg |. png |. GIF are allowed to be uploaded! ";
    }
}

Решение проблем

  • Передана процедура imagecreatefromjpeg() Функция вызывает библиотеку PHP GD (библиотека GD, которая является библиотекой расширений PHP для обработки графики) и преобразует изображения.
  • Загрузите обычно отображаемое изображение на сервер. После загрузки отрисованного изображения сравните его с исходным изображением, вставьте код веб-оболочки в тот же блок данных и загрузите его.
  • Специальные методы загрузки для удаленного выполнения кода в обход преобразования изображений PHP
  • Решение Для Большого Парня: https://xz.aliyun.com/t/2657

Шаги по решению проблем

http://www.secgeek.net/POC/PO… Загружайте изображения по ссылкам

Пропуск-17

Советы и просмотр исходного кода

Нужен аудит кода!

$is_upload = false;
$msg = null;

if(isset($_POST['submit'])){
    $ext_arr = array('jpg','png','gif');
    $file_name = $_FILES['upload_file']['name'];
    $temp_file = $_FILES['upload_file']['tmp_name'];
    $file_ext = substr($file_name,strrpos($file_name,".")+1);
    $upload_file = UPLOAD_PATH . '/' . $file_name;

    if(move_uploaded_file($temp_file, $upload_file)){
        if(in_array($file_ext,$ext_arr)){
             $img_path = UPLOAD_PATH . '/'. rand(10, 99).date("YmdHis").".".$file_ext;
             rename($upload_file, $img_path);
             $is_upload = true;
        }else{
            MSG = upload only. jpg |. png |. gif file! ";
            unlink($upload_file);
        }
    }else{
        MSG = upload error! ';
    }
}

Решение проблем

  • Функция unlink() удаляет файлы.
  • Здесь сначала сохраните файл на сервере, а затем определите имя суффикса, если имя суффикса недопустимо, удалите файл
  • С помощью условной конкуренции разблокируйте Перед тем, как получить доступ к загруженному файлу.
  • Устраните разницу во времени файлов с помощью условной конкуренции.

Шаги по решению проблем

  • Набор отрыжки ловит загрузки info17.php Пакеты файлов, воспроизводимые в больших количествах

Настройки нарушителя:

  • Затем он постоянно обращается к браузеру и обнаруживает, что загруженные файлы могут быть доступны через конкуренцию:

Пропуск-18

Советы и просмотр исходного кода

Нужен аудит кода!

//index.php
$is_upload = false;
$msg = null;
if (isset($_POST['submit']))
{
    require_once("./myupload.php");
    $imgFileName =time();
    $u = new MyUpload($_FILES['upload_file']['name'], $_FILES['upload_file']['tmp_name'], $_FILES['upload_file']['size'],$imgFileName);
    $status_code = $u->upload(UPLOAD_PATH);
    switch ($status_code) {
        case 1:
            $is_upload = true;
            $img_path = $u->cls_upload_dir . $u->cls_file_rename_to;
            break;
        case 2:
            The $msg = file has been uploaded, but it has not been renamed. ';
            break; 
        case -1:
            MSG ='This file cannot be uploaded to the server's temporary file storage directory. ';
            break; 
        case -2:
            MSG = upload failed, upload directory is not writable. ';
            break; 
        case -3:
            MSG = failed to upload, unable to upload this type of file. ';
            break; 
        case -4:
            MSG = failed to upload, the uploaded file is too large. ';
            break; 
        case -5:
            MSG = failed to upload, the server already has the same name file. ';
            break; 
        case -6:
            $msg = file cannot be uploaded, file cannot be copied to the target directory. ';
            break;      
        default:
            MSG = unknown error! ';
            break;
    }
}

//myupload.php
class MyUpload{
......
......
...... 
  var $cls_arr_ext_accepted = array(
      ".doc", ".xls", ".txt", ".pdf", ".gif", ".jpg", ".zip", ".rar", ".7z",".ppt",
      ".html", ".xml", ".tiff", ".jpeg", ".png" );

......
......
......  
  /** upload()
   **
   ** Method to upload the file.
   ** This is the only method to call outside the class.
   ** @para String name of directory we upload to
   ** @returns void
  **/
  function upload( $dir ){
    
    $ret = $this->isUploadedFile();
    
    if( $ret != 1 ){
      return $this->resultUpload( $ret );
    }

    $ret = $this->setDir( $dir );
    if( $ret != 1 ){
      return $this->resultUpload( $ret );
    }

    $ret = $this->checkExtension();
    if( $ret != 1 ){
      return $this->resultUpload( $ret );
    }

    $ret = $this->checkSize();
    if( $ret != 1 ){
      return $this->resultUpload( $ret );    
    }
    
    // if flag to check if the file exists is set to 1
    
    if( $this->cls_file_exists == 1 ){
      
      $ret = $this->checkFileExists();
      if( $ret != 1 ){
        return $this->resultUpload( $ret );    
      }
    }

    // if we are here, we are ready to move the file to destination

    $ret = $this->move();
    if( $ret != 1 ){
      return $this->resultUpload( $ret );    
    }

    // check if we need to rename the file

    if( $this->cls_rename_file == 1 ){
      $ret = $this->renameFile();
      if( $ret != 1 ){
        return $this->resultUpload( $ret );    
      }
    }
    
    // if we are here, everything worked as planned :)

    return $this->resultUpload( "SUCCESS" );
  
  }
......
......
...... 
};

Код, отображаемый на веб-странице, не является полным!!! Нужно идти WWW Просмотр в папках

Решение проблем

  • Имя файла с суффиксом указывается в белом списке, а затем проверяется размер файла, наличие файла и так далее.
  • После загрузки файла переименование файла также имеет лазейку условной конкуренции.
  function renameFile(){

    // if no new name was provided, we use

    if( $this->cls_file_rename_to == '' ){

      $allchar = "abcdefghijklnmopqrstuvwxyz" ; 
      $this->cls_file_rename_to = "" ; 
      mt_srand (( double) microtime() * 1000000 ); 
      for ( $i = 0; $i<8 ; $i++ ){
        $this->cls_file_rename_to .= substr( $allchar, mt_rand (0,25), 1 ) ; 
      }
    }    
    
    // Remove the extension and put it back on the new file name
        
    $extension = strrchr( $this->cls_filename, "." );
    $this->cls_file_rename_to .= $extension;
    
    if( !rename( $this->cls_upload_dir . $this->cls_filename, $this->cls_upload_dir . $this->cls_file_rename_to )){
      return "RENAME_FAILURE";
    } else {
      return 1;
    }
  }

Начальные правила именования файлов $this->cls_upload_dir . $this->cls_filename Правила переименования $this->cls_upload_dir . $this->class_file_rename_to Условная конкуренция возникает, когда требуется переименовать большое количество файлов

  • Перед переименованием операция перемещения один раз сохранила файл, а переименование изменило имя файла один раз.
  • Отрыжка используется для непрерывной отправки данных загруженной лошади с изображением. Из-за конкуренции условий, программа будет меньше, чем проблема переименования, поэтому загрузка будет успешной.
  • Просмотр конфигурации mime.типы Вот запись о том, что может быть Apache Атрибуты файлов, идентифицированные сервером:
#application/x-7z-compressed            7z

7z Суффиксы не идентифицируются сервером |/Apache , но в белом списке загруженных суффиксов имен файлов можно использовать уязвимость |/Apache для синтаксического анализа Загрузки 7z файла с суффиксами в качестве php Синтаксического анализа файлов.

Уязвимость для синтаксического анализа Apache

Apache Когда сервер анализирует файлы с именами файлов с несколькими суффиксами, он определяет суффиксы от начала до конца, пока не сможет их проанализировать.

Шаги по решению проблем

  • Метод выдачи безостановочного контракта такой же, как и выше.
  • Обратите внимание на имя загруженной папки в папке:
  • К файлу также можно непрерывно обращаться в соответствии с правилами именования в исходном коде, пока не будет возвращен результат:

Пропуск-19

Советы и просмотр исходного кода

Имя файла этого пропуска получено с помощью $_POST.

$is_upload = false;
$msg = null;
if (isset($_POST['submit'])) {
    if (file_exists(UPLOAD_PATH)) {
        $deny_ext = array("php","php5","php4","php3","php2","html","htm","phtml","pht","jsp","jspa","jspx","jsw","jsv","jspf","jtml","asp","aspx","asa","asax","ascx","ashx","asmx","cer","swf","htaccess");

        $file_name = $_POST['save_name'];
        $file_ext = pathinfo($file_name,PATHINFO_EXTENSION);

        if(!in_array($file_ext,$deny_ext)) {
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' .$file_name;
            if (move_uploaded_file($temp_file, $img_path)) { 
                $is_upload = true;
            }else{
                MSG = upload error! ';
            }
        }else{
            $msg ='Do not save as this type of file! ';
        }

    } else {
        MSG = UPLOAD_PATH.'The folder does not exist, please create it manually! ';
    }
}

Решение проблем

  • Политика черного Списка, Имя Файла, Контролируемое Пользователем, Именование файлов upload-19.php. обход

Шаги по решению проблем

Пропуск-20

Советы и просмотр исходного кода

Пропуск-20 приходит от CTF, пожалуйста, проверьте код!

$is_upload = false;
$msg = null;
if(!empty($_FILES['upload_file'])){
    // check MIME
    $allow_type = array('image/jpeg','image/png','image/gif');
    if(!in_array($_FILES['upload_file']['type'],$allow_type)){
        MSG = No uploading of this type of file!
    }else{
        // Check file name
        $file = empty($_POST['save_name']) ? $_FILES['upload_file']['name'] : $_POST['save_name'];
        if (!is_array($file)) {
            $file = explode('.', strtolower($file));
        }

        $ext = end($file);
        $allow_suffix = array('jpg','png','gif');
        if (!in_array($ext, $allow_suffix)) {
            MSG = No uploading of the suffix file!
        }else{
            $file_name = reset($file) . '.' . $file[count($file) - 1];
            $temp_file = $_FILES['upload_file']['tmp_name'];
            $img_path = UPLOAD_PATH . '/' .$file_name;
            if (move_uploaded_file($temp_file, $img_path)) {
                MSG = file upload success! ";
                $is_upload = true;
            } else {
                MSG = file upload failed! ";
            }
        }
    }
}else{
    MSG = Please select the file to upload! ";
}

Решение проблем

  • Правила именования файлов: $имя_файла($файл) . '.' . $файл[количество($файл) - 1];
  • reset() Наведите внутренний указатель на первый элемент массива и выведите данные.
  • end() Наведите внутренний указатель на последний элемент массива и выведите результат.
  • $файл($_POST['имя сохранения']) ? $_FILES['upload_file']['имя']: $_POST['имя сохранения']; Если имя сохранения Не пусто файл по имя сохранения В противном случае файл по имя файла
  • если (!is_array($файл)) Судите, если файл Сгруппирован по’. “вместо массивов
  • Правила именования имен файлов $имя_файла($файл) . '.' . $файл[количество($файл) - 1];
  • Мы ПУБЛИКУЕМ Введение одного имя сохранения Список: ['info20.php', ", 'jpg'] В настоящее время пусто($_POST['имя сохранения']) Ложно файл по имя сохранения Следовательно, $ext($файл); по jpg Вы можете судить по имени суффикса (последний элемент в конце суждения) jpg Всплывающее окно), а окончательное имя файла собирается как upload20.php.

Шаги по решению проблем

  • Загрузите пакетные данные следующим образом:
  • Посещать: