Рекомендуемое использование Windows Построение системы, я использую его первым докер тянет c0ny1/ загрузка -лаборатории Зеркальное изображение в Pacs-03 В случае возникновения проблемы предварительное решение находится в зеркале. php .conf Вызвана ошибка конфигурации файла.
- Адрес для загрузки (https://github.com/c0ny1/uplo…)
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.
Шаги по решению проблем
- Загрузите пакетные данные следующим образом:
- Посещать: